/ Hex Artifact Content
Login

Artifact da5ecd9880f2d19d5e77fe48b722577494dd3290:


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 32 39 35 20 32 30 30 35 2f 30 31 2f 31 39  1.295 2005/01/19
02f0: 20 32 33 3a 32 34 3a 35 30 20 64 72 68 20 45 78   23:24:50 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 0a 20 20 2f 2a 20 42 65 67  eturn;..  /* Beg
0620: 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67  in by generating
0630: 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f   some terminatio
0640: 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e  n code at the en
0650: 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64  d of the.  ** vd
0660: 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a  be program.  */.
0670: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
0680: 62 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  b;.  v = sqlite3
0690: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
06a0: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
06b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
06c0: 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 30 2c 20  (v, OP_Halt, 0, 
06d0: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  0);..    /* The 
06e0: 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63 6f 6e 74  cookie mask cont
06f0: 61 69 6e 73 20 6f 6e 65 20 62 69 74 20 66 6f 72  ains one bit for
0700: 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
0710: 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a  ile open..    **
0720: 20 28 42 69 74 20 30 20 69 73 20 66 6f 72 20 6d   (Bit 0 is for m
0730: 61 69 6e 2c 20 62 69 74 20 31 20 69 73 20 66 6f  ain, bit 1 is fo
0740: 72 20 74 65 6d 70 2c 20 61 6e 64 20 73 6f 20 66  r temp, and so f
0750: 6f 72 74 68 2e 29 20 20 42 69 74 73 20 61 72 65  orth.)  Bits are
0760: 0a 20 20 20 20 2a 2a 20 73 65 74 20 66 6f 72 20  .    ** set for 
0770: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 74 68  each database th
0780: 61 74 20 69 73 20 75 73 65 64 2e 20 20 47 65 6e  at is used.  Gen
0790: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 74  erate code to st
07a0: 61 72 74 20 61 0a 20 20 20 20 2a 2a 20 74 72 61  art a.    ** tra
07b0: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65 61 63 68  nsaction on each
07c0: 20 75 73 65 64 20 64 61 74 61 62 61 73 65 20 61   used database a
07d0: 6e 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 65  nd to verify the
07e0: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 20   schema cookie. 
07f0: 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68 20 75 73     ** on each us
0800: 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  ed database..   
0810: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72   */.    if( pPar
0820: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3e 30  se->cookieGoto>0
0830: 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20 6d 61   ){.      u32 ma
0840: 73 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 44  sk;.      int iD
0850: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
0860: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
0870: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
0880: 74 6f 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62  to-1, sqlite3Vdb
0890: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
08a0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d  ;.      for(iDb=
08b0: 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64  0, mask=1; iDb<d
08c0: 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31  b->nDb; mask<<=1
08d0: 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20  , iDb++){.      
08e0: 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50    if( (mask & pP
08f0: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
0900: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
0910: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
0920: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
0930: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62  Transaction, iDb
0940: 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65  , (mask & pParse
0950: 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29  ->writeMask)!=0)
0960: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
0970: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
0980: 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69  _VerifyCookie, i
0990: 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  Db, pParse->cook
09a0: 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b 0a 20  ieValue[iDb]);. 
09b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
09c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
09d0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61   OP_Goto, 0, pPa
09e0: 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29  rse->cookieGoto)
09f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
0a00: 41 64 64 20 61 20 4e 6f 2d 6f 70 20 74 68 61 74  Add a No-op that
0a10: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f   contains the co
0a20: 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
0a30: 68 65 20 63 6f 6d 70 69 6c 65 64 20 53 51 4c 0a  he compiled SQL.
0a40: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
0a50: 20 61 73 20 69 74 73 20 50 33 20 61 72 67 75 6d   as its P3 argum
0a60: 65 6e 74 2e 20 20 54 68 69 73 20 64 6f 65 73 20  ent.  This does 
0a70: 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 66  not change the f
0a80: 75 6e 63 74 69 6f 6e 61 6c 69 74 79 0a 20 20 20  unctionality.   
0a90: 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 6f 67 72   ** of the progr
0aa0: 61 6d 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  am. .    **.    
0ab0: 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20  ** This is used 
0ac0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c  to implement sql
0ad0: 69 74 65 33 5f 74 72 61 63 65 28 29 2e 0a 20 20  ite3_trace()..  
0ae0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
0af0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  VdbeOp3(v, OP_No
0b00: 6f 70 2c 20 30 2c 20 30 2c 20 70 50 61 72 73 65  op, 0, 0, pParse
0b10: 2d 3e 7a 53 71 6c 2c 20 70 50 61 72 73 65 2d 3e  ->zSql, pParse->
0b20: 7a 54 61 69 6c 2d 70 50 61 72 73 65 2d 3e 7a 53  zTail-pParse->zS
0b30: 71 6c 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  ql);.  }...  /* 
0b40: 47 65 74 20 74 68 65 20 56 44 42 45 20 70 72 6f  Get the VDBE pro
0b50: 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65  gram ready for e
0b60: 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20  xecution.  */.  
0b70: 69 66 28 20 76 20 26 26 20 70 50 61 72 73 65 2d  if( v && pParse-
0b80: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
0b90: 46 49 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64  FILE *trace = (d
0ba0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
0bb0: 45 5f 56 64 62 65 54 72 61 63 65 29 21 3d 30 20  E_VdbeTrace)!=0 
0bc0: 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20  ? stdout : 0;.  
0bd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61    sqlite3VdbeTra
0be0: 63 65 28 76 2c 20 74 72 61 63 65 29 3b 0a 20 20  ce(v, trace);.  
0bf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b    sqlite3VdbeMak
0c00: 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73 65  eReady(v, pParse
0c10: 2d 3e 6e 56 61 72 2c 20 70 50 61 72 73 65 2d 3e  ->nVar, pParse->
0c20: 6e 4d 65 6d 2b 33 2c 0a 20 20 20 20 20 20 20 20  nMem+3,.        
0c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c40: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 33 2c   pParse->nTab+3,
0c50: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
0c60: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  );.    pParse->r
0c70: 63 20 3d 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  c = pParse->nErr
0c80: 20 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20   ? SQLITE_ERROR 
0c90: 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  : SQLITE_DONE;. 
0ca0: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
0cb0: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  mesSet = 0;.  }e
0cc0: 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e  lse if( pParse->
0cd0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
0ce0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
0cf0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
0d00: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54    }.  pParse->nT
0d10: 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ab = 0;.  pParse
0d20: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50  ->nMem = 0;.  pP
0d30: 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a  arse->nSet = 0;.
0d40: 20 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d    pParse->nAgg =
0d50: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56   0;.  pParse->nV
0d60: 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ar = 0;.  pParse
0d70: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30  ->cookieMask = 0
0d80: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  ;.  pParse->cook
0d90: 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f  ieGoto = 0;.}../
0da0: 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70 61 72  *.** Run the par
0db0: 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ser and code gen
0dc0: 65 72 61 74 6f 72 20 72 65 63 75 72 73 69 76 65  erator recursive
0dd0: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ly in order to g
0de0: 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20  enerate.** code 
0df0: 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74 61 74  for the SQL stat
0e00: 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f  ement given onto
0e10: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
0e20: 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a  pParse context.*
0e30: 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
0e40: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
0e50: 20 57 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   When the parser
0e60: 20 69 73 20 72 75 6e 20 72 65 63 75 72 73 69 76   is run recursiv
0e70: 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c  ely.** this way,
0e80: 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61   the final OP_Ha
0e90: 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65 6e 64  lt is not append
0ea0: 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e 69  ed and other ini
0eb0: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61  tialization.** a
0ec0: 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  nd finalization 
0ed0: 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74 74 65  steps are omitte
0ee0: 64 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20  d because those 
0ef0: 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62 79 20  are handling by 
0f00: 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74  the.** outermost
0f10: 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e   parser..**.** N
0f20: 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  ot everything is
0f30: 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68 69 73   nestable.  This
0f40: 20 66 61 63 69 6c 69 74 79 20 69 73 20 64 65 73   facility is des
0f50: 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69 74 0a  igned to permit.
0f60: 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  ** INSERT, UPDAT
0f70: 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70  E, and DELETE op
0f80: 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e 73 74  erations against
0f90: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20   SQLITE_MASTER. 
0fa0: 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69 66 20   Use.** care if 
0fb0: 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20 74 72  you decide to tr
0fc0: 79 20 74 6f 20 75 73 65 20 74 68 69 73 20 72 6f  y to use this ro
0fd0: 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f  utine for some o
0fe0: 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a  ther purposes..*
0ff0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 65  /.void sqlite3Ne
1000: 73 74 65 64 50 61 72 73 65 28 50 61 72 73 65 20  stedParse(Parse 
1010: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
1020: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
1030: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
1040: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
1050: 20 20 69 6e 74 20 72 63 3b 0a 23 20 64 65 66 69    int rc;.# defi
1060: 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69 7a  ne SAVE_SZ  (siz
1070: 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66 66  eof(Parse) - off
1080: 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61 72  setof(Parse,nVar
1090: 29 29 0a 20 20 63 68 61 72 20 73 61 76 65 42 75  )).  char saveBu
10a0: 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69  f[SAVE_SZ];..  i
10b0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
10c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
10d0: 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  rt( pParse->nest
10e0: 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73  ed<10 );  /* Nes
10f0: 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  ting should only
1100: 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20 64   be of limited d
1110: 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61  epth */.  va_sta
1120: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
1130: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
1140: 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72 6d 61  3VMPrintf(zForma
1150: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
1160: 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  (ap);.  if( zSql
1170: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1180: 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  n;   /* A malloc
1190: 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
11a0: 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73  d */.  }.  pPars
11b0: 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d  e->nested++;.  m
11c0: 65 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20 26  emcpy(saveBuf, &
11d0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41  pParse->nVar, SA
11e0: 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74  VE_SZ);.  memset
11f0: 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  (&pParse->nVar, 
1200: 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 72  0, SAVE_SZ);.  r
1210: 63 20 3d 20 73 71 6c 69 74 65 33 52 75 6e 50 61  c = sqlite3RunPa
1220: 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71  rser(pParse, zSq
1230: 6c 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 46  l, 0);.  sqliteF
1240: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d  ree(zSql);.  mem
1250: 63 70 79 28 26 70 50 61 72 73 65 2d 3e 6e 56 61  cpy(&pParse->nVa
1260: 72 2c 20 73 61 76 65 42 75 66 2c 20 53 41 56 45  r, saveBuf, SAVE
1270: 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  _SZ);.  pParse->
1280: 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a  nested--;.}../*.
1290: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
12a0: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
12b0: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
12c0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
12d0: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
12e0: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
12f0: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
1300: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
1310: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
1320: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
1330: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
1340: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
1350: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
1360: 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73   If zDatabase is
1370: 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65   0, all database
1380: 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66  s are searched f
1390: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  or the table and
13a0: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61   the.** first ma
13b0: 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20  tching table is 
13c0: 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63  returned.  (No c
13d0: 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c  hecking for dupl
13e0: 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e  icate table.** n
13f0: 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20  ames is done.)  
1400: 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72  The search order
1410: 20 69 73 20 54 45 4d 50 20 66 69 72 73 74 2c 20   is TEMP first, 
1420: 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20  then MAIN, then 
1430: 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79  any.** auxiliary
1440: 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64   databases added
1450: 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43   using the ATTAC
1460: 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  H command..**.**
1470: 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
1480: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a  3LocateTable()..
1490: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
14a0: 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74  3FindTable(sqlit
14b0: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
14c0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
14d0: 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65   char *zDatabase
14e0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  ){.  Table *p = 
14f0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  0;.  int i;.  as
1500: 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29  sert( zName!=0 )
1510: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 64 62 2d  ;.  assert( (db-
1520: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1530: 49 6e 69 74 69 61 6c 69 7a 65 64 29 20 7c 7c 20  Initialized) || 
1540: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
1550: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
1560: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
1570: 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f   int j = (i<2) ?
1580: 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53   i^1 : i;   /* S
1590: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
15a0: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66  e MAIN */.    if
15b0: 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26  ( zDatabase!=0 &
15c0: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
15d0: 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e  (zDatabase, db->
15e0: 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20  aDb[j].zName) ) 
15f0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20  continue;.    p 
1600: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
1610: 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62  d(&db->aDb[j].tb
1620: 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74  lHash, zName, st
1630: 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a  rlen(zName)+1);.
1640: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
1650: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
1660: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
1670: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
1680: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1690: 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74  describes a part
16a0: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a  icular database.
16b0: 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  ** table given t
16c0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
16d0: 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f  table and (optio
16e0: 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20  nally) the name 
16f0: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
1700: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
1710: 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
1720: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
1730: 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20  nd.  Also leave 
1740: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73  an.** error mess
1750: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
1760: 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
1770: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
1780: 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
1790: 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  e and sqlite3Fin
17a0: 64 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74  dTable() is that
17b0: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
17c0: 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72   leaves an error
17d0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
17e0: 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72  se->zErrMsg wher
17f0: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64  e.** sqlite3Find
1800: 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74  Table() does not
1810: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
1820: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 50  te3LocateTable(P
1830: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
1840: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1850: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1860: 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ase){.  Table *p
1870: 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
1880: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
1890: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
18a0: 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
18b0: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
18c0: 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
18d0: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
18e0: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
18f0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
1900: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
1910: 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
1920: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20  n 0;.  }..  p = 
1930: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
1940: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
1950: 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69  me, zDbase);.  i
1960: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69  f( p==0 ){.    i
1970: 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20 20 20  f( zDbase ){.   
1980: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1990: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
19a0: 75 63 68 20 74 61 62 6c 65 3a 20 25 73 2e 25 73  uch table: %s.%s
19b0: 22 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65  ", zDbase, zName
19c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
19d0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
19e0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e  e(pParse->db, zN
19f0: 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20  ame, 0)!=0 ){.  
1a00: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1a10: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
1a20: 6c 65 20 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74  le \"%s\" is not
1a30: 20 69 6e 20 64 61 74 61 62 61 73 65 20 5c 22 25   in database \"%
1a40: 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 7a  s\"",.         z
1a50: 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20  Name, zDbase);. 
1a60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a70: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1a80: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1a90: 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 4e 61   table: %s", zNa
1aa0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
1ab0: 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
1ac0: 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ma = 1;.  }.  re
1ad0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1ae0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
1af0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
1b00: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a  that describes .
1b10: 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ** a particular 
1b20: 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20  index given the 
1b30: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64  name of that ind
1b40: 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61  ex.** and the na
1b50: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1b60: 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  se that contains
1b70: 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52   the index..** R
1b80: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
1b90: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
1ba0: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
1bb0: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
1bc0: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
1bd0: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e   the.** table an
1be0: 64 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  d the first matc
1bf0: 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65  hing index is re
1c00: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
1c10: 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70  cking.** for dup
1c20: 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d  licate index nam
1c30: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
1c40: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
1c50: 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c  s.** TEMP first,
1c60: 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e   then MAIN, then
1c70: 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64   any auxiliary d
1c80: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a  atabases added.*
1c90: 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41  * using the ATTA
1ca0: 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49  CH command..*/.I
1cb0: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e  ndex *sqlite3Fin
1cc0: 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  dIndex(sqlite3 *
1cd0: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
1ce0: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
1cf0: 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78  r *zDb){.  Index
1d00: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
1d10: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 64 62 2d  ;.  assert( (db-
1d20: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1d30: 49 6e 69 74 69 61 6c 69 7a 65 64 29 20 7c 7c 20  Initialized) || 
1d40: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
1d50: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
1d60: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
1d70: 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f   int j = (i<2) ?
1d80: 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65   i^1 : i;  /* Se
1d90: 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65  arch TEMP before
1da0: 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28   MAIN */.    if(
1db0: 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53   zDb && sqlite3S
1dc0: 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e  trICmp(zDb, db->
1dd0: 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20  aDb[j].zName) ) 
1de0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20  continue;.    p 
1df0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
1e00: 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 69 64  d(&db->aDb[j].id
1e10: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74  xHash, zName, st
1e20: 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a  rlen(zName)+1);.
1e30: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
1e40: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
1e50: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c  p;.}../*.** Recl
1e60: 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75  aim the memory u
1e70: 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a  sed by an index.
1e80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1e90: 72 65 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  reeIndex(Index *
1ea0: 70 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  p){.  sqliteFree
1eb0: 28 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  (p->zColAff);.  
1ec0: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
1ed0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
1ee0: 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66  he given index f
1ef0: 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61  rom the index ha
1f00: 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20 66 72  sh table, and fr
1f10: 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79  ee.** its memory
1f20: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a   structures..**.
1f30: 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  ** The index is 
1f40: 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
1f50: 20 64 61 74 61 62 61 73 65 20 68 61 73 68 20 74   database hash t
1f60: 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69 74 20  ables but.** it 
1f70: 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20  is not unlinked 
1f80: 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 74  from the Table t
1f90: 68 61 74 20 69 74 20 69 6e 64 65 78 65 73 2e 0a  hat it indexes..
1fa0: 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f  ** Unlinking fro
1fb0: 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75 73 74  m the Table must
1fc0: 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68 65 20   be done by the 
1fd0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1fe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ff0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64   sqliteDeleteInd
2000: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
2010: 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64  Index *p){.  Ind
2020: 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20 20 61 73 73  ex *pOld;..  ass
2030: 65 72 74 28 20 64 62 21 3d 30 20 26 26 20 70 2d  ert( db!=0 && p-
2040: 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  >zName!=0 );.  p
2050: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
2060: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
2070: 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68  [p->iDb].idxHash
2080: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  , p->zName,.    
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 20 20 20 20 20 20 73 74 72 6c 65 6e 28 70 2d 3e        strlen(p->
20b0: 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20  zName)+1, 0);.  
20c0: 69 66 28 20 70 4f 6c 64 21 3d 30 20 26 26 20 70  if( pOld!=0 && p
20d0: 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20 73 71  Old!=p ){.    sq
20e0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
20f0: 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d  &db->aDb[p->iDb]
2100: 2e 69 64 78 48 61 73 68 2c 20 70 4f 6c 64 2d 3e  .idxHash, pOld->
2110: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
2120: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 6c              strl
2130: 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b  en(pOld->zName)+
2140: 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a 20 20  1, pOld);.  }.  
2150: 66 72 65 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a  freeIndex(p);.}.
2160: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68  ./*.** Unlink th
2170: 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72  e given index fr
2180: 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c 20 74 68  om its table, th
2190: 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20 74 68 65  en remove.** the
21a0: 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20   index from the 
21b0: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
21c0: 20 61 6e 64 20 66 72 65 65 20 69 74 73 20 6d 65   and free its me
21d0: 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63 74 75 72  mory.** structur
21e0: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
21f0: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
2200: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  teIndex(sqlite3 
2210: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
2220: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61  nst char *zIdxNa
2230: 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  me){.  Index *pI
2240: 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b  ndex;.  int len;
2250: 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  ..  len = strlen
2260: 28 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49  (zIdxName);.  pI
2270: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 48 61  ndex = sqlite3Ha
2280: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
2290: 62 5b 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20  b[iDb].idxHash, 
22a0: 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31 2c  zIdxName, len+1,
22b0: 20 30 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65   0);.  if( pInde
22c0: 78 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e  x ){.    if( pIn
22d0: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
22e0: 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20  dex==pIndex ){. 
22f0: 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61       pIndex->pTa
2300: 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  ble->pIndex = pI
2310: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
2320: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
2330: 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f  dex *p;.      fo
2340: 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62  r(p=pIndex->pTab
2350: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26  le->pIndex; p &&
2360: 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65   p->pNext!=pInde
2370: 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d  x; p=p->pNext){}
2380: 0a 20 20 20 20 20 20 69 66 28 20 70 20 26 26 20  .      if( p && 
2390: 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78  p->pNext==pIndex
23a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   ){.        p->p
23b0: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
23c0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
23d0: 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65    }.    freeInde
23e0: 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20  x(pIndex);.  }. 
23f0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
2400: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
2410: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  es;.}../*.** Era
2420: 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e  se all schema in
2430: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
2440: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  he in-memory has
2450: 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 61  h tables of.** a
2460: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
2470: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2480: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63  is called to rec
2490: 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62  laim memory.** b
24a0: 65 66 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  efore the databa
24b0: 73 65 20 63 6c 6f 73 65 73 2e 20 20 49 74 20 69  se closes.  It i
24c0: 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75  s also called du
24d0: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a  ring a rollback.
24e0: 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72 65  ** if there were
24f0: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
2500: 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73  during the trans
2510: 61 63 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a 2a  action or if a.*
2520: 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20  * schema-cookie 
2530: 6d 69 73 6d 61 74 63 68 20 6f 63 63 75 72 73 2e  mismatch occurs.
2540: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 3d 30  .**.** If iDb<=0
2550: 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20   then reset the 
2560: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
2570: 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64  tables for all d
2580: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73  atabase.** files
2590: 2e 20 20 49 66 20 69 44 62 3e 3d 32 20 74 68 65  .  If iDb>=2 the
25a0: 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65  n reset the inte
25b0: 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72 20  rnal schema for 
25c0: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67  only the.** sing
25d0: 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65  le file indicate
25e0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
25f0: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
2600: 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64  chema(sqlite3 *d
2610: 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 48  b, int iDb){.  H
2620: 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
2630: 20 20 48 61 73 68 20 74 65 6d 70 31 3b 0a 20 20    Hash temp1;.  
2640: 48 61 73 68 20 74 65 6d 70 32 3b 0a 20 20 69 6e  Hash temp2;.  in
2650: 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65 72  t i, j;..  asser
2660: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
2670: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 64 62  <db->nDb );.  db
2680: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
2690: 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 3b 0a  TE_Initialized;.
26a0: 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64    for(i=iDb; i<d
26b0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
26c0: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
26d0: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 74 65 6d  >aDb[i];.    tem
26e0: 70 31 20 3d 20 70 44 62 2d 3e 74 62 6c 48 61 73  p1 = pDb->tblHas
26f0: 68 3b 0a 20 20 20 20 74 65 6d 70 32 20 3d 20 70  h;.    temp2 = p
2700: 44 62 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20 20  Db->trigHash;.  
2710: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
2720: 74 28 26 70 44 62 2d 3e 74 72 69 67 48 61 73 68  t(&pDb->trigHash
2730: 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54  , SQLITE_HASH_ST
2740: 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73 71  RING, 0);.    sq
2750: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
2760: 70 44 62 2d 3e 61 46 4b 65 79 29 3b 0a 20 20 20  pDb->aFKey);.   
2770: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
2780: 72 28 26 70 44 62 2d 3e 69 64 78 48 61 73 68 29  r(&pDb->idxHash)
2790: 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d  ;.    for(pElem=
27a0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
27b0: 26 74 65 6d 70 32 29 3b 20 70 45 6c 65 6d 3b 20  &temp2); pElem; 
27c0: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
27d0: 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
27e0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
27f0: 65 54 72 69 67 67 65 72 28 28 54 72 69 67 67 65  eTrigger((Trigge
2800: 72 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  r*)sqliteHashDat
2810: 61 28 70 45 6c 65 6d 29 29 3b 0a 20 20 20 20 7d  a(pElem));.    }
2820: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
2830: 43 6c 65 61 72 28 26 74 65 6d 70 32 29 3b 0a 20  Clear(&temp2);. 
2840: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
2850: 69 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68  it(&pDb->tblHash
2860: 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54  , SQLITE_HASH_ST
2870: 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 66 6f  RING, 0);.    fo
2880: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
2890: 73 68 46 69 72 73 74 28 26 74 65 6d 70 31 29 3b  shFirst(&temp1);
28a0: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
28b0: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
28c0: 65 6d 29 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  em)){.      Tabl
28d0: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
28e0: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
28f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
2900: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
2910: 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ab);.    }.    s
2920: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
2930: 26 74 65 6d 70 31 29 3b 0a 20 20 20 20 70 44 62  &temp1);.    pDb
2940: 2d 3e 70 53 65 71 54 61 62 20 3d 20 30 3b 0a 20  ->pSeqTab = 0;. 
2950: 20 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72     DbClearProper
2960: 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 53 63 68  ty(db, i, DB_Sch
2970: 65 6d 61 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20  emaLoaded);.    
2980: 69 66 28 20 69 44 62 3e 30 20 29 20 72 65 74 75  if( iDb>0 ) retu
2990: 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
29a0: 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62  ( iDb==0 );.  db
29b0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
29c0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
29d0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f  ;..  /* If one o
29e0: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 61 75  r more of the au
29f0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2a00: 20 66 69 6c 65 73 20 68 61 73 20 62 65 65 6e 20   files has been 
2a10: 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65  closed,.  ** the
2a20: 6e 20 72 65 6d 6f 76 65 20 74 68 65 6e 20 66 72  n remove then fr
2a30: 6f 6d 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  om the auxiliary
2a40: 20 64 61 74 61 62 61 73 65 20 6c 69 73 74 2e 20   database list. 
2a50: 20 57 65 20 74 61 6b 65 20 74 68 65 0a 20 20 2a   We take the.  *
2a60: 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  * opportunity to
2a70: 20 64 6f 20 74 68 69 73 20 68 65 72 65 20 73 69   do this here si
2a80: 6e 63 65 20 77 65 20 68 61 76 65 20 6a 75 73 74  nce we have just
2a90: 20 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20   deleted all of 
2aa0: 74 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20  the.  ** schema 
2ab0: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
2ac0: 74 68 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74  therefore do not
2ad0: 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e   have to make an
2ae0: 79 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74  y changes.  ** t
2af0: 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 74  o any of those t
2b00: 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ables..  */.  fo
2b10: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
2b20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
2b30: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
2b40: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
2b50: 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b  ( pDb->pBt==0 ){
2b60: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
2b70: 70 41 75 78 20 26 26 20 70 44 62 2d 3e 78 46 72  pAux && pDb->xFr
2b80: 65 65 41 75 78 20 29 20 70 44 62 2d 3e 78 46 72  eeAux ) pDb->xFr
2b90: 65 65 41 75 78 28 70 44 62 2d 3e 70 41 75 78 29  eeAux(pDb->pAux)
2ba0: 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 41 75  ;.      pDb->pAu
2bb0: 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
2bc0: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
2bd0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2be0: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
2bf0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
2c00: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
2c10: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
2c20: 6c 69 74 65 46 72 65 65 28 70 44 62 2d 3e 7a 4e  liteFree(pDb->zN
2c30: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  ame);.      pDb-
2c40: 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  >zName = 0;.    
2c50: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2c60: 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b  }.    if( j<i ){
2c70: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a  .      db->aDb[j
2c80: 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a  ] = db->aDb[i];.
2c90: 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20      }.    j++;. 
2ca0: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d   }.  memset(&db-
2cb0: 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d  >aDb[j], 0, (db-
2cc0: 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64  >nDb-j)*sizeof(d
2cd0: 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64  b->aDb[j]));.  d
2ce0: 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66  b->nDb = j;.  if
2cf0: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20  ( db->nDb<=2 && 
2d00: 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62  db->aDb!=db->aDb
2d10: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65  Static ){.    me
2d20: 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74  mcpy(db->aDbStat
2d30: 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73  ic, db->aDb, 2*s
2d40: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d  izeof(db->aDb[0]
2d50: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ));.    sqliteFr
2d60: 65 65 28 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20  ee(db->aDb);.   
2d70: 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
2d80: 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a  DbStatic;.  }.}.
2d90: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2da0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
2db0: 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63  enever a rollbac
2dc0: 6b 20 6f 63 63 75 72 73 2e 20 20 49 66 20 74 68  k occurs.  If th
2dd0: 65 72 65 20 77 65 72 65 0a 2a 2a 20 73 63 68 65  ere were.** sche
2de0: 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e  ma changes durin
2df0: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
2e00: 6e 2c 20 74 68 65 6e 20 77 65 20 68 61 76 65 20  n, then we have 
2e10: 74 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20  to reset the.** 
2e20: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
2e30: 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f 61 64 20  bles and reload 
2e40: 74 68 65 6d 20 66 72 6f 6d 20 64 69 73 6b 2e 0a  them from disk..
2e50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
2e60: 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43  ollbackInternalC
2e70: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
2e80: 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66  db){.  if( db->f
2e90: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
2ea0: 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20  ternChanges ){. 
2eb0: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
2ec0: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
2ed0: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
2ee0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2ef0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
2f00: 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a   commit occurs..
2f10: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
2f20: 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
2f30: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
2f40: 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  ){.  db->flags &
2f50: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
2f60: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
2f70: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
2f80: 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 61 20  mn names from a 
2f90: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2e 0a 2a  table or view..*
2fa0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
2fb0: 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e  liteResetColumnN
2fc0: 61 6d 65 73 28 54 61 62 6c 65 20 2a 70 54 61 62  ames(Table *pTab
2fd0: 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  le){.  int i;.  
2fe0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
2ff0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d  assert( pTable!=
3000: 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  0 );.  for(i=0, 
3010: 70 43 6f 6c 3d 70 54 61 62 6c 65 2d 3e 61 43 6f  pCol=pTable->aCo
3020: 6c 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f  l; i<pTable->nCo
3030: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
3040: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
3050: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
3060: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
3070: 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66 6c 74 29  ete(pCol->pDflt)
3080: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
3090: 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20  (pCol->zType);. 
30a0: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
30b0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20  pTable->aCol);. 
30c0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
30d0: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  0;.  pTable->nCo
30e0: 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l = 0;.}../*.** 
30f0: 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72  Remove the memor
3100: 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  y data structure
3110: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
3120: 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54  h the given.** T
3130: 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65  able.  No change
3140: 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69  s are made to di
3150: 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  sk by this routi
3160: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ne..**.** This r
3170: 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65  outine just dele
3180: 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72  tes the data str
3190: 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73  ucture.  It does
31a0: 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74   not unlink.** t
31b0: 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74  he table data st
31c0: 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
31d0: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f   hash table.  No
31e0: 72 20 64 6f 65 73 20 69 74 20 72 65 6d 6f 76 65  r does it remove
31f0: 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  .** foreign keys
3200: 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65   from the sqlite
3210: 2e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c  .aFKey hash tabl
3220: 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20  e.  But it does 
3230: 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72  destroy.** memor
3240: 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  y structures of 
3250: 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  the indices and 
3260: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73  foreign keys ass
3270: 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a  ociated with .**
3280: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
3290: 2a 20 49 6e 64 69 63 65 73 20 61 73 73 6f 63 69  * Indices associ
32a0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
32b0: 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e 6b 65 64  ble are unlinked
32c0: 20 66 72 6f 6d 20 74 68 65 20 22 64 62 22 0a 2a   from the "db".*
32d0: 2a 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  * data structure
32e0: 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e 20 20 49   if db!=NULL.  I
32f0: 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69  f db==NULL, indi
3300: 63 65 73 20 61 74 74 61 63 68 65 64 20 74 6f 0a  ces attached to.
3310: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  ** the table are
3320: 20 64 65 6c 65 74 65 64 2c 20 62 75 74 20 69 74   deleted, but it
3330: 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 65 79   is assumed they
3340: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
3350: 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a  en.** unlinked..
3360: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
3370: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
3380: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
3390: 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20  Table){.  Index 
33a0: 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b  *pIndex, *pNext;
33b0: 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c 20  .  FKey *pFKey, 
33c0: 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20 69  *pNextFKey;..  i
33d0: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72  f( pTable==0 ) r
33e0: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 65 6c  eturn;..  /* Del
33f0: 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ete all indices 
3400: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
3410: 74 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a  this table.  */.
3420: 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70    for(pIndex = p
3430: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
3440: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e  Index; pIndex=pN
3450: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
3460: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
3470: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
3480: 64 65 78 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65  dex->iDb==pTable
3490: 2d 3e 69 44 62 20 7c 7c 20 28 70 54 61 62 6c 65  ->iDb || (pTable
34a0: 2d 3e 69 44 62 3d 3d 30 20 26 26 20 70 49 6e 64  ->iDb==0 && pInd
34b0: 65 78 2d 3e 69 44 62 3d 3d 31 29 20 29 3b 0a 20  ex->iDb==1) );. 
34c0: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49     sqliteDeleteI
34d0: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
34e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
34f0: 74 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b  te all foreign k
3500: 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  eys associated w
3510: 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20  ith this table. 
3520: 20 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73   The keys.  ** s
3530: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
3540: 64 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64  dy been unlinked
3550: 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 61 46   from the db->aF
3560: 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65 20 0a  Key hash table .
3570: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79    */.  for(pFKey
3580: 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20  =pTable->pFKey; 
3590: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65  pFKey; pFKey=pNe
35a0: 78 74 46 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65  xtFKey){.    pNe
35b0: 78 74 46 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e  xtFKey = pFKey->
35c0: 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 61  pNextFrom;.    a
35d0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 69  ssert( pTable->i
35e0: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
35f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3600: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
3610: 44 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e  Db[pTable->iDb].
3620: 61 46 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20  aFKey,.         
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3640: 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74    pFKey->zTo, st
3650: 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29  rlen(pFKey->zTo)
3660: 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20  +1)!=pFKey );.  
3670: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b    sqliteFree(pFK
3680: 65 79 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ey);.  }..  /* D
3690: 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20  elete the Table 
36a0: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
36b0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 52  ..  */.  sqliteR
36c0: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
36d0: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
36e0: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e  eFree(pTable->zN
36f0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ame);.  sqliteFr
3700: 65 65 28 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41  ee(pTable->zColA
3710: 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ff);.  sqlite3Se
3720: 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61 62 6c  lectDelete(pTabl
3730: 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  e->pSelect);.  s
3740: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
3750: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  );.}../*.** Unli
3760: 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62  nk the given tab
3770: 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  le from the hash
3780: 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20   tables and the 
3790: 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61  delete the.** ta
37a0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69  ble structure wi
37b0: 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63  th all its indic
37c0: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
37d0: 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  eys..*/.void sql
37e0: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
37f0: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
3800: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
3810: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e  onst char *zTabN
3820: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
3830: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a  ;.  FKey *pF1, *
3840: 70 46 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  pF2;.  Db *pDb;.
3850: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
3860: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44   );.  assert( iD
3870: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
3880: 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
3890: 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61   zTabName && zTa
38a0: 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44  bName[0] );.  pD
38b0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
38c0: 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ];.  p = sqlite3
38d0: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
38e0: 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61  >tblHash, zTabNa
38f0: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e  me, strlen(zTabN
3900: 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 69 66  ame)+1, 0);.  if
3910: 28 20 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  ( p ){.    for(p
3920: 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31  F1=p->pFKey; pF1
3930: 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74  ; pF1=pF1->pNext
3940: 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74  From){.      int
3950: 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46   nTo = strlen(pF
3960: 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20  1->zTo) + 1;.   
3970: 20 20 20 70 46 32 20 3d 20 73 71 6c 69 74 65 33     pF2 = sqlite3
3980: 48 61 73 68 46 69 6e 64 28 26 70 44 62 2d 3e 61  HashFind(&pDb->a
3990: 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20  FKey, pF1->zTo, 
39a0: 6e 54 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nTo);.      if( 
39b0: 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20  pF2==pF1 ){.    
39c0: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
39d0: 6e 73 65 72 74 28 26 70 44 62 2d 3e 61 46 4b 65  nsert(&pDb->aFKe
39e0: 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f  y, pF1->zTo, nTo
39f0: 2c 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b  , pF1->pNextTo);
3a00: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3a10: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32        while( pF2
3a20: 20 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f   && pF2->pNextTo
3a30: 21 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32  !=pF1 ){ pF2=pF2
3a40: 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20  ->pNextTo; }.   
3a50: 20 20 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a       if( pF2 ){.
3a60: 20 20 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70            pF2->p
3a70: 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e  NextTo = pF1->pN
3a80: 65 78 74 54 6f 3b 0a 20 20 20 20 20 20 20 20 7d  extTo;.        }
3a90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3aa0: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
3ab0: 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20  Table(db, p);.  
3ac0: 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  }.  db->flags |=
3ad0: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
3ae0: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
3af0: 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72  Given a token, r
3b00: 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74  eturn a string t
3b10: 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  hat consists of 
3b20: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 61 74  the text of that
3b30: 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69 74 68 20 61  .** token with a
3b40: 6e 79 20 71 75 6f 74 61 74 69 6f 6e 73 20 72 65  ny quotations re
3b50: 6d 6f 76 65 64 2e 20 20 53 70 61 63 65 20 74 6f  moved.  Space to
3b60: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
3b70: 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20  ed string.** is 
3b80: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
3b90: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
3ba0: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
3bb0: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  y the calling.**
3bc0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
3bd0: 20 54 6f 6b 65 6e 73 20 61 72 65 20 72 65 61 6c   Tokens are real
3be0: 6c 79 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73  ly just pointers
3bf0: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
3c00: 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20  al SQL text and 
3c10: 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30  so.** are not \0
3c20: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e  00 terminated an
3c30: 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73  d are not persis
3c40: 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72  tent.  The retur
3c50: 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ned string.** is
3c60: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
3c70: 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74 65   and is persiste
3c80: 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nt..*/.char *sql
3c90: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
3ca0: 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  n(Token *pName){
3cb0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
3cc0: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
3cd0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
3ce0: 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e  eStrNDup(pName->
3cf0: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
3d00: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
3d10: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  (zName);.  }else
3d20: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
3d30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
3d40: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ame;.}../*.** Op
3d50: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  en the sqlite_ma
3d60: 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65  ster table store
3d70: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75  d in database nu
3d80: 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20  mber iDb for.** 
3d90: 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62  writing. The tab
3da0: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  le is opened usi
3db0: 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  ng cursor 0..*/.
3dc0: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e  void sqlite3Open
3dd0: 4d 61 73 74 65 72 54 61 62 6c 65 28 56 64 62 65  MasterTable(Vdbe
3de0: 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20   *v, int iDb){. 
3df0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3e00: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
3e10: 20 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69   iDb, 0);.  sqli
3e20: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3e30: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c  OP_OpenWrite, 0,
3e40: 20 4d 41 53 54 45 52 5f 52 4f 4f 54 29 3b 0a 20   MASTER_ROOT);. 
3e50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3e60: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
3e70: 6c 75 6d 6e 73 2c 20 30 2c 20 35 29 3b 20 2f 2a  lumns, 0, 5); /*
3e80: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 68   sqlite_master h
3e90: 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  as 5 columns */.
3ea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
3eb0: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
3ec0: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
3ed0: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
3ee0: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
3ef0: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
3f00: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
3f10: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
3f20: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
3f30: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
3f40: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
3f50: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
3f60: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
3f70: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
3f80: 78 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  xist..*/.static 
3f90: 69 6e 74 20 66 69 6e 64 44 62 28 73 71 6c 69 74  int findDb(sqlit
3fa0: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
3fb0: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Name){.  int i; 
3fc0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
3fd0: 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
3fe0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f  int n;         /
3ff0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
4000: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61  acters in the na
4010: 6d 65 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b  me */.  Db *pDb;
4020: 20 20 20 20 20 20 20 2f 2a 20 41 20 64 61 74 61         /* A data
4030: 62 61 73 65 20 77 68 6f 73 65 20 6e 61 6d 65 20  base whose name 
4040: 73 70 61 63 65 20 69 73 20 62 65 69 6e 67 20 73  space is being s
4050: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 68 61  earched */.  cha
4060: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e  r *zName;   /* N
4070: 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63  ame we are searc
4080: 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a  hing for */..  z
4090: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
40a0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
40b0: 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  e);.  if( zName 
40c0: 29 7b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65  ){.    n = strle
40d0: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f  n(zName);.    fo
40e0: 72 28 70 44 62 3d 64 62 2d 3e 61 44 62 2c 20 69  r(pDb=db->aDb, i
40f0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
4100: 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20  ++, pDb++){.    
4110: 20 20 69 66 28 20 6e 3d 3d 73 74 72 6c 65 6e 28    if( n==strlen(
4120: 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 30  pDb->zName) && 0
4130: 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
4140: 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  (pDb->zName, zNa
4150: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  me) ){.        s
4160: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
4170: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
4180: 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
4190: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
41a0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72  (zName);.  }.  r
41b0: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 20  eturn -1;.}../* 
41c0: 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  The table or vie
41d0: 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d  w or trigger nam
41e0: 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  e is passed to t
41f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20  his routine via 
4200: 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31  tokens.** pName1
4210: 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20   and pName2. If 
4220: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
4230: 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  as fully qualifi
4240: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a  ed, for example:
4250: 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41  .**.** CREATE TA
4260: 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e  BLE xxx.yyy (...
4270: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70  );.** .** Then p
4280: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
4290: 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32  "xxx" and pName2
42a0: 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f   "yyy". On the o
42b0: 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20  ther hand if.** 
42c0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
42d0: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
42e0: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a  ified, i.e.:.**.
42f0: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
4300: 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20  yyy(...);.**.** 
4310: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
4320: 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20  et to "yyy" and 
4330: 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a  pName2 is ""..**
4340: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4350: 20 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71   sets the *ppUnq
4360: 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  ual pointer to p
4370: 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65  oint at the toke
4380: 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20  n (pName1 or.** 
4390: 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f  pName2) that sto
43a0: 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66  res the unqualif
43b0: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ied table name. 
43c0: 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   The index of th
43d0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78  e.** database "x
43e0: 78 78 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e  xx" is returned.
43f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
4400: 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61  woPartName(.  Pa
4410: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4420: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
4430: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
4440: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
4450: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
4460: 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69    /* The "xxx" i
4470: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
4480: 79 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f  yyy" or "xxx" */
4490: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
44a0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79  ,      /* The "y
44b0: 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  yy" in the name 
44c0: 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54  "xxx.yyy" */.  T
44d0: 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20  oken **pUnqual  
44e0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
44f0: 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65  unqualified obje
4500: 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a  ct name here */.
4510: 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  ){.  int iDb;   
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4530: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
4540: 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20  ding the object 
4550: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
4560: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
4570: 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20    if( pName2 && 
4580: 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20  pName2->n>0 ){. 
4590: 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
45a0: 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20  init.busy );.   
45b0: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
45c0: 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 66 69  e2;.    iDb = fi
45d0: 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29  ndDb(db, pName1)
45e0: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
45f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4600: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4610: 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61   "unknown databa
4620: 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b  se %T", pName1);
4630: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
4640: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Err++;.      ret
4650: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
4660: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
4670: 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  t( db->init.iDb=
4680: 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62  =0 || db->init.b
4690: 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20 3d  usy );.    iDb =
46a0: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20   db->init.iDb;. 
46b0: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
46c0: 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame1;.  }.  retu
46d0: 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn iDb;.}../*.**
46e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
46f0: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69   used to check i
4700: 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72 69  f the UTF-8 stri
4710: 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65  ng zName is a le
4720: 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69  gal.** unqualifi
4730: 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65  ed name for a ne
4740: 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  w schema object 
4750: 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76  (table, index, v
4760: 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65  iew or.** trigge
4770: 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72  r). All names ar
4780: 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74  e legal except t
4790: 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e 20  hose that begin 
47a0: 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a  with the string.
47b0: 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e  ** "sqlite_" (in
47c0: 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72   upper, lower or
47d0: 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54 68   mixed case). Th
47e0: 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  is portion of th
47f0: 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  e namespace.** i
4800: 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  s reserved for i
4810: 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a  nternal use..*/.
4820: 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
4830: 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65  ObjectName(Parse
4840: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
4850: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
4860: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d  if( !pParse->db-
4870: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50  >init.busy && pP
4880: 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
4890: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d  .          && 0=
48a0: 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  =sqlite3StrNICmp
48b0: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
48c0: 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c  ", 7) ){.    sql
48d0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
48e0: 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d  rse, "object nam
48f0: 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  e reserved for i
4900: 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22  nternal use: %s"
4910: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  , zName);.    re
4920: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
4930: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
4940: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
4950: 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72  .** Begin constr
4960: 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  ucting a new tab
4970: 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
4980: 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  n in memory.  Th
4990: 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  is is.** the fir
49a0: 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63  st of several ac
49b0: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68  tion routines th
49c0: 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e  at get called in
49d0: 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20   response.** to 
49e0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
49f0: 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61  tatement.  In pa
4a00: 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72  rticular, this r
4a10: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
4a20: 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67  .** after seeing
4a30: 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22   tokens "CREATE"
4a40: 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64   and "TABLE" and
4a50: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
4a60: 20 20 54 68 65 0a 2a 2a 20 70 53 74 61 72 74 20    The.** pStart 
4a70: 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 43 52 45  token is the CRE
4a80: 41 54 45 20 61 6e 64 20 70 4e 61 6d 65 20 69 73  ATE and pName is
4a90: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
4aa0: 20 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20    The isTemp.** 
4ab0: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
4ac0: 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  the table should
4ad0: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
4ae0: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
4af0: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73  base.** file ins
4b00: 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d  tead of in the m
4b10: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
4b20: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
4b30: 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a  ally the case.**
4b40: 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22   when the "TEMP"
4b50: 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20   or "TEMPORARY" 
4b60: 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69  keyword occurs i
4b70: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45  n between.** CRE
4b80: 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a  ATE and TABLE..*
4b90: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62  *.** The new tab
4ba0: 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69  le record is ini
4bb0: 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74  tialized and put
4bc0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   in pParse->pNew
4bd0: 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72  Table..** As mor
4be0: 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  e of the CREATE 
4bf0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
4c00: 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74  is parsed, addit
4c10: 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20  ional action.** 
4c20: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65  routines will be
4c30: 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d   called to add m
4c40: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
4c50: 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a  to this record..
4c60: 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
4c70: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
4c80: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
4c90: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
4ca0: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
4cb0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
4cc0: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
4cd0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
4ce0: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
4cf0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61  .void sqlite3Sta
4d00: 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  rtTable(.  Parse
4d10: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
4d20: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
4d30: 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
4d40: 2c 20 20 20 2f 2a 20 54 68 65 20 22 43 52 45 41  ,   /* The "CREA
4d50: 54 45 22 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54  TE" token */.  T
4d60: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
4d70: 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
4d80: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
4d90: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
4da0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
4db0: 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70  2,   /* Second p
4dc0: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
4dd0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
4de0: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
4df0: 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72  Temp,      /* Tr
4e00: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
4e10: 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TEMP table */.  
4e20: 69 6e 74 20 69 73 56 69 65 77 20 20 20 20 20 20  int isView      
4e30: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
4e40: 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 29 7b   is a VIEW */.){
4e50: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
4e60: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
4e70: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
4e80: 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20   0; /* The name 
4e90: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
4ea0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
4eb0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4ec0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
4ed0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
4ee0: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
4ef0: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74   to create the t
4f00: 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b  able in */.  Tok
4f10: 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a  en *pName;    /*
4f20: 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
4f30: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
4f40: 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f  o create */..  /
4f50: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76  * The table or v
4f60: 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61  iew name to crea
4f70: 74 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  te is passed to 
4f80: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61  this routine via
4f90: 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61   tokens.  ** pNa
4fa0: 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20  me1 and pName2. 
4fb0: 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  If the table nam
4fc0: 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c  e was fully qual
4fd0: 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70  ified, for examp
4fe0: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52  le:.  **.  ** CR
4ff0: 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79  EATE TABLE xxx.y
5000: 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a  yy (...);.  ** .
5010: 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31    ** Then pName1
5020: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
5030: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
5040: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
5050: 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65  hand if.  ** the
5060: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e   table name is n
5070: 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  ot fully qualifi
5080: 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20  ed, i.e.:.  **. 
5090: 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
50a0: 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a   yyy(...);.  **.
50b0: 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31    ** Then pName1
50c0: 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22   is set to "yyy"
50d0: 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22   and pName2 is "
50e0: 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  "..  **.  ** The
50f0: 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73   call below sets
5100: 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74   the pName point
5110: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
5120: 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31  he token (pName1
5130: 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29   or.  ** pName2)
5140: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
5150: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   unqualified tab
5160: 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72  le name. The var
5170: 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a  iable iDb is.  *
5180: 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  * set to the ind
5190: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
51a0: 73 65 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  se that the tabl
51b0: 65 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20  e or view is to 
51c0: 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  be.  ** created 
51d0: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d  in..  */.  iDb =
51e0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
51f0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
5200: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
5210: 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
5220: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
5230: 20 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e 31   isTemp && iDb>1
5240: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72   ){.    /* If cr
5250: 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61  eating a temp ta
5260: 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61  ble, the name ma
5270: 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69  y not be qualifi
5280: 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ed */.    sqlite
5290: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
52a0: 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62  , "temporary tab
52b0: 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
52c0: 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20  unqualified");. 
52d0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
52e0: 20 69 66 28 20 69 73 54 65 6d 70 20 29 20 69 44   if( isTemp ) iD
52f0: 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65  b = 1;..  pParse
5300: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a  ->sNameToken = *
5310: 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d  pName;.  zName =
5320: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
5330: 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20  Token(pName);.  
5340: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72  if( zName==0 ) r
5350: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c  eturn;.  if( SQL
5360: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43  ITE_OK!=sqlite3C
5370: 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70  heckObjectName(p
5380: 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  Parse, zName) ){
5390: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
53a0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
53b0: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
53c0: 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20  iDb==1 ) isTemp 
53d0: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
53e0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
53f0: 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28  ZATION.  assert(
5400: 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69   (isTemp & 1)==i
5410: 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20  sTemp );.  {.   
5420: 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63   int code;.    c
5430: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
5440: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
5450: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
5460: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
5470: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
5480: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65  CHEMA_TABLE(isTe
5490: 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  mp), 0, zDb) ){.
54a0: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
54b0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
54c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
54d0: 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
54e0: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
54f0: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
5500: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
5510: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5520: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
5530: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
5540: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
5550: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69  lse{.      if( i
5560: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
5570: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
5580: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
5590: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
55a0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
55b0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
55c0: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
55d0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
55e0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
55f0: 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30  , code, zName, 0
5600: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
5610: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
5620: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
5630: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  }.#endif..  /* M
5640: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77  ake sure the new
5650: 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73   table name does
5660: 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74   not collide wit
5670: 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20  h an existing.  
5680: 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
5690: 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61  e name in the sa
56a0: 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73  me database.  Is
56b0: 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  sue an error mes
56c0: 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20  sage if.  ** it 
56d0: 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  does..  */.  if(
56e0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
56f0: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
5700: 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  arse) ){.    got
5710: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
5720: 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  ror;.  }.  pTabl
5730: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  e = sqlite3FindT
5740: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
5750: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
5760: 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  me);.  if( pTabl
5770: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
5780: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5790: 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61   "table %T alrea
57a0: 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d  dy exists", pNam
57b0: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67  e);.    goto beg
57c0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
57d0: 20 20 7d 0a 20 20 69 66 28 20 28 70 49 64 78 20    }.  if( (pIdx 
57e0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
57f0: 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  ex(db, zName, 0)
5800: 29 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20 28  )!=0 && .      (
5810: 20 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e   iDb==0 || !db->
5820: 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20  init.busy) ){.  
5830: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5840: 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
5850: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
5860: 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20  ndex named %s", 
5870: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
5880: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
5890: 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  or;.  }.  pTable
58a0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
58b0: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
58c0: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ;.  if( pTable==
58d0: 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  0 ){.    pParse-
58e0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
58f0: 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  EM;.    pParse->
5900: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
5910: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
5920: 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  or;.  }.  pTable
5930: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
5940: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
5950: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61  = 0;.  pTable->a
5960: 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  Col = 0;.  pTabl
5970: 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  e->iPKey = -1;. 
5980: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20   pTable->pIndex 
5990: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69  = 0;.  pTable->i
59a0: 44 62 20 3d 20 69 44 62 3b 0a 20 20 69 66 28 20  Db = iDb;.  if( 
59b0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
59c0: 65 20 29 20 73 71 6c 69 74 65 33 44 65 6c 65 74  e ) sqlite3Delet
59d0: 65 54 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73  eTable(db, pPars
59e0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20  e->pNewTable);. 
59f0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
5a00: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20  le = pTable;..  
5a10: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
5a20: 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73  e magic sqlite_s
5a30: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73  equence table us
5a40: 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d  ed by autoincrem
5a50: 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  ent,.  ** then r
5a60: 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20  ecord a pointer 
5a70: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e  to this table in
5a80: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
5a90: 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
5aa0: 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54  * so that INSERT
5ab0: 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61   can find the ta
5ac0: 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f  ble easily..  */
5ad0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5ae0: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
5af0: 4e 54 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  NT.  if( strcmp(
5b00: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73  zName, "sqlite_s
5b10: 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a  equence")==0 ){.
5b20: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
5b30: 2e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c  .pSeqTab = pTabl
5b40: 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
5b50: 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
5b60: 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68  ting the code th
5b70: 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74  at will insert t
5b80: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
5b90: 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51  into.  ** the SQ
5ba0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
5bb0: 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74  e.  Note in part
5bc0: 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d  icular that we m
5bd0: 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a  ust go ahead.  *
5be0: 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74  * and allocate t
5bf0: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
5c00: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65   for the table e
5c10: 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72  ntry now.  Befor
5c20: 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41  e any.  ** PRIMA
5c30: 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
5c40: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61   keywords are pa
5c50: 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79  rsed.  Those key
5c60: 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65  words will cause
5c70: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f  .  ** indices to
5c80: 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20   be created and 
5c90: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
5ca0: 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72   must come befor
5cb0: 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69  e the .  ** indi
5cc0: 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ces.  Hence, the
5cd0: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
5ce0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73  or the table mus
5cf0: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20  t be allocated. 
5d00: 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   ** now..  */.  
5d10: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
5d20: 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74  sy && (v = sqlit
5d30: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
5d40: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))!=0 ){.    sql
5d50: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
5d60: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
5d70: 30 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a  0, iDb);..    /*
5d80: 20 45 76 65 72 79 20 74 69 6d 65 20 61 20 6e 65   Every time a ne
5d90: 77 20 74 61 62 6c 65 20 69 73 20 63 72 65 61 74  w table is creat
5da0: 65 64 20 74 68 65 20 66 69 6c 65 2d 66 6f 72 6d  ed the file-form
5db0: 61 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65 6e  at.    ** and en
5dc0: 63 6f 64 69 6e 67 20 6d 65 74 61 2d 76 61 6c 75  coding meta-valu
5dd0: 65 73 20 61 72 65 20 73 65 74 20 69 6e 20 74 68  es are set in th
5de0: 65 20 64 61 74 61 62 61 73 65 2c 20 69 6e 0a 20  e database, in. 
5df0: 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20     ** case this 
5e00: 69 73 20 74 68 65 20 66 69 72 73 74 20 74 61 62  is the first tab
5e10: 6c 65 20 63 72 65 61 74 65 64 2e 0a 20 20 20 20  le created..    
5e20: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
5e30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
5e40: 74 65 67 65 72 2c 20 64 62 2d 3e 66 69 6c 65 5f  teger, db->file_
5e50: 66 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20  format, 0);.    
5e60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5e70: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
5e80: 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 73  , iDb, 1);.    s
5e90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5ea0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64  v, OP_Integer, d
5eb0: 62 2d 3e 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  b->enc, 0);.    
5ec0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5ed0: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
5ee0: 2c 20 69 44 62 2c 20 34 29 3b 0a 0a 20 20 20 20  , iDb, 4);..    
5ef0: 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65  /* This just cre
5f00: 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c  ates a place-hol
5f10: 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68  der record in th
5f20: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
5f30: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68  table..    ** Th
5f40: 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64  e record created
5f50: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
5f60: 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20  n anything yet. 
5f70: 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c   It will be repl
5f80: 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  aced.    ** by t
5f90: 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e  he real entry in
5fa0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
5fb0: 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  at sqlite3EndTab
5fc0: 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  le()..    **.   
5fd0: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
5fe0: 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  r the new entry 
5ff0: 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 74  is left on the t
6000: 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
6010: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  .    ** The rowi
6020: 64 20 76 61 6c 75 65 20 69 73 20 6e 65 65 64 65  d value is neede
6030: 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68  d by the code th
6040: 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  at sqlite3EndTab
6050: 6c 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67  le will.    ** g
6060: 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a  enerate..    */.
6070: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d      sqlite3OpenM
6080: 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69 44  asterTable(v, iD
6090: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
60a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
60b0: 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a  ewRecno, 0, 0);.
60c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
60d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
60e0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
60f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6100: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29  P_String8, 0, 0)
6110: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6120: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
6130: 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  IntKey, 0, 0);. 
6140: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6150: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
6160: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f   0, 0);.  }..  /
6170: 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72  * Normal (non-er
6180: 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a  ror) return. */.
6190: 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20    return;..  /* 
61a0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
61b0: 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65  rs, we jump here
61c0: 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f   */.begin_table_
61d0: 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 46  error:.  sqliteF
61e0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  ree(zName);.  re
61f0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  turn;.}../*.** A
6200: 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20  dd a new column 
6210: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
6220: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
6230: 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  structed..**.** 
6240: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
6250: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
6260: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
6270: 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  mn declaration.*
6280: 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  * in a CREATE TA
6290: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
62a0: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
62b0: 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a  e() gets called.
62c0: 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20  ** first to get 
62d0: 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54  things going.  T
62e0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
62f0: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65   is called for e
6300: 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a  ach.** column..*
6310: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
6320: 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70  dColumn(Parse *p
6330: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
6340: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
6350: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
6360: 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  r *z;.  Column *
6370: 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d  pCol;.  if( (p =
6380: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6390: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
63a0: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61  .  z = sqlite3Na
63b0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
63c0: 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  e);.  if( z==0 )
63d0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
63e0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
63f0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
6400: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 70  ite3StrICmp(z, p
6410: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
6420: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
6430: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6440: 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20  rse, "duplicate 
6450: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22  column name: %s"
6460: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , z);.      sqli
6470: 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20  teFree(z);.     
6480: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
6490: 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f   }.  if( (p->nCo
64a0: 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20  l & 0x7)==0 ){. 
64b0: 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b     Column *aNew;
64c0: 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69  .    aNew = sqli
64d0: 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 43  teRealloc( p->aC
64e0: 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a  ol, (p->nCol+8)*
64f0: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
6500: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  ]));.    if( aNe
6510: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  w==0 ) return;. 
6520: 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65     p->aCol = aNe
6530: 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20  w;.  }.  pCol = 
6540: 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c  &p->aCol[p->nCol
6550: 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c  ];.  memset(pCol
6560: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61  , 0, sizeof(p->a
6570: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c  Col[0]));.  pCol
6580: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20  ->zName = z;. . 
6590: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
65a0: 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65  no type specifie
65b0: 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20  d, columns have 
65c0: 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69  the default affi
65d0: 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27  nity.  ** 'NONE'
65e0: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
65f0: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
6600: 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43  then sqlite3AddC
6610: 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c  olumnType() will
6620: 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  .  ** be called 
6630: 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c  next to set pCol
6640: 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65  ->affinity corre
6650: 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f  ctly..  */.  pCo
6660: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
6670: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
6680: 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70   pCol->pColl = p
6690: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
66a0: 43 6f 6c 6c 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b  Coll;.  p->nCol+
66b0: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  +;.}../*.** This
66c0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
66d0: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
66e0: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
66f0: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
6700: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
6710: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20  E statement.  A 
6720: 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74  "NOT NULL" const
6730: 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65  raint has.** bee
6740: 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75  n seen on a colu
6750: 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  mn.  This routin
6760: 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75  e sets the notNu
6770: 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68  ll flag on.** th
6780: 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  e column current
6790: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
67a0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
67b0: 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c  qlite3AddNotNull
67c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
67d0: 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20  int onError){.  
67e0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
67f0: 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  i;.  if( (p = pP
6800: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
6810: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
6820: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
6830: 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61   if( i>=0 ) p->a
6840: 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d  Col[i].notNull =
6850: 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   onError;.}../*.
6860: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6870: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
6880: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
6890: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
68a0: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
68b0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
68c0: 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73 74 20  nt.  The pFirst 
68d0: 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72  token is the fir
68e0: 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74  st.** token in t
68f0: 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74  he sequence of t
6900: 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63 72  okens that descr
6910: 69 62 65 20 74 68 65 20 74 79 70 65 20 6f 66 20  ibe the type of 
6920: 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75  the.** column cu
6930: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
6940: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c  nstruction.   pL
6950: 61 73 74 20 69 73 20 74 68 65 20 6c 61 73 74 20  ast is the last 
6960: 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  token.** in the 
6970: 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74  sequence.  Use t
6980: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
6990: 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73  to construct a s
69a0: 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f  tring.** that co
69b0: 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e  ntains the typen
69c0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
69d0: 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74  n and store that
69e0: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54   string.** in zT
69f0: 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71  ype..*/ .void sq
6a00: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79  lite3AddColumnTy
6a10: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
6a20: 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c  , Token *pFirst,
6a30: 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 29 7b 0a   Token *pLast){.
6a40: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
6a50: 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b  t i, j;.  int n;
6a60: 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a  .  char *z, **pz
6a70: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
6a80: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
6a90: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
6aa0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
6ab0: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
6ac0: 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
6ad0: 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  ;.  pCol = &p->a
6ae0: 43 6f 6c 5b 69 5d 3b 0a 20 20 70 7a 20 3d 20 26  Col[i];.  pz = &
6af0: 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 6e  pCol->zType;.  n
6b00: 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b 20 28 70   = pLast->n + (p
6b10: 4c 61 73 74 2d 3e 7a 20 2d 20 70 46 69 72 73 74  Last->z - pFirst
6b20: 2d 3e 7a 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ->z);.  assert( 
6b30: 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29  pCol->zType==0 )
6b40: 3b 0a 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54  ;.  z = pCol->zT
6b50: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ype = sqlite3MPr
6b60: 69 6e 74 66 28 22 25 2e 2a 73 22 2c 20 6e 2c 20  intf("%.*s", n, 
6b70: 70 46 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 69 66  pFirst->z);.  if
6b80: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
6b90: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b  .  for(i=j=0; z[
6ba0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  i]; i++){.    in
6bb0: 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  t c = z[i];.    
6bc0: 69 66 28 20 69 73 73 70 61 63 65 28 63 29 20 29  if( isspace(c) )
6bd0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a   continue;.    z
6be0: 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20  [j++] = c;.  }. 
6bf0: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 70 43 6f   z[j] = 0;.  pCo
6c00: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
6c10: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
6c20: 65 28 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(z, n);.}../*.*
6c30: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
6c40: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
6c50: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f  value for the mo
6c60: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
6c70: 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74  d column.** of t
6c80: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
6c90: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
6ca0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66  ction..**.** Def
6cb0: 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65  ault value expre
6cc0: 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63  ssions must be c
6cd0: 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20  onstant.  Raise 
6ce0: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20  an exception if 
6cf0: 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74  this.** is not t
6d00: 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  he case..**.** T
6d10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
6d20: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
6d30: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
6d40: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
6d50: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
6d60: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
6d70: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
6d80: 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50  ddDefaultValue(P
6d90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
6da0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 61  pr *pExpr){.  Ta
6db0: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
6dc0: 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70   *pCol;.  if( (p
6dd0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
6de0: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
6df0: 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d  n;.  pCol = &(p-
6e00: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >aCol[p->nCol-1]
6e10: 29 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  );.  if( !sqlite
6e20: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
6e30: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71  pExpr) ){.    sq
6e40: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6e50: 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76  arse, "default v
6e60: 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b  alue of column [
6e70: 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  %s] is not const
6e80: 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 70 43  ant",.        pC
6e90: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  ol->zName);.  }e
6ea0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
6eb0: 45 78 70 72 44 65 6c 65 74 65 28 70 43 6f 6c 2d  ExprDelete(pCol-
6ec0: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 70 43 6f  >pDflt);.    pCo
6ed0: 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74  l->pDflt = sqlit
6ee0: 65 33 45 78 70 72 44 75 70 28 70 45 78 70 72 29  e3ExprDup(pExpr)
6ef0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
6f00: 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 70 50  rResolveNames(pP
6f10: 61 72 73 65 2c 30 2c 30 2c 30 2c 70 45 78 70 72  arse,0,0,0,pExpr
6f20: 2c 30 2c 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ,0,0);.  }.  sql
6f30: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
6f40: 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
6f50: 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52  Designate the PR
6f60: 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68  IMARY KEY for th
6f70: 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20  e table.  pList 
6f80: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d  is a list of nam
6f90: 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e  es .** of column
6fa0: 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  s that form the 
6fb0: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
6fc0: 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20   pList is NULL, 
6fd0: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74  then the.** most
6fe0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
6ff0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
7000: 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61  ble is the prima
7010: 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20  ry key..**.** A 
7020: 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61  table can have a
7030: 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61  t most one prima
7040: 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20  ry key.  If the 
7050: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
7060: 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b  s.** a primary k
7070: 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20  ey (and this is 
7080: 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61  the second prima
7090: 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65  ry key) then cre
70a0: 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e  ate an.** error.
70b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52  .**.** If the PR
70c0: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20  IMARY KEY is on 
70d0: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
70e0: 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69  whose datatype i
70f0: 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68  s INTEGER,.** th
7100: 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74  en we will try t
7110: 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d  o use that colum
7120: 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20  n as the rowid. 
7130: 20 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69   Set the Table.i
7140: 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66  PKey.** field of
7150: 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72   the table under
7160: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f   construction to
7170: 20 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66   be the index of
7180: 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20   the.** INTEGER 
7190: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
71a0: 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79  mn.  Table.iPKey
71b0: 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66   is set to -1 if
71c0: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
71d0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
71e0: 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  KEY..**.** If th
71f0: 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20  e key is not an 
7200: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
7210: 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65  KEY, then create
7220: 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64   a unique.** ind
7230: 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20  ex for the key. 
7240: 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65   No index is cre
7250: 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52  ated for INTEGER
7260: 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a   PRIMARY KEYs..*
7270: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
7280: 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50  dPrimaryKey(.  P
7290: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
72a0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
72b0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
72c0: 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  t *pList,  /* Li
72d0: 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65  st of field name
72e0: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
72f0: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
7300: 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  ,      /* What t
7310: 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71  o do with a uniq
7320: 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20  ueness conflict 
7330: 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63  */.  int autoInc
7340: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
7350: 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d  f the AUTOINCREM
7360: 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  ENT keyword is p
7370: 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54  resent */.){.  T
7380: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
7390: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
73a0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
73b0: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
73c0: 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61  -1, i;.  if( pTa
73d0: 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 69 6d  b==0 ) goto prim
73e0: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20  ary_key_exit;.  
73f0: 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69  if( pTab->hasPri
7400: 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  mKey ){.    sqli
7410: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7420: 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c  se, .      "tabl
7430: 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72  e \"%s\" has mor
7440: 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61  e than one prima
7450: 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a  ry key", pTab->z
7460: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
7470: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
7480: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61  ;.  }.  pTab->ha
7490: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
74a0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
74b0: 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
74c0: 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70  >nCol - 1;.    p
74d0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
74e0: 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  isPrimKey = 1;. 
74f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
7500: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
7510: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
7520: 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
7530: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
7540: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ol++){.        i
7550: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
7560: 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
7570: 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
7580: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  iCol].zName)==0 
7590: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
75a0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
75b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
75c0: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iCol<pTab->nCol 
75d0: 29 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ) pTab->aCol[iCo
75e0: 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31  l].isPrimKey = 1
75f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7600: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29  pList->nExpr>1 )
7610: 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a   iCol = -1;.  }.
7620: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
7630: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
7640: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
7650: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
7660: 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66  .zType;.  }.  if
7670: 28 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74  ( zType && sqlit
7680: 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c  e3StrICmp(zType,
7690: 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 20 29   "INTEGER")==0 )
76a0: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  {.    pTab->iPKe
76b0: 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54  y = iCol;.    pT
76c0: 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e  ab->keyConf = on
76d0: 45 72 72 6f 72 3b 0a 20 20 20 20 70 54 61 62 2d  Error;.    pTab-
76e0: 3e 61 75 74 6f 49 6e 63 20 3d 20 61 75 74 6f 49  >autoInc = autoI
76f0: 6e 63 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  nc;.  }else if( 
7700: 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64  autoInc ){.#ifnd
7710: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
7720: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
7730: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7740: 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e  (pParse, "AUTOIN
7750: 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20  CREMENT is only 
7760: 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a  allowed on an ".
7770: 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20         "INTEGER 
7780: 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23  PRIMARY KEY");.#
7790: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
77a0: 20 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65     sqlite3Create
77b0: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c  Index(pParse, 0,
77c0: 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e   0, 0, pList, on
77d0: 45 72 72 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20  Error, 0, 0);.  
77e0: 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d    pList = 0;.  }
77f0: 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  ..primary_key_ex
7800: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  it:.  sqlite3Exp
7810: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  rListDelete(pLis
7820: 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  t);.  return;.}.
7830: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
7840: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
7850: 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
7860: 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61  cently parsed ta
7870: 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f  ble column.** to
7880: 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76   the CollSeq giv
7890: 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  en..*/.void sqli
78a0: 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70  te3AddCollateTyp
78b0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
78c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
78d0: 70 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a  pe, int nType){.
78e0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 49 6e    Table *p;.  In
78f0: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 43 6f 6c  dex *pIdx;.  Col
7900: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
7910: 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 28 70 20  nt i;..  if( (p 
7920: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
7930: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
7940: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
7950: 31 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  1;..  pColl = sq
7960: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
7970: 65 71 28 70 50 61 72 73 65 2c 20 7a 54 79 70 65  eq(pParse, zType
7980: 2c 20 6e 54 79 70 65 29 3b 0a 20 20 70 2d 3e 61  , nType);.  p->a
7990: 43 6f 6c 5b 69 5d 2e 70 43 6f 6c 6c 20 3d 20 70  Col[i].pColl = p
79a0: 43 6f 6c 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Coll;..  /* If t
79b0: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63  he column is dec
79c0: 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e  lared as "<name>
79d0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c   PRIMARY KEY COL
79e0: 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20  LATE <type>",.  
79f0: 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78  ** then an index
7a00: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63   may have been c
7a10: 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63  reated on this c
7a20: 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65  olumn before the
7a30: 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20  .  ** collation 
7a40: 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20  type was added. 
7a50: 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20  Correct this if 
7a60: 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  it is the case..
7a70: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 20    */.  for(pIdx 
7a80: 3d 20 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  = p->pIndex; pId
7a90: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
7aa0: 65 78 74 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ext){.    assert
7ab0: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d  ( pIdx->nColumn=
7ac0: 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  =1 );.    if( pI
7ad0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
7ae0: 3d 69 20 29 20 70 49 64 78 2d 3e 6b 65 79 49 6e  =i ) pIdx->keyIn
7af0: 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 43  fo.aColl[0] = pC
7b00: 6f 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  oll;.  }.}../*.*
7b10: 2a 20 4c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  * Locate and ret
7b20: 75 72 6e 20 61 6e 20 65 6e 74 72 79 20 66 72 6f  urn an entry fro
7b30: 6d 20 74 68 65 20 64 62 2e 61 43 6f 6c 6c 53 65  m the db.aCollSe
7b40: 71 20 68 61 73 68 20 74 61 62 6c 65 2e 20 49 66  q hash table. If
7b50: 20 74 68 65 20 65 6e 74 72 79 0a 2a 2a 20 73 70   the entry.** sp
7b60: 65 63 69 66 69 65 64 20 62 79 20 7a 4e 61 6d 65  ecified by zName
7b70: 20 61 6e 64 20 6e 4e 61 6d 65 20 69 73 20 6e 6f   and nName is no
7b80: 74 20 66 6f 75 6e 64 20 61 6e 64 20 70 61 72 61  t found and para
7b90: 6d 65 74 65 72 20 27 63 72 65 61 74 65 27 20 69  meter 'create' i
7ba0: 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e 20  s.** true, then 
7bb0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 6e 74  create a new ent
7bc0: 72 79 2e 20 4f 74 68 65 72 77 69 73 65 20 72 65  ry. Otherwise re
7bd0: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
7be0: 20 45 61 63 68 20 70 6f 69 6e 74 65 72 20 73 74   Each pointer st
7bf0: 6f 72 65 64 20 69 6e 20 74 68 65 20 73 71 6c 69  ored in the sqli
7c00: 74 65 33 2e 61 43 6f 6c 6c 53 65 71 20 68 61 73  te3.aCollSeq has
7c10: 68 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73  h table contains
7c20: 20 61 6e 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20   an.** array of 
7c30: 74 68 72 65 65 20 43 6f 6c 6c 53 65 71 20 73 74  three CollSeq st
7c40: 72 75 63 74 75 72 65 73 2e 20 54 68 65 20 66 69  ructures. The fi
7c50: 72 73 74 20 69 73 20 74 68 65 20 63 6f 6c 6c 61  rst is the colla
7c60: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2a  tion sequence.**
7c70: 20 70 72 65 66 66 65 72 72 65 64 20 66 6f 72 20   prefferred for 
7c80: 55 54 46 2d 38 2c 20 74 68 65 20 73 65 63 6f 6e  UTF-8, the secon
7c90: 64 20 55 54 46 2d 31 36 6c 65 2c 20 61 6e 64 20  d UTF-16le, and 
7ca0: 74 68 65 20 74 68 69 72 64 20 55 54 46 2d 31 36  the third UTF-16
7cb0: 62 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 64  be..**.** Stored
7cc0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
7cd0: 65 72 20 74 68 65 20 74 68 72 65 65 20 63 6f 6c  er the three col
7ce0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
7cf0: 20 69 73 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a   is a copy of.**
7d00: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
7d10: 65 71 75 65 6e 63 65 20 6e 61 6d 65 2e 20 41 20  equence name. A 
7d20: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
7d30: 73 74 72 69 6e 67 20 69 73 20 73 74 6f 72 65 64  string is stored
7d40: 20 69 6e 0a 2a 2a 20 65 61 63 68 20 63 6f 6c 6c   in.** each coll
7d50: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 73  ation sequence s
7d60: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
7d70: 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 20 66 69  tic CollSeq * fi
7d80: 6e 64 43 6f 6c 6c 53 65 71 45 6e 74 72 79 28 0a  ndCollSeqEntry(.
7d90: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
7da0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
7db0: 6d 65 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c  me,.  int nName,
7dc0: 0a 20 20 69 6e 74 20 63 72 65 61 74 65 0a 29 7b  .  int create.){
7dd0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
7de0: 6c 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30  l;.  if( nName<0
7df0: 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65   ) nName = strle
7e00: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 43 6f 6c  n(zName);.  pCol
7e10: 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  l = sqlite3HashF
7e20: 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ind(&db->aCollSe
7e30: 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  q, zName, nName)
7e40: 3b 0a 0a 20 20 69 66 28 20 30 3d 3d 70 43 6f 6c  ;..  if( 0==pCol
7e50: 6c 20 26 26 20 63 72 65 61 74 65 20 29 7b 0a 20  l && create ){. 
7e60: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
7e70: 65 4d 61 6c 6c 6f 63 28 20 33 2a 73 69 7a 65 6f  eMalloc( 3*sizeo
7e80: 66 28 2a 70 43 6f 6c 6c 29 20 2b 20 6e 4e 61 6d  f(*pColl) + nNam
7e90: 65 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28  e + 1 );.    if(
7ea0: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
7eb0: 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 20 3d  pColl[0].zName =
7ec0: 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 33   (char*)&pColl[3
7ed0: 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 30  ];.      pColl[0
7ee0: 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ].enc = SQLITE_U
7ef0: 54 46 38 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  TF8;.      pColl
7f00: 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  [1].zName = (cha
7f10: 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20  r*)&pColl[3];.  
7f20: 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e 65 6e 63      pColl[1].enc
7f30: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c   = SQLITE_UTF16L
7f40: 45 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 32  E;.      pColl[2
7f50: 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ].zName = (char*
7f60: 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20  )&pColl[3];.    
7f70: 20 20 70 43 6f 6c 6c 5b 32 5d 2e 65 6e 63 20 3d    pColl[2].enc =
7f80: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b   SQLITE_UTF16BE;
7f90: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43  .      memcpy(pC
7fa0: 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  oll[0].zName, zN
7fb0: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
7fc0: 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d     pColl[0].zNam
7fd0: 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20  e[nName] = 0;.  
7fe0: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
7ff0: 6e 73 65 72 74 28 26 64 62 2d 3e 61 43 6f 6c 6c  nsert(&db->aColl
8000: 53 65 71 2c 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e  Seq, pColl[0].zN
8010: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 70 43 6f 6c  ame, nName, pCol
8020: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  l);.    }.  }.  
8030: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
8040: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
8050: 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f   zName points to
8060: 20 61 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64   a UTF-8 encoded
8070: 20 73 74 72 69 6e 67 20 6e 4e 61 6d 65 20 62 79   string nName by
8080: 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2a 20 52 65 74  tes long..** Ret
8090: 75 72 6e 20 74 68 65 20 43 6f 6c 6c 53 65 71 2a  urn the CollSeq*
80a0: 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 74 68 65   pointer for the
80b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
80c0: 6e 63 65 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 0a  nce named zName.
80d0: 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 63 6f 64  ** for the encod
80e0: 69 6e 67 20 27 65 6e 63 27 20 66 72 6f 6d 20 74  ing 'enc' from t
80f0: 68 65 20 64 61 74 61 62 61 73 65 20 27 64 62 27  he database 'db'
8100: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
8110: 6e 74 72 79 20 73 70 65 63 69 66 69 65 64 20 69  ntry specified i
8120: 73 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 64 20  s not found and 
8130: 27 63 72 65 61 74 65 27 20 69 73 20 74 72 75 65  'create' is true
8140: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 0a  , then create a.
8150: 2a 2a 20 6e 65 77 20 65 6e 74 72 79 2e 20 20 4f  ** new entry.  O
8160: 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
8170: 4e 55 4c 4c 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  NULL..*/.CollSeq
8180: 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c   *sqlite3FindCol
8190: 6c 53 65 71 28 0a 20 20 73 71 6c 69 74 65 33 20  lSeq(.  sqlite3 
81a0: 2a 64 62 2c 0a 20 20 75 38 20 65 6e 63 2c 0a 20  *db,.  u8 enc,. 
81b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
81c0: 6d 65 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c  me,.  int nName,
81d0: 0a 20 20 69 6e 74 20 63 72 65 61 74 65 0a 29 7b  .  int create.){
81e0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
81f0: 6c 20 3d 20 66 69 6e 64 43 6f 6c 6c 53 65 71 45  l = findCollSeqE
8200: 6e 74 72 79 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ntry(db, zName, 
8210: 6e 4e 61 6d 65 2c 20 63 72 65 61 74 65 29 3b 0a  nName, create);.
8220: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
8230: 5f 55 54 46 38 3d 3d 31 20 26 26 20 53 51 4c 49  _UTF8==1 && SQLI
8240: 54 45 5f 55 54 46 31 36 4c 45 3d 3d 32 20 26 26  TE_UTF16LE==2 &&
8250: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3d   SQLITE_UTF16BE=
8260: 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =3 );.  assert( 
8270: 65 6e 63 3e 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc>=SQLITE_UTF8
8280: 20 26 26 20 65 6e 63 3c 3d 53 51 4c 49 54 45 5f   && enc<=SQLITE_
8290: 55 54 46 31 36 42 45 20 29 3b 0a 20 20 69 66 28  UTF16BE );.  if(
82a0: 20 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 2b   pColl ) pColl +
82b0: 3d 20 65 6e 63 2d 31 3b 0a 20 20 72 65 74 75 72  = enc-1;.  retur
82c0: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pColl;.}../*.*
82d0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 27 63 6f  * Invoke the 'co
82e0: 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 27 20  llation needed' 
82f0: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 72 65 71 75  callback to requ
8300: 65 73 74 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20  est a collation 
8310: 73 65 71 75 65 6e 63 65 0a 2a 2a 20 69 6e 20 74  sequence.** in t
8320: 68 65 20 64 61 74 61 62 61 73 65 20 74 65 78 74  he database text
8330: 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 6e 61 6d   encoding of nam
8340: 65 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  e zName, length 
8350: 6e 4e 61 6d 65 2e 0a 2a 2a 20 49 66 20 74 68 65  nName..** If the
8360: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
8370: 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nce.*/.static vo
8380: 69 64 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65  id callCollNeede
8390: 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  d(sqlite3 *db, c
83a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
83b0: 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20  , int nName){.  
83c0: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 78 43 6f  assert( !db->xCo
83d0: 6c 6c 4e 65 65 64 65 64 20 7c 7c 20 21 64 62 2d  llNeeded || !db-
83e0: 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 29  >xCollNeeded16 )
83f0: 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20  ;.  if( nName<0 
8400: 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e  ) nName = strlen
8410: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 64  (zName);.  if( d
8420: 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 29  b->xCollNeeded )
8430: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78 74  {.    char *zExt
8440: 65 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 53 74  ernal = sqliteSt
8450: 72 4e 44 75 70 28 7a 4e 61 6d 65 2c 20 6e 4e 61  rNDup(zName, nNa
8460: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 45  me);.    if( !zE
8470: 78 74 65 72 6e 61 6c 20 29 20 72 65 74 75 72 6e  xternal ) return
8480: 3b 0a 20 20 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  ;.    db->xCollN
8490: 65 65 64 65 64 28 64 62 2d 3e 70 43 6f 6c 6c 4e  eeded(db->pCollN
84a0: 65 65 64 65 64 41 72 67 2c 20 64 62 2c 20 28 69  eededArg, db, (i
84b0: 6e 74 29 64 62 2d 3e 65 6e 63 2c 20 7a 45 78 74  nt)db->enc, zExt
84c0: 65 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  ernal);.    sqli
84d0: 74 65 46 72 65 65 28 7a 45 78 74 65 72 6e 61 6c  teFree(zExternal
84e0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d  );.  }.  if( db-
84f0: 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 29  >xCollNeeded16 )
8500: 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  {.    char const
8510: 20 2a 7a 45 78 74 65 72 6e 61 6c 3b 0a 20 20 20   *zExternal;.   
8520: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
8530: 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 47 65  pTmp = sqlite3Ge
8540: 74 54 72 61 6e 73 69 65 6e 74 56 61 6c 75 65 28  tTransientValue(
8550: 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  db);.    sqlite3
8560: 56 61 6c 75 65 53 65 74 53 74 72 28 70 54 6d 70  ValueSetStr(pTmp
8570: 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  , -1, zName, SQL
8580: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
8590: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 45  _STATIC);.    zE
85a0: 78 74 65 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  xternal = sqlite
85b0: 33 56 61 6c 75 65 54 65 78 74 28 70 54 6d 70 2c  3ValueText(pTmp,
85c0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
85d0: 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  IVE);.    if( !z
85e0: 45 78 74 65 72 6e 61 6c 20 29 20 72 65 74 75 72  External ) retur
85f0: 6e 3b 0a 20 20 20 20 64 62 2d 3e 78 43 6f 6c 6c  n;.    db->xColl
8600: 4e 65 65 64 65 64 31 36 28 64 62 2d 3e 70 43 6f  Needed16(db->pCo
8610: 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 64 62 2c  llNeededArg, db,
8620: 20 28 69 6e 74 29 64 62 2d 3e 65 6e 63 2c 20 7a   (int)db->enc, z
8630: 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20 7d 0a 7d  External);.  }.}
8640: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8650: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 69  tine is called i
8660: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  f the collation 
8670: 66 61 63 74 6f 72 79 20 66 61 69 6c 73 20 74 6f  factory fails to
8680: 20 64 65 6c 69 76 65 72 20 61 0a 2a 2a 20 63 6f   deliver a.** co
8690: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
86a0: 20 69 6e 20 74 68 65 20 62 65 73 74 20 65 6e 63   in the best enc
86b0: 6f 64 69 6e 67 20 62 75 74 20 74 68 65 72 65 20  oding but there 
86c0: 6d 61 79 20 62 65 20 6f 74 68 65 72 20 76 65 72  may be other ver
86d0: 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 74 68 69 73  sions.** of this
86e0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
86f0: 69 6f 6e 20 28 66 6f 72 20 6f 74 68 65 72 20 74  ion (for other t
8700: 65 78 74 20 65 6e 63 6f 64 69 6e 67 73 29 20 61  ext encodings) a
8710: 76 61 69 6c 61 62 6c 65 2e 20 55 73 65 20 6f 6e  vailable. Use on
8720: 65 0a 2a 2a 20 6f 66 20 74 68 65 73 65 20 69 6e  e.** of these in
8730: 73 74 65 61 64 20 69 66 20 74 68 65 79 20 65 78  stead if they ex
8740: 69 73 74 2e 20 41 76 6f 69 64 20 61 20 55 54 46  ist. Avoid a UTF
8750: 2d 38 20 3c 2d 3e 20 55 54 46 2d 31 36 20 63 6f  -8 <-> UTF-16 co
8760: 6e 76 65 72 73 69 6f 6e 20 69 66 0a 2a 2a 20 70  nversion if.** p
8770: 6f 73 73 69 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ossible..*/.stat
8780: 69 63 20 69 6e 74 20 73 79 6e 74 68 43 6f 6c 6c  ic int synthColl
8790: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
87a0: 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  e, CollSeq *pCol
87b0: 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  l){.  CollSeq *p
87c0: 43 6f 6c 6c 32 3b 0a 20 20 63 68 61 72 20 2a 7a  Coll2;.  char *z
87d0: 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b   = pColl->zName;
87e0: 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65  .  int n = strle
87f0: 6e 28 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 20  n(z);.  sqlite3 
8800: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
8810: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61  ;.  int i;.  sta
8820: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e  tic const u8 aEn
8830: 63 5b 5d 20 3d 20 7b 20 53 51 4c 49 54 45 5f 55  c[] = { SQLITE_U
8840: 54 46 31 36 42 45 2c 20 53 51 4c 49 54 45 5f 55  TF16BE, SQLITE_U
8850: 54 46 31 36 4c 45 2c 20 53 51 4c 49 54 45 5f 55  TF16LE, SQLITE_U
8860: 54 46 38 20 7d 3b 0a 20 20 66 6f 72 28 69 3d 30  TF8 };.  for(i=0
8870: 3b 20 69 3c 33 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<3; i++){.   
8880: 20 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65   pColl2 = sqlite
8890: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
88a0: 20 61 45 6e 63 5b 69 5d 2c 20 7a 2c 20 6e 2c 20   aEnc[i], z, n, 
88b0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  0);.    if( pCol
88c0: 6c 32 2d 3e 78 43 6d 70 21 3d 30 20 29 7b 0a 20  l2->xCmp!=0 ){. 
88d0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c       memcpy(pCol
88e0: 6c 2c 20 70 43 6f 6c 6c 32 2c 20 73 69 7a 65 6f  l, pColl2, sizeo
88f0: 66 28 43 6f 6c 6c 53 65 71 29 29 3b 0a 20 20 20  f(CollSeq));.   
8900: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8910: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
8920: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
8930: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
8940: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8950: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c  se, "no such col
8960: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a  lation sequence:
8970: 20 25 2e 2a 73 22 2c 20 6e 2c 20 7a 29 3b 0a 20   %.*s", n, z);. 
8980: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 45 72   }.  pParse->nEr
8990: 72 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  r++;.  return SQ
89a0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f  LITE_ERROR;.}../
89b0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
89c0: 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61  e is called on a
89d0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
89e0: 6e 63 65 20 62 65 66 6f 72 65 20 69 74 20 69 73  nce before it is
89f0: 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63   used to.** chec
8a00: 6b 20 74 68 61 74 20 69 74 20 69 73 20 64 65 66  k that it is def
8a10: 69 6e 65 64 2e 20 41 6e 20 75 6e 64 65 66 69 6e  ined. An undefin
8a20: 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
8a30: 75 65 6e 63 65 20 65 78 69 73 74 73 20 77 68 65  uence exists whe
8a40: 6e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20  n.** a database 
8a50: 69 73 20 6c 6f 61 64 65 64 20 74 68 61 74 20 63  is loaded that c
8a60: 6f 6e 74 61 69 6e 73 20 72 65 66 65 72 65 6e 63  ontains referenc
8a70: 65 73 20 74 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20  es to collation 
8a80: 73 65 71 75 65 6e 63 65 73 0a 2a 2a 20 74 68 61  sequences.** tha
8a90: 74 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20  t have not been 
8aa0: 64 65 66 69 6e 65 64 20 62 79 20 73 71 6c 69 74  defined by sqlit
8ab0: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
8ac0: 69 6f 6e 28 29 20 65 74 63 2e 0a 2a 2a 0a 2a 2a  ion() etc..**.**
8ad0: 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 74 68   If required, th
8ae0: 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73  is routine calls
8af0: 20 74 68 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 20   the 'collation 
8b00: 6e 65 65 64 65 64 27 20 63 61 6c 6c 62 61 63 6b  needed' callback
8b10: 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 61   to.** request a
8b20: 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74   definition of t
8b30: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
8b40: 75 65 6e 63 65 2e 20 49 66 20 74 68 69 73 20 64  uence. If this d
8b50: 6f 65 73 6e 27 74 20 77 6f 72 6b 2c 20 0a 2a 2a  oesn't work, .**
8b60: 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 63   an equivalent c
8b70: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
8b80: 65 20 74 68 61 74 20 75 73 65 73 20 61 20 74 65  e that uses a te
8b90: 78 74 20 65 6e 63 6f 64 69 6e 67 20 64 69 66 66  xt encoding diff
8ba0: 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 74 68  erent.** from th
8bb0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
8bc0: 69 73 20 73 75 62 73 74 69 74 75 74 65 64 2c 20  is substituted, 
8bd0: 69 66 20 6f 6e 65 20 69 73 20 61 76 61 69 6c 61  if one is availa
8be0: 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
8bf0: 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28  te3CheckCollSeq(
8c00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 43  Parse *pParse, C
8c10: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a  ollSeq *pColl){.
8c20: 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 21    if( pColl && !
8c30: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20  pColl->xCmp ){. 
8c40: 20 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69     /* No collati
8c50: 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74  on sequence of t
8c60: 68 69 73 20 74 79 70 65 20 66 6f 72 20 74 68 69  his type for thi
8c70: 73 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 72 65  s encoding is re
8c80: 67 69 73 74 65 72 65 64 2e 0a 20 20 20 20 2a 2a  gistered..    **
8c90: 20 43 61 6c 6c 20 74 68 65 20 63 6f 6c 6c 61 74   Call the collat
8ca0: 69 6f 6e 20 66 61 63 74 6f 72 79 20 74 6f 20 73  ion factory to s
8cb0: 65 65 20 69 66 20 69 74 20 63 61 6e 20 73 75 70  ee if it can sup
8cc0: 70 6c 79 20 75 73 20 77 69 74 68 20 6f 6e 65 2e  ply us with one.
8cd0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 6c 6c  .    */.    call
8ce0: 43 6f 6c 6c 4e 65 65 64 65 64 28 70 50 61 72 73  CollNeeded(pPars
8cf0: 65 2d 3e 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  e->db, pColl->zN
8d00: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 43 6f 6c  ame, strlen(pCol
8d10: 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  l->zName));.    
8d20: 69 66 28 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70  if( !pColl->xCmp
8d30: 20 26 26 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71   && synthCollSeq
8d40: 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20  (pParse, pColl) 
8d50: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8d60: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
8d70: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
8d80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
8d90: 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65  *.** Call sqlite
8da0: 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 29 20  3CheckCollSeq() 
8db0: 66 6f 72 20 61 6c 6c 20 63 6f 6c 6c 61 74 69 6e  for all collatin
8dc0: 67 20 73 65 71 75 65 6e 63 65 73 20 69 6e 20 61  g sequences in a
8dd0: 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 69 6e 20 6f  n index,.** in o
8de0: 72 64 65 72 20 74 6f 20 76 65 72 69 66 79 20 74  rder to verify t
8df0: 68 61 74 20 61 6c 6c 20 74 68 65 20 6e 65 63 65  hat all the nece
8e00: 73 73 61 72 79 20 63 6f 6c 6c 61 74 69 6e 67 20  ssary collating 
8e10: 73 65 71 75 65 6e 63 65 73 20 61 72 65 0a 2a 2a  sequences are.**
8e20: 20 6c 6f 61 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20   loaded..*/.int 
8e30: 73 71 6c 69 74 65 33 43 68 65 63 6b 49 6e 64 65  sqlite3CheckInde
8e40: 78 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  xCollSeq(Parse *
8e50: 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
8e60: 49 64 78 29 7b 0a 20 20 69 66 28 20 70 49 64 78  Idx){.  if( pIdx
8e70: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
8e80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
8e90: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
8ea0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
8eb0: 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71  ite3CheckCollSeq
8ec0: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 6b  (pParse, pIdx->k
8ed0: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29  eyInfo.aColl[i])
8ee0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
8ef0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
8f00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8f10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
8f20: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
8f30: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
8f40: 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74  turns the collat
8f50: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
8f60: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
8f70: 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e   text.** encodin
8f80: 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  g identified by 
8f90: 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  the string zName
8fa0: 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a  , length nName..
8fb0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
8fc0: 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  uested collation
8fd0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74   sequence is not
8fe0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e   available, or n
8ff0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  ot available.** 
9000: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
9010: 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c  native encoding,
9020: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
9030: 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65  actory is invoke
9040: 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20  d to.** request 
9050: 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61  it. If the colla
9060: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65  tion factory doe
9070: 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63  s not supply suc
9080: 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a  h a sequence,.**
9090: 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63   and the sequenc
90a0: 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69  e is available i
90b0: 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65  n another text e
90c0: 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68  ncoding, then th
90d0: 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  at is.** returne
90e0: 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
90f0: 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20   If no versions 
9100: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  of the requested
9110: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75   collations sequ
9120: 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62  ence are availab
9130: 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65  le, or.** anothe
9140: 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  r error occurs, 
9150: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
9160: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65   and an error me
9170: 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e  ssage written in
9180: 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f  to.** pParse..*/
9190: 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65  .CollSeq *sqlite
91a0: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50  3LocateCollSeq(P
91b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
91c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
91d0: 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 75   int nName){.  u
91e0: 38 20 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e  8 enc = pParse->
91f0: 64 62 2d 3e 65 6e 63 3b 0a 20 20 75 38 20 69 6e  db->enc;.  u8 in
9200: 69 74 62 75 73 79 20 3d 20 70 50 61 72 73 65 2d  itbusy = pParse-
9210: 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a  >db->init.busy;.
9220: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
9230: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
9240: 6c 6c 53 65 71 28 70 50 61 72 73 65 2d 3e 64 62  llSeq(pParse->db
9250: 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  , enc, zName, nN
9260: 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a  ame, initbusy);.
9270: 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29 20    if( nName<0 ) 
9280: 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nName = strlen(z
9290: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69 6e  Name);.  if( !in
92a0: 69 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c  itbusy && (!pCol
92b0: 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d  l || !pColl->xCm
92c0: 70 29 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  p) ){.    /* No 
92d0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
92e0: 63 65 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ce of this type 
92f0: 66 6f 72 20 74 68 69 73 20 65 6e 63 6f 64 69 6e  for this encodin
9300: 67 20 69 73 20 72 65 67 69 73 74 65 72 65 64 2e  g is registered.
9310: 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 20 74 68 65  .    ** Call the
9320: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
9330: 72 79 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ry to see if it 
9340: 63 61 6e 20 73 75 70 70 6c 79 20 75 73 20 77 69  can supply us wi
9350: 74 68 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  th one..    */. 
9360: 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65     callCollNeede
9370: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e  d(pParse->db, zN
9380: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
9390: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
93a0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61 72  FindCollSeq(pPar
93b0: 73 65 2d 3e 64 62 2c 20 65 6e 63 2c 20 7a 4e 61  se->db, enc, zNa
93c0: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20  me, nName, 0);. 
93d0: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20     if( pColl && 
93e0: 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a  !pColl->xCmp ){.
93f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d        /* There m
9400: 61 79 20 62 65 20 61 20 76 65 72 73 69 6f 6e 20  ay be a version 
9410: 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  of the collation
9420: 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20 72   sequence that r
9430: 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
9440: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62 65 74   translation bet
9450: 77 65 65 6e 20 65 6e 63 6f 64 69 6e 67 73 2e 20  ween encodings. 
9460: 53 65 61 72 63 68 20 66 6f 72 20 69 74 20 77 69  Search for it wi
9470: 74 68 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28  th synthCollSeq(
9480: 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
9490: 20 20 69 66 28 20 73 79 6e 74 68 43 6f 6c 6c 53    if( synthCollS
94a0: 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c  eq(pParse, pColl
94b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
94c0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
94d0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
94e0: 66 20 6e 6f 74 68 69 6e 67 20 68 61 73 20 62 65  f nothing has be
94f0: 65 6e 20 66 6f 75 6e 64 2c 20 77 72 69 74 65 20  en found, write 
9500: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
9510: 65 20 69 6e 74 6f 20 70 50 61 72 73 65 20 2a 2f  e into pParse */
9520: 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79  .  if( !initbusy
9530: 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21   && (!pColl || !
9540: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a  pColl->xCmp) ){.
9550: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
9560: 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nErr==0 ){.     
9570: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9580: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
9590: 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  h collation sequ
95a0: 65 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e 61  ence: %.*s", nNa
95b0: 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  me, zName);.    
95c0: 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b  }.    pColl = 0;
95d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
95e0: 6f 6c 6c 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  oll;.}..../*.** 
95f0: 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Scan the column 
9600: 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20  type name zType 
9610: 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61  (length nType) a
9620: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a  nd return the.**
9630: 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66 69   associated affi
9640: 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2f 0a 63 68  nity type..*/.ch
9650: 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69  ar sqlite3Affini
9660: 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61  tyType(const cha
9670: 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54  r *zType, int nT
9680: 79 70 65 29 7b 0a 20 20 69 6e 74 20 6e 2c 20 69  ype){.  int n, i
9690: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
96a0: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f   struct {.    co
96b0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 62 3b 20  nst char *zSub; 
96c0: 20 2f 2a 20 4b 65 79 77 6f 72 64 73 20 73 75 62   /* Keywords sub
96d0: 73 74 72 69 6e 67 20 74 6f 20 73 65 61 72 63 68  string to search
96e0: 20 66 6f 72 20 2a 2f 0a 20 20 20 20 63 68 61 72   for */.    char
96f0: 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 2f   nSub;         /
9700: 2a 20 6c 65 6e 67 74 68 20 6f 66 20 7a 53 75 62  * length of zSub
9710: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 61 66 66   */.    char aff
9720: 69 6e 69 74 79 3b 20 20 20 20 20 2f 2a 20 41 66  inity;     /* Af
9730: 66 69 6e 69 74 79 20 74 6f 20 72 65 74 75 72 6e  finity to return
9740: 20 69 66 20 69 74 20 6d 61 74 63 68 65 73 20 2a   if it matches *
9750: 2f 0a 20 20 7d 20 73 75 62 73 74 72 69 6e 67 73  /.  } substrings
9760: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 22 49 4e 54  [] = {.    {"INT
9770: 22 2c 20 20 33 2c 20 53 51 4c 49 54 45 5f 41 46  ",  3, SQLITE_AF
9780: 46 5f 49 4e 54 45 47 45 52 7d 2c 0a 20 20 20 20  F_INTEGER},.    
9790: 7b 22 43 48 41 52 22 2c 20 34 2c 20 53 51 4c 49  {"CHAR", 4, SQLI
97a0: 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20 20  TE_AFF_TEXT},.  
97b0: 20 20 7b 22 43 4c 4f 42 22 2c 20 34 2c 20 53 51    {"CLOB", 4, SQ
97c0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a  LITE_AFF_TEXT},.
97d0: 20 20 20 20 7b 22 54 45 58 54 22 2c 20 34 2c 20      {"TEXT", 4, 
97e0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 7d  SQLITE_AFF_TEXT}
97f0: 2c 0a 20 20 20 20 7b 22 42 4c 4f 42 22 2c 20 34  ,.    {"BLOB", 4
9800: 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  , SQLITE_AFF_NON
9810: 45 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20  E},.  };..  if( 
9820: 6e 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nType==0 ){.    
9830: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
9840: 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 66 6f  F_NONE;.  }.  fo
9850: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
9860: 73 75 62 73 74 72 69 6e 67 73 29 2f 73 69 7a 65  substrings)/size
9870: 6f 66 28 73 75 62 73 74 72 69 6e 67 73 5b 30 5d  of(substrings[0]
9880: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  ); i++){.    int
9890: 20 63 31 20 3d 20 73 75 62 73 74 72 69 6e 67 73   c1 = substrings
98a0: 5b 69 5d 2e 7a 53 75 62 5b 30 5d 3b 0a 20 20 20  [i].zSub[0];.   
98b0: 20 69 6e 74 20 63 32 20 3d 20 74 6f 6c 6f 77 65   int c2 = tolowe
98c0: 72 28 63 31 29 3b 0a 20 20 20 20 69 6e 74 20 6c  r(c1);.    int l
98d0: 69 6d 69 74 20 3d 20 6e 54 79 70 65 20 2d 20 73  imit = nType - s
98e0: 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 6e 53 75  ubstrings[i].nSu
98f0: 62 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  b;.    const cha
9900: 72 20 2a 7a 20 3d 20 73 75 62 73 74 72 69 6e 67  r *z = substring
9910: 73 5b 69 5d 2e 7a 53 75 62 3b 0a 20 20 20 20 66  s[i].zSub;.    f
9920: 6f 72 28 6e 3d 30 3b 20 6e 3c 3d 6c 69 6d 69 74  or(n=0; n<=limit
9930: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; n++){.      in
9940: 74 20 63 20 3d 20 7a 54 79 70 65 5b 6e 5d 3b 0a  t c = zType[n];.
9950: 20 20 20 20 20 20 69 66 28 20 28 63 3d 3d 63 31        if( (c==c1
9960: 20 7c 7c 20 63 3d 3d 63 32 29 0a 20 20 20 20 20   || c==c2).     
9970: 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
9980: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 26 7a  lite3StrNICmp(&z
9990: 54 79 70 65 5b 6e 5d 2c 20 7a 2c 20 73 75 62 73  Type[n], z, subs
99a0: 74 72 69 6e 67 73 5b 69 5d 2e 6e 53 75 62 29 20  trings[i].nSub) 
99b0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
99c0: 6e 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e  n substrings[i].
99d0: 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
99e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
99f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
9a00: 4e 55 4d 45 52 49 43 3b 0a 7d 0a 0a 2f 2a 0a 2a  NUMERIC;.}../*.*
9a10: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
9a20: 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d  that will increm
9a30: 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  ent the schema c
9a40: 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ookie..**.** The
9a50: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69   schema cookie i
9a60: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
9a70: 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68  ine when the sch
9a80: 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64  ema for the.** d
9a90: 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
9aa0: 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68    After each sch
9ab0: 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20  ema change, the 
9ac0: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20  cookie value.** 
9ad0: 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61  changes.  When a
9ae0: 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72   process first r
9af0: 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20  eads the schema 
9b00: 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a  it records the.*
9b10: 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65  * cookie.  There
9b20: 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20  after, whenever 
9b30: 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73  it goes to acces
9b40: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a  s the database,.
9b50: 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65  ** it checks the
9b60: 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20   cookie to make 
9b70: 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20  sure the schema 
9b80: 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a  has not changed.
9b90: 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ** since it was 
9ba0: 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  last read..**.**
9bb0: 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f   This plan is no
9bc0: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c  t completely bul
9bd0: 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69  let-proof.  It i
9be0: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a  s possible for.*
9bf0: 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20  * the schema to 
9c00: 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20  change multiple 
9c10: 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68  times and for th
9c20: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a  e cookie to be.*
9c30: 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72  * set back to pr
9c40: 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20  ior value.  But 
9c50: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61  schema changes a
9c60: 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a  re infrequent.**
9c70: 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69   and the probabi
9c80: 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20  lity of hitting 
9c90: 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20  the same cookie 
9ca0: 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a  value is only.**
9cb0: 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33   1 chance in 2^3
9cc0: 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66  2.  So we're saf
9cd0: 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69  e enough..*/.voi
9ce0: 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43  d sqlite3ChangeC
9cf0: 6f 6f 6b 69 65 28 73 71 6c 69 74 65 33 20 2a 64  ookie(sqlite3 *d
9d00: 62 2c 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  b, Vdbe *v, int 
9d10: 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  iDb){.  sqlite3V
9d20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
9d30: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b  nteger, db->aDb[
9d40: 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b  iDb].schema_cook
9d50: 69 65 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69  ie+1, 0);.  sqli
9d60: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9d70: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
9d80: 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, 0);.}../*.** 
9d90: 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62  Measure the numb
9da0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
9db0: 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75   needed to outpu
9dc0: 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69  t the given.** i
9dd0: 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20  dentifier.  The 
9de0: 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
9df0: 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f  includes any quo
9e00: 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20  tes used.** but 
9e10: 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  does not include
9e20: 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e   the null termin
9e30: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
9e40: 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73  estimate is cons
9e50: 65 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69  ervative.  It mi
9e60: 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
9e70: 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65  at what is.** re
9e80: 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  ally needed..*/.
9e90: 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74  static int ident
9ea0: 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61  Length(const cha
9eb0: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  r *z){.  int n;.
9ec0: 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e    for(n=0; *z; n
9ed0: 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, z++){.    if
9ee0: 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b  ( *z=='"' ){ n++
9ef0: 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ; }.  }.  return
9f00: 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   n + 2;.}../*.**
9f10: 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69   Write an identi
9f20: 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e  fier onto the en
9f30: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73  d of the given s
9f40: 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71  tring.  Add.** q
9f50: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20  uote characters 
9f60: 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  as needed..*/.st
9f70: 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50  atic void identP
9f80: 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  ut(char *z, int 
9f90: 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69  *pIdx, char *zSi
9fa0: 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e  gnedIdent){.  un
9fb0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64  signed char *zId
9fc0: 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ent = (unsigned 
9fd0: 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65  char*)zSignedIde
9fe0: 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  nt;.  int i, j, 
9ff0: 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d  needQuote;.  i =
a000: 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d   *pIdx;.  for(j=
a010: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
a020: 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61  +){.    if( !isa
a030: 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20  lnum(zIdent[j]) 
a040: 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f  && zIdent[j]!='_
a050: 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ' ) break;.  }. 
a060: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a 49   needQuote =  zI
a070: 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73  dent[j]!=0 || is
a080: 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29  digit(zIdent[0])
a090: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a0a0: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79     || sqlite3Key
a0b0: 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c  wordCode(zIdent,
a0c0: 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66   j)!=TK_ID;.  if
a0d0: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
a0e0: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f  i++] = '"';.  fo
a0f0: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
a100: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b  ; j++){.    z[i+
a110: 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a  +] = zIdent[j];.
a120: 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a      if( zIdent[j
a130: 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20  ]=='"' ) z[i++] 
a140: 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28  = '"';.  }.  if(
a150: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69   needQuote ) z[i
a160: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69  ++] = '"';.  z[i
a170: 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d  ] = 0;.  *pIdx =
a180: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   i;.}../*.** Gen
a190: 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54  erate a CREATE T
a1a0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61  ABLE statement a
a1b0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
a1c0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c  he given.** tabl
a1d0: 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f  e.  Memory to ho
a1e0: 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  ld the text of t
a1f0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
a200: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d  obtained.** from
a210: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
a220: 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
a230: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
a240: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
a250: 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74  atic char *creat
a260: 65 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c 65  eTableStmt(Table
a270: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b   *p){.  int i, k
a280: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74  , n;.  char *zSt
a290: 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70  mt;.  char *zSep
a2a0: 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 2c  , *zSep2, *zEnd,
a2b0: 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *z;.  Column *p
a2c0: 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  Col;.  n = 0;.  
a2d0: 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43  for(pCol = p->aC
a2e0: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
a2f0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
a300: 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74  {.    n += ident
a310: 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61  Length(pCol->zNa
a320: 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 70 43 6f  me);.    z = pCo
a330: 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 69 66  l->zType;.    if
a340: 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b  ( z ){.      n +
a350: 3d 20 28 73 74 72 6c 65 6e 28 7a 29 20 2b 20 31  = (strlen(z) + 1
a360: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e  );.    }.  }.  n
a370: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
a380: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  p->zName);.  if(
a390: 20 6e 3c 35 30 20 29 7b 0a 20 20 20 20 7a 53 65   n<50 ){.    zSe
a3a0: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
a3b0: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
a3c0: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
a3d0: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
a3e0: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
a3f0: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
a400: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
a410: 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d    n += 35 + 6*p-
a420: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
a430: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
a440: 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74  ( n );.  if( zSt
a450: 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  mt==0 ) return 0
a460: 3b 0a 20 20 73 74 72 63 70 79 28 7a 53 74 6d 74  ;.  strcpy(zStmt
a470: 2c 20 70 2d 3e 69 44 62 3d 3d 31 20 3f 20 22 43  , p->iDb==1 ? "C
a480: 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45  REATE TEMP TABLE
a490: 20 22 20 3a 20 22 43 52 45 41 54 45 20 54 41 42   " : "CREATE TAB
a4a0: 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72  LE ");.  k = str
a4b0: 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64  len(zStmt);.  id
a4c0: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
a4d0: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a  , p->zName);.  z
a4e0: 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b  Stmt[k++] = '(';
a4f0: 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61  .  for(pCol=p->a
a500: 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e  Col, i=0; i<p->n
a510: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
a520: 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a  ){.    strcpy(&z
a530: 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a  Stmt[k], zSep);.
a540: 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28      k += strlen(
a550: 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20  &zStmt[k]);.    
a560: 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20  zSep = zSep2;.  
a570: 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74    identPut(zStmt
a580: 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  , &k, pCol->zNam
a590: 65 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 20 3d  e);.    if( (z =
a5a0: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d 30   pCol->zType)!=0
a5b0: 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 5b   ){.      zStmt[
a5c0: 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  k++] = ' ';.    
a5d0: 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b    strcpy(&zStmt[
a5e0: 6b 5d 2c 20 7a 29 3b 0a 20 20 20 20 20 20 6b 20  k], z);.      k 
a5f0: 2b 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20  += strlen(z);.  
a600: 20 20 7d 0a 20 20 7d 0a 20 20 73 74 72 63 70 79    }.  }.  strcpy
a610: 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64  (&zStmt[k], zEnd
a620: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d  );.  return zStm
a630: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
a640: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
a650: 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65  ed to report the
a660: 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20   final ")" that 
a670: 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20  terminates.** a 
a680: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
a690: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
a6a0: 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  e table structur
a6b0: 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74  e that other act
a6c0: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76  ion routines hav
a6d0: 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a  e been building.
a6e0: 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
a6f0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  he internal hash
a700: 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e   tables, assumin
a710: 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65  g no errors have
a720: 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  .** occurred..**
a730: 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72  .** An entry for
a740: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61   the table is ma
a750: 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  de in the master
a760: 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20   table on disk, 
a770: 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69  unless.** this i
a780: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  s a temporary ta
a790: 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e  ble or db->init.
a7a0: 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64  busy==1.  When d
a7b0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a  b->init.busy==1.
a7c0: 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61  ** it means we a
a7d0: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73  re reading the s
a7e0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
a7f0: 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  le because we ju
a800: 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  st.** connected 
a810: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
a820: 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73  or because the s
a830: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
a840: 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74  le has.** recent
a850: 6c 79 20 63 68 61 6e 67 65 73 2c 20 73 6f 20 74  ly changes, so t
a860: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69  he entry for thi
a870: 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  s table already 
a880: 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65  exists in.** the
a890: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
a8a0: 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  able.  We do not
a8b0: 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20   want to create 
a8c0: 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  it again..**.** 
a8d0: 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61  If the pSelect a
a8e0: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
a8f0: 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ULL, it means th
a900: 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  at this routine.
a910: 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ** was called to
a920: 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   create a table 
a930: 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61  generated from a
a940: 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42   .** "CREATE TAB
a950: 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  LE ... AS SELECT
a960: 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e   ..." statement.
a970: 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d    The column nam
a980: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  es of.** the new
a990: 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63   table will matc
a9a0: 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  h the result set
a9b0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
a9c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
a9d0: 6e 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  ndTable(Parse *p
a9e0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 45  Parse, Token *pE
a9f0: 6e 64 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  nd, Select *pSel
aa00: 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ect){.  Table *p
aa10: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
aa20: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
aa30: 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26   if( (pEnd==0 &&
aa40: 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20   pSelect==0) || 
aa50: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
aa60: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
aa70: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
aa80: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
aa90: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
aaa0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
aab0: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
aac0: 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c  it.busy || !pSel
aad0: 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ect );..  /* If 
aae0: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  the db->init.bus
aaf0: 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20  y is 1 it means 
ab00: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
ab10: 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20  he SQL off the. 
ab20: 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74   ** "sqlite_mast
ab30: 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74  er" or "sqlite_t
ab40: 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  emp_master" tabl
ab50: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20  e on the disk.. 
ab60: 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72   ** So do not wr
ab70: 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ite to the disk 
ab80: 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20  again.  Extract 
ab90: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
aba0: 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  mber.  ** for th
abb0: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
abc0: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
abd0: 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70  m field.  (The p
abe0: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
abf0: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
ac00: 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68   put there by th
ac10: 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72  e sqliteOpenCb r
ac20: 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20  outine.).  */.  
ac30: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
ac40: 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d  y ){.    p->tnum
ac50: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
ac60: 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  num;.  }..  /* I
ac70: 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69  f not initializi
ac80: 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ng, then create 
ac90: 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65  a record for the
aca0: 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20   new table.  ** 
acb0: 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
acc0: 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68  STER table of th
acd0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
ace0: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20   record number. 
acf0: 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20   ** for the new 
ad00: 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75  table entry shou
ad10: 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e  ld already be on
ad20: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a   the stack..  **
ad30: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73  .  ** If this is
ad40: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62   a TEMPORARY tab
ad50: 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e  le, write the en
ad60: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78  try into the aux
ad70: 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65  iliary.  ** file
ad80: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f   instead of into
ad90: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
ada0: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
adb0: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
adc0: 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  sy ){.    int n;
add0: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
ade0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20    char *zType;  
adf0: 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22    /* "view" or "
ae00: 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68  table" */.    ch
ae10: 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a  ar *zType2;   /*
ae20: 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c   "VIEW" or "TABL
ae30: 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  E" */.    char *
ae40: 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78  zStmt;    /* Tex
ae50: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
ae60: 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20  TABLE or CREATE 
ae70: 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a  VIEW statement *
ae80: 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  /..    v = sqlit
ae90: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
aea0: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
aeb0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73  ) return;..    s
aec0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
aed0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20  v, OP_Close, 0, 
aee0: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  0);..    /* Crea
aef0: 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20  te the rootpage 
af00: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
af10: 65 20 61 6e 64 20 70 75 73 68 20 69 74 20 6f 6e  e and push it on
af20: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  to the stack..  
af30: 20 20 2a 2a 20 41 20 76 69 65 77 20 68 61 73 20    ** A view has 
af40: 6e 6f 20 72 6f 6f 74 70 61 67 65 2c 20 73 6f 20  no rootpage, so 
af50: 6a 75 73 74 20 70 75 73 68 20 61 20 7a 65 72 6f  just push a zero
af60: 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20   onto the stack 
af70: 66 6f 72 0a 20 20 20 20 2a 2a 20 76 69 65 77 73  for.    ** views
af80: 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54  .  Initialize zT
af90: 79 70 65 20 61 74 20 74 68 65 20 73 61 6d 65 20  ype at the same 
afa0: 74 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  time..    */.   
afb0: 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d   if( p->pSelect=
afc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
afd0: 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a   regular table *
afe0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
aff0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
b000: 72 65 61 74 65 54 61 62 6c 65 2c 20 70 2d 3e 69  reateTable, p->i
b010: 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7a 54  Db, 0);.      zT
b020: 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20  ype = "table";. 
b030: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54       zType2 = "T
b040: 41 42 4c 45 22 3b 0a 20 20 20 20 7d 65 6c 73 65  ABLE";.    }else
b050: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65  {.      /* A vie
b060: 77 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  w */.      sqlit
b070: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b080: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
b090: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  ;.      zType = 
b0a0: 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54  "view";.      zT
b0b0: 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 20  ype2 = "VIEW";. 
b0c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
b0d0: 74 68 69 73 20 69 73 20 61 20 43 52 45 41 54 45  this is a CREATE
b0e0: 20 54 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c   TABLE xx AS SEL
b0f0: 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65  ECT ..., execute
b100: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
b110: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  ** statement to 
b120: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77  populate the new
b130: 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74   table. The root
b140: 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72  -page number for
b150: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20   the.    ** new 
b160: 74 61 62 6c 65 20 69 73 20 6f 6e 20 74 68 65 20  table is on the 
b170: 74 6f 70 20 6f 66 20 74 68 65 20 76 64 62 65 20  top of the vdbe 
b180: 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20  stack..    **.  
b190: 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45    ** Once the SE
b1a0: 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f  LECT has been co
b1b0: 64 65 64 20 62 79 20 73 71 6c 69 74 65 33 53 65  ded by sqlite3Se
b1c0: 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e  lect(), it is in
b1d0: 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62   a.    ** suitab
b1e0: 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75 65 72  le state to quer
b1f0: 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  y for the column
b200: 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73   names and types
b210: 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20   to be used.    
b220: 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74 61  ** by the new ta
b230: 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
b240: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
b250: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c       Table *pSel
b260: 54 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Tab;.      sqlit
b270: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b280: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
b290: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b2a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
b2b0: 65 72 2c 20 70 2d 3e 69 44 62 2c 20 30 29 3b 0a  er, p->iDb, 0);.
b2c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b2d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
b2e0: 6e 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20  nWrite, 1, 0);. 
b2f0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
b300: 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  b = 2;.      sql
b310: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
b320: 65 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f  e, pSelect, SRT_
b330: 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20  Table, 1, 0, 0, 
b340: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
b350: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b360: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c  (v, OP_Close, 1,
b370: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
b380: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
b390: 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61  {.        pSelTa
b3a0: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
b3b0: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
b3c0: 72 73 65 2c 20 30 2c 20 70 53 65 6c 65 63 74 29  rse, 0, pSelect)
b3d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
b3e0: 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72  elTab==0 ) retur
b3f0: 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
b400: 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  t( p->aCol==0 );
b410: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c  .        p->nCol
b420: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c   = pSelTab->nCol
b430: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  ;.        p->aCo
b440: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
b450: 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  l;.        pSelT
b460: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
b470: 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61        pSelTab->a
b480: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
b490: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
b4a0: 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b  ble(0, pSelTab);
b4b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
b4c0: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
b4d0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
b4e0: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73   of the CREATE s
b4f0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
b500: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
b510: 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65       zStmt = cre
b520: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 70 29 3b  ateTableStmt(p);
b530: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b540: 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d    n = Addr(pEnd-
b550: 3e 7a 29 20 2d 20 41 64 64 72 28 70 50 61 72 73  >z) - Addr(pPars
b560: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29  e->sNameToken.z)
b570: 20 2b 20 31 3b 0a 20 20 20 20 20 20 7a 53 74 6d   + 1;.      zStm
b580: 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
b590: 74 66 28 22 43 52 45 41 54 45 20 25 73 20 25 2e  tf("CREATE %s %.
b5a0: 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20  *s", zType2, n, 
b5b0: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
b5c0: 65 6e 2e 7a 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  en.z);.    }..  
b5d0: 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20    /* A slot for 
b5e0: 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 20 61  the record has a
b5f0: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
b600: 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20  cated in the .  
b610: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54    ** SQLITE_MAST
b620: 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75  ER table.  We ju
b630: 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74  st need to updat
b640: 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68  e that slot with
b650: 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20   all.    ** the 
b660: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76  information we'v
b670: 65 20 63 6f 6c 6c 65 63 74 65 64 2e 20 20 54 68  e collected.  Th
b680: 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  e rowid for the 
b690: 70 72 65 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  preallocated.   
b6a0: 20 2a 2a 20 73 6c 6f 74 20 69 73 20 74 68 65 20   ** slot is the 
b6b0: 32 6e 64 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  2nd item on the 
b6c0: 73 74 61 63 6b 2e 20 20 54 68 65 20 74 6f 70 20  stack.  The top 
b6d0: 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69 73 20  of the stack is 
b6e0: 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20  the.    ** root 
b6f0: 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65 77  page for the new
b700: 20 74 61 62 6c 65 20 28 6f 72 20 61 20 30 20 69   table (or a 0 i
b710: 66 20 74 68 69 73 20 69 73 20 61 20 76 69 65 77  f this is a view
b720: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  )..    */.    sq
b730: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
b740: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22  (pParse,.      "
b750: 55 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20  UPDATE %Q.%s ". 
b760: 20 20 20 20 20 20 20 20 22 53 45 54 20 74 79 70          "SET typ
b770: 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c  e='%s', name=%Q,
b780: 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f   tbl_name=%Q, ro
b790: 6f 74 70 61 67 65 3d 23 30 2c 20 73 71 6c 3d 25  otpage=#0, sql=%
b7a0: 51 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52  Q ".       "WHER
b7b0: 45 20 72 6f 77 69 64 3d 23 31 22 2c 0a 20 20 20  E rowid=#1",.   
b7c0: 20 20 20 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44     db->aDb[p->iD
b7d0: 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
b7e0: 5f 54 41 42 4c 45 28 70 2d 3e 69 44 62 29 2c 0a  _TABLE(p->iDb),.
b7f0: 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20        zType,.   
b800: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
b810: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
b820: 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a     zStmt.    );.
b830: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
b840: 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
b850: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  e3ChangeCookie(d
b860: 62 2c 20 76 2c 20 70 2d 3e 69 44 62 29 3b 0a 0a  b, v, p->iDb);..
b870: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b880: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
b890: 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  T.    /* Check t
b8a0: 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65 64  o see if we need
b8b0: 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71   to create an sq
b8c0: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
b8d0: 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b  ble for.    ** k
b8e0: 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20  eeping track of 
b8f0: 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65  autoincrement ke
b900: 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ys..    */.    i
b910: 66 28 20 70 2d 3e 61 75 74 6f 49 6e 63 20 29 7b  f( p->autoInc ){
b920: 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d  .      Db *pDb =
b930: 20 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62   &db->aDb[p->iDb
b940: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ];.      if( pDb
b950: 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a  ->pSeqTab==0 ){.
b960: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e          sqlite3N
b970: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
b980: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  e,.          "CR
b990: 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71  EATE TABLE %Q.sq
b9a0: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61  lite_sequence(na
b9b0: 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20  me,seq)",.      
b9c0: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20      pDb->zName. 
b9d0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
b9e0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
b9f0: 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65      /* Reparse e
ba00: 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64  verything to upd
ba10: 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
ba20: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
ba30: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
ba40: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72  dbeOp3(v, OP_Par
ba50: 73 65 53 63 68 65 6d 61 2c 20 70 2d 3e 69 44 62  seSchema, p->iDb
ba60: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 73 71 6c  , 0,.        sql
ba70: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 74 62 6c  ite3MPrintf("tbl
ba80: 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e 7a  _name='%q'",p->z
ba90: 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49  Name), P3_DYNAMI
baa0: 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  C);.  }...  /* A
bab0: 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  dd the table to 
bac0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
bad0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
bae0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
baf0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
bb00: 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65  t.busy && pParse
bb10: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
bb20: 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
bb30: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20 0a    FKey *pFKey; .
bb40: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
bb50: 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 3b 0a  b->aDb[p->iDb];.
bb60: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
bb70: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44  e3HashInsert(&pD
bb80: 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a  b->tblHash, p->z
bb90: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e  Name, strlen(p->
bba0: 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20  zName)+1, p);.  
bbb0: 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20    if( pOld ){.  
bbc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
bbd0: 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  Old );  /* Mallo
bbe0: 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
bbf0: 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e  ed inside HashIn
bc00: 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  sert() */.      
bc10: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
bc20: 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70    for(pFKey=p->p
bc30: 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b  FKey; pFKey; pFK
bc40: 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  ey=pFKey->pNextF
bc50: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rom){.      int 
bc60: 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b  nTo = strlen(pFK
bc70: 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20  ey->zTo) + 1;.  
bc80: 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74      pFKey->pNext
bc90: 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  To = sqlite3Hash
bca0: 46 69 6e 64 28 26 70 44 62 2d 3e 61 46 4b 65 79  Find(&pDb->aFKey
bcb0: 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54  , pFKey->zTo, nT
bcc0: 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
bcd0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
bce0: 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e  ->aFKey, pFKey->
bcf0: 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29  zTo, nTo, pFKey)
bd00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
bd10: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
bd20: 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c  0;.    db->nTabl
bd30: 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  e++;.    db->fla
bd40: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
bd50: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a  ernChanges;.  }.
bd60: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
bd70: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
bd80: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
bd90: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
bda0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
bdb0: 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f  te a new VIEW.*/
bdc0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
bdd0: 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65  ateView(.  Parse
bde0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
bdf0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
be00: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
be10: 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20  *pBegin,     /* 
be20: 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
be30: 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65   that begins the
be40: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
be50: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
be60: 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
be70: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
be80: 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
be90: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
bea0: 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e2,     /* The t
beb0: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
bec0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
bed0: 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74  view */.  Select
bee0: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20   *pSelect,   /* 
bef0: 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  A SELECT stateme
bf00: 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  nt that will bec
bf10: 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77  ome the new view
bf20: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
bf30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
bf40: 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59   for a TEMPORARY
bf50: 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 61   view */.){.  Ta
bf60: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b  ble *p;.  int n;
bf70: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
bf80: 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b  d char *z;.  Tok
bf90: 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78  en sEnd;.  DbFix
bfa0: 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e  er sFix;.  Token
bfb0: 20 2a 70 4e 61 6d 65 3b 0a 0a 20 20 73 71 6c 69   *pName;..  sqli
bfc0: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
bfd0: 61 72 73 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e  arse, pBegin, pN
bfe0: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73  ame1, pName2, is
bff0: 54 65 6d 70 2c 20 31 29 3b 0a 20 20 70 20 3d 20  Temp, 1);.  p = 
c000: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
c010: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  e;.  if( p==0 ||
c020: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
c030: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
c040: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
c050: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
c060: 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50   }.  sqlite3TwoP
c070: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
c080: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
c090: 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73  &pName);.  if( s
c0a0: 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
c0b0: 46 69 78 2c 20 70 50 61 72 73 65 2c 20 70 2d 3e  Fix, pParse, p->
c0c0: 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61  iDb, "view", pNa
c0d0: 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74  me).    && sqlit
c0e0: 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69  e3FixSelect(&sFi
c0f0: 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b  x, pSelect).  ){
c100: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
c110: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
c120: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
c130: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20   }..  /* Make a 
c140: 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69  copy of the enti
c150: 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  re SELECT statem
c160: 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
c170: 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20   the view..  ** 
c180: 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20  This will force 
c190: 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b  all the Expr.tok
c1a0: 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62  en.z values to b
c1b0: 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20  e dynamically.  
c1c0: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74  ** allocated rat
c1d0: 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74  her than point t
c1e0: 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  o the input stri
c1f0: 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73  ng - which means
c200: 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20   that.  ** they 
c210: 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74  will persist aft
c220: 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  er the current s
c230: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61  qlite3_exec() ca
c240: 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f  ll returns..  */
c250: 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20  .  p->pSelect = 
c260: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
c270: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  (pSelect);.  sql
c280: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
c290: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28  (pSelect);.  if(
c2a0: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
c2b0: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73  it.busy ){.    s
c2c0: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
c2d0: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
c2e0: 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c   p);.  }..  /* L
c2f0: 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  ocate the end of
c300: 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57   the CREATE VIEW
c310: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b   statement.  Mak
c320: 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a  e sEnd point to.
c330: 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20    ** the end..  
c340: 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72  */.  sEnd = pPar
c350: 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a  se->sLastToken;.
c360: 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21    if( sEnd.z[0]!
c370: 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21  =0 && sEnd.z[0]!
c380: 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64  =';' ){.    sEnd
c390: 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20  .z += sEnd.n;.  
c3a0: 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a  }.  sEnd.n = 0;.
c3b0: 20 20 6e 20 3d 20 73 45 6e 64 2e 7a 20 2d 20 70    n = sEnd.z - p
c3c0: 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20  Begin->z;.  z = 
c3d0: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
c3e0: 63 68 61 72 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b  char*)pBegin->z;
c3f0: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
c400: 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c   (z[n-1]==';' ||
c410: 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29   isspace(z[n-1])
c420: 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45  ) ){ n--; }.  sE
c430: 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a  nd.z = &z[n-1];.
c440: 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20    sEnd.n = 1;.. 
c450: 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45   /* Use sqlite3E
c460: 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
c470: 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
c480: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
c490: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
c4a0: 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  3EndTable(pParse
c4b0: 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72  , &sEnd, 0);.  r
c4c0: 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  eturn;.}.#endif 
c4d0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
c4e0: 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  IEW */..#ifndef 
c4f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
c500: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  ./*.** The Table
c510: 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c   structure pTabl
c520: 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49  e is really a VI
c530: 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  EW.  Fill in the
c540: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
c550: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
c560: 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62  view in the pTab
c570: 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  le structure.  R
c580: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
c590: 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  .** of errors.  
c5a0: 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73  If an error is s
c5b0: 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72  een leave an err
c5c0: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
c5d0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
c5e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65  /.int sqlite3Vie
c5f0: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
c600: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
c610: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
c620: 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
c630: 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62     /* A fake tab
c640: 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65  le from which we
c650: 20 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   get the result 
c660: 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  set */.  Select 
c670: 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f  *pSel;     /* Co
c680: 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
c690: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
c6a0: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69   the view */.  i
c6b0: 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20  nt nErr = 0;    
c6c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
c6d0: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
c6e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
c6f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
c700: 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65  rarily holds the
c710: 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   number of curso
c720: 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 0a  rs assigned */..
c730: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
c740: 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69   );..  /* A posi
c750: 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20  tive nCol means 
c760: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65  the columns name
c770: 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20  s for this view 
c780: 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  are.  ** already
c790: 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69   known..  */.  i
c7a0: 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  f( pTable->nCol>
c7b0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
c7c0: 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e   /* A negative n
c7d0: 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c  Col is a special
c7e0: 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20   marker meaning 
c7f0: 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72  that we are curr
c800: 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e  ently.  ** tryin
c810: 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  g to compute the
c820: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20   column names.  
c830: 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73  If we enter this
c840: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20   routine with.  
c850: 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43  ** a negative nC
c860: 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f  ol, it means two
c870: 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66   or more views f
c880: 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65  orm a loop, like
c890: 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
c8a0: 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
c8b0: 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a   one AS SELECT *
c8c0: 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20   FROM two;.  ** 
c8d0: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
c8e0: 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20  two AS SELECT * 
c8f0: 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20  FROM one;.  **. 
c900: 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
c910: 69 73 20 65 72 72 6f 72 20 69 73 20 63 61 75 67  is error is caug
c920: 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e  ht previously an
c930: 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d so the followi
c940: 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f  ng test.  ** sho
c950: 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e  uld always fail.
c960: 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65    But we will le
c970: 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20  ave it in place 
c980: 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
c990: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
c9a0: 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20  le->nCol<0 ){.  
c9b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
c9c0: 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20  g(pParse, "view 
c9d0: 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79  %s is circularly
c9e0: 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c   defined", pTabl
c9f0: 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  e->zName);.    r
ca00: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
ca10: 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
ca20: 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
ca30: 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  we need to compu
ca40: 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  te the table nam
ca50: 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68  es..  ** Note th
ca60: 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  at the call to s
ca70: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
ca80: 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65  fSelect() will e
ca90: 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22  xpand any.  ** "
caa0: 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  *" elements in t
cab0: 68 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f  he results set o
cac0: 66 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77  f the view and w
cad0: 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f  ill assign curso
cae0: 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65  rs.  ** to the e
caf0: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46  lements of the F
cb00: 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74  ROM clause.  But
cb10: 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   we do not want 
cb20: 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20  these changes.  
cb30: 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65  ** to be permane
cb40: 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70  nt.  So the comp
cb50: 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20  utation is done 
cb60: 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  on a copy of the
cb70: 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61   SELECT.  ** sta
cb80: 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
cb90: 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
cba0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  */.  assert( pTa
cbb0: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a  ble->pSelect );.
cbc0: 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33    pSel = sqlite3
cbd0: 53 65 6c 65 63 74 44 75 70 28 70 54 61 62 6c 65  SelectDup(pTable
cbe0: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 6e 20  ->pSelect);.  n 
cbf0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
cc00: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
cc10: 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
cc20: 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63  arse, pSel->pSrc
cc30: 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  );.  pTable->nCo
cc40: 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61  l = -1;.  pSelTa
cc50: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
cc60: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
cc70: 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20  rse, 0, pSel);. 
cc80: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
cc90: 6e 3b 0a 20 20 69 66 28 20 70 53 65 6c 54 61 62  n;.  if( pSelTab
cca0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ccb0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20  pTable->aCol==0 
ccc0: 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  );.    pTable->n
ccd0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
cce0: 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  Col;.    pTable-
ccf0: 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >aCol = pSelTab-
cd00: 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54  >aCol;.    pSelT
cd10: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
cd20: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
cd30: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
cd40: 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
cd50: 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 44 62 53  SelTab);.    DbS
cd60: 65 74 50 72 6f 70 65 72 74 79 28 70 50 61 72 73  etProperty(pPars
cd70: 65 2d 3e 64 62 2c 20 70 54 61 62 6c 65 2d 3e 69  e->db, pTable->i
cd80: 44 62 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  Db, DB_UnresetVi
cd90: 65 77 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ews);.  }else{. 
cda0: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
cdb0: 3d 20 30 3b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b  = 0;.    nErr++;
cdc0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65  .  }.  sqlite3Se
cdd0: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 29  lectDelete(pSel)
cde0: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  ;.  return nErr;
cdf0: 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53    .}.#endif /* S
ce00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
ce10: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
ce20: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
ce30: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c  ** Clear the col
ce40: 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65  umn names from e
ce50: 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74  very VIEW in dat
ce60: 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74  abase idx..*/.st
ce70: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
ce80: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c  ViewResetAll(sql
ce90: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64  ite3 *db, int id
cea0: 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  x){.  HashElem *
ceb0: 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50  i;.  if( !DbHasP
cec0: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
ced0: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
cee0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  ) ) return;.  fo
cef0: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
cf00: 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78  rst(&db->aDb[idx
cf10: 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69  ].tblHash); i; i
cf20: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
cf30: 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  i)){.    Table *
cf40: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
cf50: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
cf60: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
cf70: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 52  ){.      sqliteR
cf80: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
cf90: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTab);.    }.  }
cfa0: 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72  .  DbClearProper
cfb0: 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
cfc0: 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a  nresetViews);.}.
cfd0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
cfe0: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
cff0: 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a  l(A,B).#endif /*
d000: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
d010: 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  W */../*.** This
d020: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
d030: 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20  led by the VDBE 
d040: 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e  to adjust the in
d050: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a  ternal schema.**
d060: 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20   used by SQLite 
d070: 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c  when the btree l
d080: 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62  ayer moves a tab
d090: 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68  le root page. Th
d0a0: 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f  e.** root-page o
d0b0: 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  f a table or ind
d0c0: 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  ex in database i
d0d0: 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66  Db has changed f
d0e0: 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20  rom iFrom.** to 
d0f0: 69 54 6f 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  iTo..*/.#ifndef 
d100: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
d110: 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69  VACUUM.void sqli
d120: 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64  te3RootPageMoved
d130: 28 44 62 20 2a 70 44 62 2c 20 69 6e 74 20 69 46  (Db *pDb, int iF
d140: 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20  rom, int iTo){. 
d150: 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d   HashElem *pElem
d160: 3b 0a 20 20 0a 20 20 66 6f 72 28 70 45 6c 65 6d  ;.  .  for(pElem
d170: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
d180: 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 29 3b  (&pDb->tblHash);
d190: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
d1a0: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
d1b0: 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  em)){.    Table 
d1c0: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
d1d0: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
d1e0: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75     if( pTab->tnu
d1f0: 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  m==iFrom ){.    
d200: 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69    pTab->tnum = i
d210: 54 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  To;.      return
d220: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
d230: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
d240: 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 69 64  shFirst(&pDb->id
d250: 78 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  xHash); pElem; p
d260: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
d270: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
d280: 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73   Index *pIdx = s
d290: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
d2a0: 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49  lem);.    if( pI
d2b0: 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  dx->tnum==iFrom 
d2c0: 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74  ){.      pIdx->t
d2d0: 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 20  num = iTo;.     
d2e0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
d2f0: 20 7d 0a 20 20 61 73 73 65 72 74 28 30 29 3b 0a   }.  assert(0);.
d300: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
d310: 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72  Write code to er
d320: 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 77 69  ase the table wi
d330: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  th root-page iTa
d340: 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73  ble from databas
d350: 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77  e iDb..** Also w
d360: 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64  rite code to mod
d370: 69 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ify the sqlite_m
d380: 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
d390: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a  internal schema.
d3a0: 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67  ** if a root-pag
d3b0: 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62  e of another tab
d3c0: 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74  le is moved by t
d3d0: 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77  he btree-layer w
d3e0: 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67  hilst.** erasing
d3f0: 20 69 54 61 62 6c 65 20 28 74 68 69 73 20 63 61   iTable (this ca
d400: 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e  n happen with an
d410: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
d420: 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74  abase)..*/ .stat
d430: 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52  ic void destroyR
d440: 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a 70  ootPage(Parse *p
d450: 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c  Parse, int iTabl
d460: 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56  e, int iDb){.  V
d470: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
d480: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
d490: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
d4a0: 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  dOp(v, OP_Destro
d4b0: 79 2c 20 69 54 61 62 6c 65 2c 20 69 44 62 29 3b  y, iTable, iDb);
d4c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d4d0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
d4e0: 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    /* OP_Destroy 
d4f0: 70 75 73 68 65 73 20 61 6e 20 69 6e 74 65 67 65  pushes an intege
d500: 72 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  r onto the stack
d510: 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65  . If this intege
d520: 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  r.  ** is non-ze
d530: 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
d540: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
d550: 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d  ber of a table m
d560: 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63  oved to.  ** loc
d570: 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68  ation iTable. Th
d580: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
d590: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71   modifies the sq
d5a0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
d5b0: 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63  e to.  ** reflec
d5c0: 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a  t this..  **.  *
d5d0: 2a 20 54 68 65 20 22 23 30 22 20 69 6e 20 74 68  * The "#0" in th
d5e0: 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63 69  e SQL is a speci
d5f0: 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74  al constant that
d600: 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72 20   means whatever 
d610: 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 6f 6e  value.  ** is on
d620: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
d630: 73 74 61 63 6b 2e 20 20 53 65 65 20 73 71 6c 69  stack.  See sqli
d640: 74 65 33 52 65 67 69 73 74 65 72 45 78 70 72 28  te3RegisterExpr(
d650: 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  )..  */.  sqlite
d660: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
d670: 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41  rse, .     "UPDA
d680: 54 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f  TE %Q.%s SET roo
d690: 74 70 61 67 65 3d 25 64 20 57 48 45 52 45 20 23  tpage=%d WHERE #
d6a0: 30 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23  0 AND rootpage=#
d6b0: 30 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d  0",.     pParse-
d6c0: 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  >db->aDb[iDb].zN
d6d0: 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
d6e0: 45 28 69 44 62 29 2c 20 69 54 61 62 6c 65 29 3b  E(iDb), iTable);
d6f0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
d700: 20 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65   Write VDBE code
d710: 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20   to erase table 
d720: 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73  pTab and all ass
d730: 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20  ociated indices 
d740: 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65  on disk..** Code
d750: 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73   to update the s
d760: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
d770: 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  les and internal
d780: 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69   schema definiti
d790: 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61  ons.** in case a
d7a0: 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e   root-page belon
d7b0: 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20  ging to another 
d7c0: 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
d7d0: 79 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  y the btree laye
d7e0: 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64  r.** is also add
d7f0: 65 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  ed (this can hap
d800: 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
d810: 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
d820: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
d830: 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50  d destroyTable(P
d840: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
d850: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64  ble *pTab){.#ifd
d860: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
d870: 55 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65  UTOVACUUM.  Inde
d880: 78 20 2a 70 49 64 78 3b 0a 20 20 64 65 73 74 72  x *pIdx;.  destr
d890: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
d8a0: 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70  e, pTab->tnum, p
d8b0: 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 66 6f 72  Tab->iDb);.  for
d8c0: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
d8d0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
d8e0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
d8f0: 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
d900: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74  (pParse, pIdx->t
d910: 6e 75 6d 2c 20 70 49 64 78 2d 3e 69 44 62 29 3b  num, pIdx->iDb);
d920: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  .  }.#else.  /* 
d930: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
d940: 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75  may be auto-vacu
d950: 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20 53  um capable (if S
d960: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
d970: 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f  ACUUM.  ** is no
d980: 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e  t defined), then
d990: 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
d9a0: 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74   to call OP_Dest
d9b0: 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  roy on the.  ** 
d9c0: 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
d9d0: 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72  root-pages in or
d9e0: 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69  der, starting wi
d9f0: 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c  th the numerical
da00: 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74  ly .  ** largest
da10: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
da20: 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  r. This guarante
da30: 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20  es that none of 
da40: 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20  the root-pages. 
da50: 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f   ** to be destro
da60: 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64  yed is relocated
da70: 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f   by an earlier O
da80: 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20  P_Destroy. i.e. 
da90: 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c  if the.  ** foll
daa0: 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64  owing were coded
dab0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44  :.  **.  ** OP_D
dac0: 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20  estroy 4 0.  ** 
dad0: 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74  ....  ** OP_Dest
dae0: 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a  roy 5 0.  **.  *
daf0: 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20  * and root page 
db00: 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65  5 happened to be
db10: 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
db20: 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  t-page number in
db30: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
db40: 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61  se, then root pa
db50: 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f  ge 5 would be mo
db60: 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62 79  ved to page 4 by
db70: 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44   the .  ** "OP_D
db80: 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f  estroy 4 0" opco
db90: 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75 65  de. The subseque
dba0: 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35  nt "OP_Destroy 5
dbb0: 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20   0" would hit.  
dbc0: 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70  ** a free-list p
dbd0: 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  age..  */.  int 
dbe0: 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75  iTab = pTab->tnu
dbf0: 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f  m;.  int iDestro
dc00: 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c  yed = 0;..  whil
dc10: 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65  e( 1 ){.    Inde
dc20: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74  x *pIdx;.    int
dc30: 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a   iLargest = 0;..
dc40: 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f 79      if( iDestroy
dc50: 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44  ed==0 || iTab<iD
dc60: 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20  estroyed ){.    
dc70: 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61    iLargest = iTa
dc80: 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  b;.    }.    for
dc90: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
dca0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
dcb0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
dcc0: 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49     int iIdx = pI
dcd0: 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  dx->tnum;.      
dce0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 44  assert( pIdx->iD
dcf0: 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29 3b 0a  b==pTab->iDb );.
dd00: 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74        if( (iDest
dd10: 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64  royed==0 || (iId
dd20: 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26  x<iDestroyed)) &
dd30: 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20  & iIdx>iLargest 
dd40: 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67  ){.        iLarg
dd50: 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20  est = iIdx;.    
dd60: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
dd70: 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 20  ( iLargest==0 ) 
dd80: 72 65 74 75 72 6e 3b 0a 20 20 20 20 64 65 73 74  return;.    dest
dd90: 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
dda0: 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 70 54  se, iLargest, pT
ddb0: 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 69 44  ab->iDb);.    iD
ddc0: 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67  estroyed = iLarg
ddd0: 65 73 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  est;.  }.#endif.
dde0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
ddf0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
de00: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
de10: 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73  f a DROP TABLE s
de20: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61  tatement..** pNa
de30: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
de40: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
de50: 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f  e dropped..*/.vo
de60: 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61  id sqlite3DropTa
de70: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
de80: 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
de90: 65 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a  e, int isView){.
dea0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
deb0: 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
dec0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
ded0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
dee0: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
def0: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  nErr || sqlite3_
df00: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
df10: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
df20: 61 62 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  able;.  assert( 
df30: 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
df40: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
df50: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
df60: 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  arse, pName->a[0
df70: 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
df80: 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
df90: 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ..  if( pTab==0 
dfa0: 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70  ) goto exit_drop
dfb0: 5f 74 61 62 6c 65 3b 0a 20 20 69 44 62 20 3d 20  _table;.  iDb = 
dfc0: 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 61 73 73  pTab->iDb;.  ass
dfd0: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
dfe0: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69  Db<db->nDb );.#i
dff0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e000: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
e010: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
e020: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
e030: 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
e040: 54 41 42 4c 45 28 70 54 61 62 2d 3e 69 44 62 29  TABLE(pTab->iDb)
e050: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
e060: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
e070: 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65  pTab->iDb].zName
e080: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
e090: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
e0a0: 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
e0b0: 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29  , zTab, 0, zDb))
e0c0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
e0d0: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
e0e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
e0f0: 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
e100: 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
e110: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
e120: 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  DROP_TEMP_VIEW;.
e130: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e140: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
e150: 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20  TE_DROP_VIEW;.  
e160: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
e170: 0a 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d  .      if( iDb==
e180: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
e190: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
e1a0: 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  TEMP_TABLE;.    
e1b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e1c0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
e1d0: 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ROP_TABLE;.     
e1e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
e1f0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
e200: 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
e210: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20  pTab->zName, 0, 
e220: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
e230: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
e240: 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  le;.    }.    if
e250: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
e260: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
e270: 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e  E_DELETE, pTab->
e280: 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
e290: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
e2a0: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
e2b0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
e2c0: 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f   if( pTab->readO
e2d0: 6e 6c 79 20 7c 7c 20 70 54 61 62 3d 3d 64 62 2d  nly || pTab==db-
e2e0: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 65 71 54 61  >aDb[iDb].pSeqTa
e2f0: 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
e300: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
e310: 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
e320: 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
e330: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
e340: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
e350: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  _table;.  }.  if
e360: 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62  ( isView && pTab
e370: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
e380: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
e390: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65  Msg(pParse, "use
e3a0: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64   DROP TABLE to d
e3b0: 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c  elete table %s",
e3c0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
e3d0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
e3e0: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  p_table;.  }.  i
e3f0: 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54  f( !isView && pT
e400: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
e410: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
e420: 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
e430: 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c  DROP VIEW to del
e440: 65 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54  ete view %s", pT
e450: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
e460: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
e470: 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  able;.  }..  /* 
e480: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
e490: 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
e4a0: 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
e4b0: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
e4c0: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
e4d0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
e4e0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
e4f0: 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20   ){.    Trigger 
e500: 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 69  *pTrigger;.    i
e510: 6e 74 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69  nt iDb = pTab->i
e520: 44 62 3b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  Db;.    Db *pDb 
e530: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
e540: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
e550: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
e560: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
e570: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c  ..    /* Drop al
e580: 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63  l triggers assoc
e590: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
e5a0: 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
e5b0: 65 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20  ed. Code.    ** 
e5c0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  is generated to 
e5d0: 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  remove entries f
e5e0: 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  rom sqlite_maste
e5f0: 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20  r and/or.    ** 
e600: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
e610: 65 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  er if required..
e620: 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67      */.    pTrig
e630: 67 65 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69  ger = pTab->pTri
e640: 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28  gger;.    while(
e650: 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
e660: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
e670: 67 65 72 2d 3e 69 44 62 3d 3d 69 44 62 20 7c 7c  ger->iDb==iDb ||
e680: 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d   pTrigger->iDb==
e690: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
e6a0: 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  e3DropTriggerPtr
e6b0: 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
e6c0: 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 54 72  r, 1);.      pTr
e6d0: 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72  igger = pTrigger
e6e0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a  ->pNext;.    }..
e6f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e700: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
e710: 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  T.    /* Remove 
e720: 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74  any entries of t
e730: 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
e740: 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  ce table associa
e750: 74 65 64 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  ted with.    ** 
e760: 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
e770: 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73  dropped. This is
e780: 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65   done before the
e790: 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65   table is droppe
e7a0: 64 0a 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20  d.    ** at the 
e7b0: 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20  btree level, in 
e7c0: 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  case the sqlite_
e7d0: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e  sequence table n
e7e0: 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  eeds to.    ** m
e7f0: 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  ove as a result 
e800: 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e  of the drop (can
e810: 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
e820: 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20  vacuum mode)..  
e830: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61    */.    if( pTa
e840: 62 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20  b->autoInc ){.  
e850: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
e860: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
e870: 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
e880: 52 4f 4d 20 25 73 2e 73 71 6c 69 74 65 5f 73 65  ROM %s.sqlite_se
e890: 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d  quence WHERE nam
e8a0: 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 70  e=%Q",.        p
e8b0: 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  Db->zName, pTab-
e8c0: 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
e8d0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
e8e0: 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51    /* Drop all SQ
e8f0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
e900: 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72  e and index entr
e910: 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74  ies that refer t
e920: 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62  o the.    ** tab
e930: 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20  le. The program 
e940: 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75  name loops throu
e950: 67 68 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  gh the master ta
e960: 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a  ble and deletes.
e970: 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77      ** every row
e980: 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
e990: 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73  a table of the s
e9a0: 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
e9b0: 6f 6e 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a  one being.    **
e9c0: 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65   dropped. Trigge
e9d0: 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  rs are handled s
e9e0: 65 70 65 72 61 74 65 6c 79 20 62 65 63 61 75 73  eperately becaus
e9f0: 65 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20  e a trigger can 
ea00: 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  be.    ** create
ea10: 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61  d in the temp da
ea20: 74 61 62 61 73 65 20 74 68 61 74 20 72 65 66 65  tabase that refe
ea30: 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e  rs to a table in
ea40: 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20   another.    ** 
ea50: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
ea60: 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
ea70: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
ea80: 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
ea90: 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
eaa0: 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e  E tbl_name=%Q an
eab0: 64 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72  d type!='trigger
eac0: 27 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d  '",.        pDb-
ead0: 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  >zName, SCHEMA_T
eae0: 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d  ABLE(iDb), pTab-
eaf0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  >zName);.    if(
eb00: 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20   !isView ){.    
eb10: 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70    destroyTable(p
eb20: 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
eb30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f    }..    /* Remo
eb40: 76 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74  ve the table ent
eb50: 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73  ry from SQLite's
eb60: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
eb70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
eb80: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
eb90: 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c  _DropTable, iDb,
eba0: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   0, pTab->zName,
ebb0: 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
ebc0: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62  eViewResetAll(db
ebd0: 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72  , iDb);..exit_dr
ebe0: 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69  op_table:.  sqli
ebf0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
ec00: 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pName);.}../*.*
ec10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
ec20: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
ec30: 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e  te a new foreign
ec40: 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c   key on the tabl
ec50: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  e.** currently u
ec60: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
ec70: 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74  n.  pFromCol det
ec80: 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f  ermines which co
ec90: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
eca0: 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f  current table po
ecb0: 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69  int to the forei
ecc0: 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f  gn key.  If pFro
ecd0: 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  mCol==0 then.** 
ece0: 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20  connect the key 
ecf0: 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  to the last colu
ed00: 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54  mn inserted.  pT
ed10: 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
ed20: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65  .** the table re
ed30: 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43  ferred to.  pToC
ed40: 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ol is a list of 
ed50: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74  tables in the ot
ed60: 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65  her.** pTo table
ed70: 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67   that the foreig
ed80: 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e  n key points to.
ed90: 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
eda0: 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
edb0: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
edc0: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
edd0: 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
ede0: 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
edf0: 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
ee00: 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
ee10: 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
ee20: 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
ee30: 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
ee40: 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
ee50: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
ee60: 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
ee70: 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
ee80: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
ee90: 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20  field.  The new 
eea0: 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c  FKey.** is not l
eeb0: 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61  inked into db->a
eec0: 46 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f 69  FKey at this poi
eed0: 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e  nt - that does n
eee0: 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74  ot happen.** unt
eef0: 69 6c 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  il sqlite3EndTab
ef00: 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  le()..**.** The 
ef10: 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73  foreign key is s
ef20: 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45  et for IMMEDIATE
ef30: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20   processing.  A 
ef40: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a  subsequent call.
ef50: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66  ** to sqlite3Def
ef60: 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d  erForeignKey() m
ef70: 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73  ight change this
ef80: 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f   to DEFERRED..*/
ef90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
efa0: 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20  ateForeignKey(. 
efb0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
efc0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
efd0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
efe0: 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c  prList *pFromCol
eff0: 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e  ,  /* Columns in
f000: 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74   this table that
f010: 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20   point to other 
f020: 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  table */.  Token
f030: 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20   *pTo,          
f040: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
f050: 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
f060: 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c  ExprList *pToCol
f070: 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ,    /* Columns 
f080: 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  in the other tab
f090: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
f0a0: 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
f0b0: 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  Conflict resolut
f0c0: 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20  ion algorithms. 
f0d0: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
f0e0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
f0f0: 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46  N_KEY.  FKey *pF
f100: 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65  Key = 0;.  Table
f110: 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   *p = pParse->pN
f120: 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e  ewTable;.  int n
f130: 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Byte;.  int i;. 
f140: 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61   int nCol;.  cha
f150: 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28  r *z;..  assert(
f160: 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28   pTo!=0 );.  if(
f170: 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
f180: 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f  >nErr ) goto fk_
f190: 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  end;.  if( pFrom
f1a0: 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Col==0 ){.    in
f1b0: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c  t iCol = p->nCol
f1c0: 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  -1;.    if( iCol
f1d0: 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  <0 ) goto fk_end
f1e0: 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c  ;.    if( pToCol
f1f0: 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
f200: 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  r!=1 ){.      sq
f210: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
f220: 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b  arse, "foreign k
f230: 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20  ey on %s".      
f240: 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65     " should refe
f250: 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63  rence only one c
f260: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25  olumn of table %
f270: 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e  T",.         p->
f280: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
f290: 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f  , pTo);.      go
f2a0: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d  to fk_end;.    }
f2b0: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20  .    nCol = 1;. 
f2c0: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f   }else if( pToCo
f2d0: 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
f2e0: 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  pr!=pFromCol->nE
f2f0: 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
f300: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
f310: 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62  e,.        "numb
f320: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
f330: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65   foreign key doe
f340: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
f350: 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20  number of ".    
f360: 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20      "columns in 
f370: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
f380: 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f  able");.    goto
f390: 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65   fk_end;.  }else
f3a0: 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72  {.    nCol = pFr
f3b0: 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20  omCol->nExpr;.  
f3c0: 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  }.  nByte = size
f3d0: 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f  of(*pFKey) + nCo
f3e0: 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e  l*sizeof(pFKey->
f3f0: 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e  aCol[0]) + pTo->
f400: 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f  n + 1;.  if( pTo
f410: 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
f420: 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45  =0; i<pToCol->nE
f430: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
f440: 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e   nByte += strlen
f450: 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
f460: 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a  ame) + 1;.    }.
f470: 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71    }.  pFKey = sq
f480: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74  liteMalloc( nByt
f490: 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79  e );.  if( pFKey
f4a0: 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  ==0 ) goto fk_en
f4b0: 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f  d;.  pFKey->pFro
f4c0: 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e  m = p;.  pFKey->
f4d0: 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70  pNextFrom = p->p
f4e0: 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61  FKey;.  z = (cha
f4f0: 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20  r*)&pFKey[1];.  
f500: 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73  pFKey->aCol = (s
f510: 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a  truct sColMap*)z
f520: 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28  ;.  z += sizeof(
f530: 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a  struct sColMap)*
f540: 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a  nCol;.  pFKey->z
f550: 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79  To = z;.  memcpy
f560: 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d  (z, pTo->z, pTo-
f570: 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d  >n);.  z[pTo->n]
f580: 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f   = 0;.  z += pTo
f590: 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e  ->n+1;.  pFKey->
f5a0: 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70  pNextTo = 0;.  p
f5b0: 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  FKey->nCol = nCo
f5c0: 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  l;.  if( pFromCo
f5d0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65  l==0 ){.    pFKe
f5e0: 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d  y->aCol[0].iFrom
f5f0: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
f600: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
f610: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
f620: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  {.      int j;. 
f630: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
f640: 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  p->nCol; j++){. 
f650: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
f660: 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f  e3StrICmp(p->aCo
f670: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f  l[j].zName, pFro
f680: 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
f690: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
f6a0: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
f6b0: 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20  .iFrom = j;.    
f6c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f6d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f6e0: 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e       if( j>=p->n
f6f0: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Col ){.        s
f700: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f710: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
f720: 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d    "unknown colum
f730: 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65  n \"%s\" in fore
f740: 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
f750: 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  on", .          
f760: 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
f770: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
f780: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
f790: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
f7a0: 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
f7b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
f7c0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
f7d0: 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54  nt n = strlen(pT
f7e0: 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
f7f0: 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  );.      pFKey->
f800: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a  aCol[i].zCol = z
f810: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
f820: 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  , pToCol->a[i].z
f830: 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  Name, n);.      
f840: 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[n] = 0;.      
f850: 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a  z += n+1;.    }.
f860: 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44    }.  pFKey->isD
f870: 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70  eferred = 0;.  p
f880: 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66  FKey->deleteConf
f890: 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66 66 3b   = flags & 0xff;
f8a0: 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61 74 65  .  pFKey->update
f8b0: 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e  Conf = (flags >>
f8c0: 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20 20 70   8 ) & 0xff;.  p
f8d0: 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66  FKey->insertConf
f8e0: 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31 36 20   = (flags >> 16 
f8f0: 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20  ) & 0xff;..  /* 
f900: 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e  Link the foreign
f910: 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c   key to the tabl
f920: 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74  e as the last st
f930: 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46  ep..  */.  p->pF
f940: 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70  Key = pFKey;.  p
f950: 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e  FKey = 0;..fk_en
f960: 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  d:.  sqliteFree(
f970: 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f  pFKey);.#endif /
f980: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
f990: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
f9a0: 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  EY) */.  sqlite3
f9b0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
f9c0: 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  FromCol);.  sqli
f9d0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
f9e0: 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a  e(pToCol);.}../*
f9f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
fa00: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
fa10: 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  an INITIALLY IMM
fa20: 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41  EDIATE or INITIA
fa30: 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20  LLY DEFERRED.** 
fa40: 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61  clause is seen a
fa50: 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65  s part of a fore
fa60: 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
fa70: 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72  on.  The isDefer
fa80: 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  red.** parameter
fa90: 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41   is 1 for INITIA
faa0: 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64  LLY DEFERRED and
fab0: 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   0 for INITIALLY
fac0: 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54   IMMEDIATE..** T
fad0: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
fae0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
faf0: 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e   created foreign
fb00: 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64   key is adjusted
fb10: 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  .** accordingly.
fb20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
fb30: 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
fb40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
fb50: 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a  nt isDeferred){.
fb60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fb70: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
fb80: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
fb90: 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20   FKey *pFKey;.  
fba0: 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72  if( (pTab = pPar
fbb0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
fbc0: 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54  0 || (pFKey = pT
fbd0: 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20  ab->pFKey)==0 ) 
fbe0: 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d  return;.  pFKey-
fbf0: 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 69 73  >isDeferred = is
fc00: 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66  Deferred;.#endif
fc10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
fc20: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
fc30: 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69  l erase and refi
fc40: 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20  ll index *pIdx. 
fc50: 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64   This is.** used
fc60: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   to initialize a
fc70: 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69   newly created i
fc80: 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d  ndex or to recom
fc90: 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  pute the.** cont
fca0: 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  ent of an index 
fcb0: 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61  in response to a
fcc0: 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
fcd0: 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f  ..**.** if memRo
fce0: 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65  otPage is not ne
fcf0: 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73  gative, it means
fd00: 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
fd10: 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61  is newly.** crea
fd20: 74 65 64 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79  ted.  The memory
fd30: 20 63 65 6c 6c 20 73 70 65 63 69 66 69 65 64 20   cell specified 
fd40: 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63  by memRootPage c
fd50: 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72  ontains the.** r
fd60: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
fd70: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49  of the index.  I
fd80: 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73  f memRootPage is
fd90: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a   negative, then.
fda0: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72  ** the index alr
fdb0: 65 61 64 79 20 65 78 69 73 74 73 20 61 6e 64 20  eady exists and 
fdc0: 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65 64 20  must be cleared 
fdd0: 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66  before being ref
fde0: 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65  illed and.** the
fdf0: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
fe00: 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69  r of the index i
fe10: 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e  s taken from pIn
fe20: 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74  dex->tnum..*/.st
fe30: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
fe40: 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72  3RefillIndex(Par
fe50: 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
fe60: 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d  x *pIndex, int m
fe70: 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54  emRootPage){.  T
fe80: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
fe90: 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a  dex->pTable;  /*
fea0: 20 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   The table that 
feb0: 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  is indexed */.  
fec0: 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73  int iTab = pPars
fed0: 65 2d 3e 6e 54 61 62 3b 20 20 20 20 20 20 20 2f  e->nTab;       /
fee0: 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75  * Btree cursor u
fef0: 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  sed for pTab */.
ff00: 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61    int iIdx = pPa
ff10: 72 73 65 2d 3e 6e 54 61 62 2b 31 3b 20 20 20 20  rse->nTab+1;    
ff20: 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72   /* Btree cursor
ff30: 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78   used for pIndex
ff40: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b   */.  int addr1;
ff50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff60: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
ff70: 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a  of top of loop *
ff80: 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20  /.  int tnum;   
ff90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffa0: 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
ffb0: 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64  of index */.  Vd
ffc0: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
ffd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ffe0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
fff0: 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  to this virtual 
10000 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  machine */.  int
10010 20 69 73 55 6e 69 71 75 65 3b 20 20 20 20 20 20   isUnique;      
10020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10030 72 75 65 20 66 6f 72 20 61 20 75 6e 69 71 75 65  rue for a unique
10040 20 69 6e 64 65 78 20 2a 2f 0a 0a 23 69 66 6e 64   index */..#ifnd
10050 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
10060 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69  UTHORIZATION.  i
10070 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
10080 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
10090 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64  TE_REINDEX, pInd
100a0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20  ex->zName, 0,.  
100b0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
100c0 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d  aDb[pIndex->iDb]
100d0 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20  .zName ) ){.    
100e0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
100f0 69 66 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  if..  v = sqlite
10100 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
10110 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
10120 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d  eturn;.  if( mem
10130 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20  RootPage>=0 ){. 
10140 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10150 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
10160 64 2c 20 6d 65 6d 52 6f 6f 74 50 61 67 65 2c 20  d, memRootPage, 
10170 30 29 3b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 30  0);.    tnum = 0
10180 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
10190 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e  num = pIndex->tn
101a0 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  um;.    sqlite3V
101b0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
101c0 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 70 49 6e 64  lear, tnum, pInd
101d0 65 78 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a 20 20  ex->iDb);.  }.  
101e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
101f0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
10200 70 49 6e 64 65 78 2d 3e 69 44 62 2c 20 30 29 3b  pIndex->iDb, 0);
10210 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70  .  sqlite3VdbeOp
10220 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  3(v, OP_OpenWrit
10230 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 0a 20  e, iIdx, tnum,. 
10240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10250 20 20 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65     (char*)&pInde
10260 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b  x->keyInfo, P3_K
10270 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74  EYINFO);.  sqlit
10280 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10290 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d  P_Integer, pTab-
102a0 3e 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69  >iDb, 0);.  sqli
102b0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
102c0 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61  OP_OpenRead, iTa
102d0 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a  b, pTab->tnum);.
102e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
102f0 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  Op(v, OP_SetNumC
10300 6f 6c 75 6d 6e 73 2c 20 69 54 61 62 2c 20 70 54  olumns, iTab, pT
10310 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 61 64 64  ab->nCol);.  add
10320 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
10330 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
10340 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  nd, iTab, 0);.  
10350 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
10360 6e 64 65 78 4b 65 79 28 76 2c 20 70 49 6e 64 65  ndexKey(v, pInde
10370 78 2c 20 69 54 61 62 29 3b 0a 20 20 69 73 55 6e  x, iTab);.  isUn
10380 69 71 75 65 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  ique = pIndex->o
10390 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b  nError!=OE_None;
103a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
103b0 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 50 75 74  dOp(v, OP_IdxPut
103c0 2c 20 69 49 64 78 2c 20 69 73 55 6e 69 71 75 65  , iIdx, isUnique
103d0 29 3b 0a 20 20 69 66 28 20 69 73 55 6e 69 71 75  );.  if( isUniqu
103e0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
103f0 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
10400 2d 31 2c 20 22 69 6e 64 65 78 65 64 20 63 6f 6c  -1, "indexed col
10410 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69  umns are not uni
10420 71 75 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29  que", P3_STATIC)
10430 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
10440 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
10450 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31  ext, iTab, addr1
10460 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  +1);.  sqlite3Vd
10470 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
10480 64 72 31 2c 20 73 71 6c 69 74 65 33 56 64 62 65  dr1, sqlite3Vdbe
10490 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b  CurrentAddr(v));
104a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
104b0 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
104c0 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c   iTab, 0);.  sql
104d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
104e0 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c   OP_Close, iIdx,
104f0 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   0);.}../*.** Cr
10500 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78  eate a new index
10510 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c   for an SQL tabl
10520 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65  e.  pName1.pName
10530 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  2 is the name of
10540 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61   the index .** a
10550 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74  nd pTblList is t
10560 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
10570 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
10580 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74  be indexed.  Bot
10590 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55  h will .** be NU
105a0 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79  LL for a primary
105b0 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78   key or an index
105c0 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
105d0 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a   to satisfy a.**
105e0 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
105f0 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61  nt.  If pTable a
10600 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55  nd pIndex are NU
10610 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e  LL, use pParse->
10620 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20  pNewTable.** as 
10630 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
10640 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65  indexed.  pParse
10650 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61  ->pNewTable is a
10660 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a   table that is.*
10670 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  * currently bein
10680 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  g constructed by
10690 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
106a0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
106b0 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
106c0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
106d0 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73  e indexed.  pLis
106e0 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  t will be NULL i
106f0 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70  f this.** is a p
10700 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e  rimary key or un
10710 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20  ique-constraint 
10720 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
10730 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a  nt column added.
10740 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ** to the table 
10750 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
10760 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a  construction.  .
10770 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
10780 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61  reateIndex(.  Pa
10790 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
107a0 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74   /* All informat
107b0 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70  ion about this p
107c0 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  arse */.  Token 
107d0 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20  *pName1,     /* 
107e0 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e  First part of in
107f0 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
10800 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
10810 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
10820 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
10830 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20  index name. May 
10840 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63  be NULL */.  Src
10850 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20  List *pTblName, 
10860 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65  /* Table to inde
10870 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70  x. Use pParse->p
10880 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f  NewTable if 0 */
10890 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
108a0 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20  st,   /* A list 
108b0 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
108c0 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
108d0 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
108e0 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45   /* OE_Abort, OE
108f0 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c  _Ignore, OE_Repl
10900 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20  ace, or OE_None 
10910 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61  */.  Token *pSta
10920 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43  rt,     /* The C
10930 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
10940 20 62 65 67 69 6e 73 20 61 20 43 52 45 41 54 45   begins a CREATE
10950 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
10960 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e   */.  Token *pEn
10970 64 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  d        /* The 
10980 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20  ")" that closes 
10990 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58  the CREATE INDEX
109a0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b   statement */.){
109b0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
109c0 20 30 3b 20 20 20 2f 2a 20 54 61 62 6c 65 20 74   0;   /* Table t
109d0 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
109e0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
109f0 3d 20 30 3b 20 2f 2a 20 54 68 65 20 69 6e 64 65  = 0; /* The inde
10a00 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  x to be created 
10a10 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
10a20 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   = 0;.  int i, j
10a30 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64  ;.  Token nullId
10a40 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b  ;    /* Fake tok
10a50 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20  en for an empty 
10a60 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46  ID list */.  DbF
10a70 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 2f 2a  ixer sFix;    /*
10a80 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64   For assigning d
10a90 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f  atabase names to
10aa0 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   pTable */.  int
10ab0 20 69 73 54 65 6d 70 3b 20 20 20 20 20 20 2f 2a   isTemp;      /*
10ac0 20 54 72 75 65 20 66 6f 72 20 61 20 74 65 6d 70   True for a temp
10ad0 6f 72 61 72 79 20 69 6e 64 65 78 20 2a 2f 0a 20  orary index */. 
10ae0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
10af0 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 6e  Parse->db;..  in
10b00 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
10b10 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
10b20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
10b30 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a   being written *
10b40 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
10b50 20 3d 20 30 3b 20 2f 2a 20 55 6e 71 75 61 6c 69   = 0; /* Unquali
10b60 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65  fied name of the
10b70 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65   index to create
10b80 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73   */..  if( pPars
10b90 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
10ba0 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
10bb0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
10bc0 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a  ate_index;..  /*
10bd0 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74  .  ** Find the t
10be0 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
10bf0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74  be indexed.  Ret
10c00 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74  urn early if not
10c10 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69   found..  */.  i
10c20 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
10c30 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  {..    /* Use th
10c40 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78  e two-part index
10c50 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
10c60 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ne the database 
10c70 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63  .    ** to searc
10c80 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  h for the table.
10c90 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65   'Fix' the table
10ca0 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62   name to this db
10cb0 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c  .    ** before l
10cc0 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61  ooking up the ta
10cd0 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
10ce0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26  assert( pName1 &
10cf0 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20  & pName2 );.    
10d00 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
10d10 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
10d20 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
10d30 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66   &pName);.    if
10d40 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65  ( iDb<0 ) goto e
10d50 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10d60 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
10d70 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20   index name was 
10d80 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65  unqualified, che
10d90 63 6b 20 69 66 20 74 68 65 20 74 68 65 20 74 61  ck if the the ta
10da0 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  ble.    ** is a 
10db0 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73  temp table. If s
10dc0 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  o, set the datab
10dd0 61 73 65 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2f  ase to 1..    */
10de0 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
10df0 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70  te3SrcListLookup
10e00 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d  (pParse, pTblNam
10e10 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d  e);.    if( pNam
10e20 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d  e2 && pName2->n=
10e30 3d 30 20 26 26 20 70 54 61 62 20 26 26 20 70 54  =0 && pTab && pT
10e40 61 62 2d 3e 69 44 62 3d 3d 31 20 29 7b 0a 20 20  ab->iDb==1 ){.  
10e50 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20      iDb = 1;.   
10e60 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69   }..    if( sqli
10e70 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
10e80 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
10e90 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26  index", pName) &
10ea0 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  &.        sqlite
10eb0 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69  3FixSrcList(&sFi
10ec0 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20  x, pTblName).   
10ed0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
10ee0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10ef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
10f00 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
10f10 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
10f20 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61  blName->a[0].zNa
10f30 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62  me, .        pTb
10f40 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  lName->a[0].zDat
10f50 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20  abase);.    if( 
10f60 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69  !pTab ) goto exi
10f70 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
10f80 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3d      assert( iDb=
10f90 3d 70 54 61 62 2d 3e 69 44 62 20 29 3b 0a 20 20  =pTab->iDb );.  
10fa0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
10fb0 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  t( pName==0 );. 
10fc0 20 20 20 70 54 61 62 20 3d 20 20 70 50 61 72 73     pTab =  pPars
10fd0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
10fe0 20 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44    iDb = pTab->iD
10ff0 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54  b;.  }..  if( pT
11000 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  ab==0 || pParse-
11010 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69  >nErr ) goto exi
11020 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11030 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64    if( pTab->read
11040 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  Only ){.    sqli
11050 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
11060 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
11070 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
11080 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
11090 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
110a0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
110b0 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
110c0 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
110d0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
110e0 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e  se, "views may n
110f0 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
11100 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
11110 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
11120 0a 20 20 69 73 54 65 6d 70 20 3d 20 70 54 61 62  .  isTemp = pTab
11130 2d 3e 69 44 62 3d 3d 31 3b 0a 0a 20 20 2f 2a 0a  ->iDb==1;..  /*.
11140 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61    ** Find the na
11150 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  me of the index.
11160 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72    Make sure ther
11170 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
11180 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e   another.  ** in
11190 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74  dex or table wit
111a0 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
111b0 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63    .  **.  ** Exc
111c0 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61  eption:  If we a
111d0 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e  re reading the n
111e0 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e  ames of permanen
111f0 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74  t indices from t
11200 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d  he.  ** sqlite_m
11210 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63  aster table (bec
11220 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  ause some other 
11230 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20  process changed 
11240 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a  the schema) and.
11250 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20    ** one of the 
11260 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c  index names coll
11270 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61  ides with the na
11280 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72  me of a temporar
11290 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20  y table or.  ** 
112a0 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77  index, then we w
112b0 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
112c0 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64  process this ind
112d0 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ex..  **.  ** If
112e0 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61   pName==0 it mea
112f0 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20  ns that we are. 
11300 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68   ** dealing with
11310 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
11320 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
11330 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f  int.  We have to
11340 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a   invent our.  **
11350 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   own name..  */.
11360 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
11370 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
11380 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
11390 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
113a0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
113b0 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
113c0 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74  rse) ) goto exit
113d0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
113e0 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
113f0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
11400 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
11410 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
11420 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
11430 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
11440 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
11450 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
11460 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
11470 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
11480 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   ){.      Index 
11490 2a 70 49 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20  *pISameName;    
114a0 2f 2a 20 41 6e 6f 74 68 65 72 20 69 6e 64 65 78  /* Another index
114b0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
114c0 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62  ame */.      Tab
114d0 6c 65 20 2a 70 54 53 61 6d 65 4e 61 6d 65 3b 20  le *pTSameName; 
114e0 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 77 69     /* A table wi
114f0 74 68 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  th same name as 
11500 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
11510 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
11520 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
11530 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
11540 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
11550 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 66 28 20  ndex;.      if( 
11560 28 70 49 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71  (pISameName = sq
11570 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
11580 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44  b, zName, db->aD
11590 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 29 21 3d  b[iDb].zName))!=
115a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
115b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
115c0 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61  rse, "index %s a
115d0 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
115e0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
115f0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
11600 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
11610 20 20 20 20 20 20 69 66 28 20 28 70 54 53 61 6d        if( (pTSam
11620 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 46  eName = sqlite3F
11630 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
11640 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20  me, 0))!=0 ){.  
11650 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
11660 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
11670 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
11680 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73  a table named %s
11690 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
116a0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
116b0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
116c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
116d0 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29 7b   if( pName==0 ){
116e0 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33  .    char zBuf[3
116f0 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  0];.    int n;. 
11700 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b     Index *pLoop;
11710 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
11720 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31  Tab->pIndex, n=1
11730 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
11740 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b  Loop->pNext, n++
11750 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28  ){}.    sprintf(
11760 7a 42 75 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20  zBuf,"_%d",n);. 
11770 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20     zName = 0;.  
11780 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
11790 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ng(&zName, "sqli
117a0 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20  te_autoindex_", 
117b0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75  pTab->zName, zBu
117c0 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  f, (char*)0);.  
117d0 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
117e0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
117f0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
11800 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74  /* Check for aut
11810 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72  horization to cr
11820 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20  eate an index.. 
11830 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
11840 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
11850 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f  ATION.  {.    co
11860 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
11870 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44  db->aDb[pTab->iD
11880 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b].zName;.    if
11890 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
118a0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
118b0 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
118c0 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20  _TABLE(isTemp), 
118d0 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
118e0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
118f0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
11900 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52     i = SQLITE_CR
11910 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20  EATE_INDEX;.    
11920 69 66 28 20 69 73 54 65 6d 70 20 29 20 69 20 3d  if( isTemp ) i =
11930 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
11940 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
11950 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
11960 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a  eck(pParse, i, z
11970 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
11980 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
11990 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
119a0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
119b0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
119c0 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20  If pList==0, it 
119d0 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69  means this routi
119e0 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ne was called to
119f0 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a   make a primary.
11a00 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20    ** key out of 
11a10 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
11a20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
11a30 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
11a40 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63  ction..  ** So c
11a50 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73  reate a fake lis
11a60 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68  t to simulate th
11a70 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  is..  */.  if( p
11a80 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  List==0 ){.    n
11a90 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d 3e  ullId.z = pTab->
11aa0 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d  aCol[pTab->nCol-
11ab0 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75  1].zName;.    nu
11ac0 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28  llId.n = strlen(
11ad0 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70  nullId.z);.    p
11ae0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
11af0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  prListAppend(0, 
11b00 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20  0, &nullId);.   
11b10 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
11b20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
11b30 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
11b40 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  * .  ** Allocate
11b50 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63   the index struc
11b60 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49  ture. .  */.  pI
11b70 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c  ndex = sqliteMal
11b80 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e 64 65  loc( sizeof(Inde
11b90 78 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  x) + strlen(zNam
11ba0 65 29 20 2b 20 31 20 2b 0a 20 20 20 20 20 20 20  e) + 1 +.       
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bc0 20 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20   (sizeof(int) + 
11bd0 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
11be0 29 2a 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  )*pList->nExpr )
11bf0 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d  ;.  if( pIndex==
11c00 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
11c10 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49  eate_index;.  pI
11c20 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  ndex->aiColumn =
11c30 20 28 69 6e 74 2a 29 26 70 49 6e 64 65 78 2d 3e   (int*)&pIndex->
11c40 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 70 4c  keyInfo.aColl[pL
11c50 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 70  ist->nExpr];.  p
11c60 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28  Index->zName = (
11c70 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 61  char*)&pIndex->a
11c80 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e  iColumn[pList->n
11c90 45 78 70 72 5d 3b 0a 20 20 73 74 72 63 70 79 28  Expr];.  strcpy(
11ca0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  pIndex->zName, z
11cb0 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d  Name);.  pIndex-
11cc0 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a  >pTable = pTab;.
11cd0 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d    pIndex->nColum
11ce0 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
11cf0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ;.  pIndex->onEr
11d00 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20  ror = onError;. 
11d10 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
11d20 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20  ex = pName==0;. 
11d30 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 3d 20 69   pIndex->iDb = i
11d40 44 62 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74  Db;..  /* Scan t
11d50 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
11d60 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74  columns of the t
11d70 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
11d80 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64  ed and.  ** load
11d90 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69   the column indi
11da0 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64  ces into the Ind
11db0 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  ex structure.  R
11dc0 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20  eport an error. 
11dd0 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d   ** if any colum
11de0 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  n is not found..
11df0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
11e00 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
11e10 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  i++){.    for(j=
11e20 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
11e30 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
11e40 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
11e50 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
11e60 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  e, pTab->aCol[j]
11e70 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
11e80 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
11e90 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  ( j>=pTab->nCol 
11ea0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11eb0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11ec0 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 6e   "table %s has n
11ed0 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25  o column named %
11ee0 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  s",.        pTab
11ef0 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69 73 74 2d 3e  ->zName, pList->
11f00 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
11f10 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
11f20 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
11f30 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  .    pIndex->aiC
11f40 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20  olumn[i] = j;.  
11f50 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
11f60 5d 2e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ].pExpr ){.     
11f70 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
11f80 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c  a[i].pExpr->pCol
11f90 6c 20 29 3b 0a 20 20 20 20 20 20 70 49 6e 64 65  l );.      pInde
11fa0 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
11fb0 5b 69 5d 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  [i] = pList->a[i
11fc0 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a  ].pExpr->pColl;.
11fd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11fe0 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f   pIndex->keyInfo
11ff0 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 54 61 62  .aColl[i] = pTab
12000 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b  ->aCol[j].pColl;
12010 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
12020 74 28 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  t( pIndex->keyIn
12030 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 29 3b 0a 20  fo.aColl[i] );. 
12040 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
12050 2e 62 75 73 79 20 26 26 20 0a 20 20 20 20 20 20  .busy && .      
12060 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f    sqlite3CheckCo
12070 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
12080 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  ndex->keyInfo.aC
12090 6f 6c 6c 5b 69 5d 29 20 0a 20 20 20 20 29 7b 0a  oll[i]) .    ){.
120a0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
120b0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
120c0 20 20 7d 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78    }.  }.  pIndex
120d0 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64  ->keyInfo.nField
120e0 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
120f0 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50  ..  if( pTab==pP
12100 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
12110 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72  ){.    /* This r
12120 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20  outine has been 
12130 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
12140 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
12150 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20  dex as a.    ** 
12160 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d  result of a PRIM
12170 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
12180 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f  E clause on a co
12190 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c  lumn definition,
121a0 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49   or.    ** a PRI
121b0 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
121c0 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77  UE clause follow
121d0 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64  ing the column d
121e0 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20  efinitions..    
121f0 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a  ** i.e. one of:.
12200 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52      **.    ** CR
12210 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 20 50  EATE TABLE t(x P
12220 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a  RIMARY KEY, y);.
12230 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41      ** CREATE TA
12240 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51  BLE t(x, y, UNIQ
12250 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a  UE(x, y));.    *
12260 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20  *.    ** Either 
12270 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  way, check to se
12280 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 61  e if the table a
12290 6c 72 65 61 64 79 20 68 61 73 20 73 75 63 68 20  lready has such 
122a0 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20  an index. If.   
122b0 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f   ** so, don't bo
122c0 74 68 65 72 20 63 72 65 61 74 69 6e 67 20 74 68  ther creating th
122d0 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c  is one. This onl
122e0 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20  y applies to.   
122f0 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
12300 79 20 63 72 65 61 74 65 64 20 69 6e 64 69 63 65  y created indice
12310 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20  s. Users can do 
12320 61 73 20 74 68 65 79 20 77 69 73 68 20 77 69 74  as they wish wit
12330 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69  h.    ** explici
12340 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a  t indices..    *
12350 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
12360 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
12370 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
12380 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
12390 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
123a0 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   k;.      assert
123b0 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
123c0 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20  =OE_None );.    
123d0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
123e0 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20  autoIndex );.   
123f0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65     assert( pInde
12400 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
12410 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  one );..      if
12420 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21  ( pIdx->nColumn!
12430 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  =pIndex->nColumn
12440 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
12450 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49     for(k=0; k<pI
12460 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b  dx->nColumn; k++
12470 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
12480 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  Idx->aiColumn[k]
12490 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  !=pIndex->aiColu
124a0 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20  mn[k] ) break;. 
124b0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
124c0 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b  >keyInfo.aColl[k
124d0 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  ]!=pIndex->keyIn
124e0 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20 29 20 62 72  fo.aColl[k] ) br
124f0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
12500 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e     if( k==pIdx->
12510 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
12520 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
12530 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e  rror!=pIndex->on
12540 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  Error ){.       
12550 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74     /* This const
12560 72 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68  raint creates th
12570 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20  e same index as 
12580 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  a previous.     
12590 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
125a0 6e 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d  nt specified som
125b0 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52  ewhere in the CR
125c0 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
125d0 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20  ment..          
125e0 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f  ** However the O
125f0 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
12600 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  es are different
12610 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a  . If both this .
12620 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
12630 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20  straint and the 
12640 70 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c  previous equival
12650 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68  ent constraint h
12660 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20  ave explicit.   
12670 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e         ** ON CON
12680 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68  FLICT clauses th
12690 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20  is is an error. 
126a0 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74  Otherwise, use t
126b0 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
126c0 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69  explicitly speci
126d0 66 69 65 64 20 62 65 68 61 76 69 6f 75 72 20 66  fied behaviour f
126e0 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  or the index..  
126f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
12700 20 20 20 20 20 69 66 28 20 21 28 70 49 64 78 2d       if( !(pIdx-
12710 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
12720 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e  ault || pIndex->
12730 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
12740 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ult) ){.        
12750 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12760 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
12780 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e  nflicting ON CON
12790 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73 70  FLICT clauses sp
127a0 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20  ecified", 0);.  
127b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
127c0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
127d0 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
127e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
127f0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d   pIdx->onError =
12800 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
12810 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
12820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12830 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12840 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
12850 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12860 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64  Link the new Ind
12870 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ex structure to 
12880 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f  its table and to
12890 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20   the other.  ** 
128a0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
128b0 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a  se structures. .
128c0 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
128d0 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
128e0 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20  Index *p;.    p 
128f0 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
12900 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 49 6e  ert(&db->aDb[pIn
12910 64 65 78 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73  dex->iDb].idxHas
12920 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  h, .            
12930 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
12940 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  dex->zName, strl
12950 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  en(pIndex->zName
12960 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  )+1, pIndex);.  
12970 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
12980 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64   assert( p==pInd
12990 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ex );  /* Malloc
129a0 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
129b0 64 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20  d */.      goto 
129c0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
129d0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  x;.    }.    db-
129e0 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
129f0 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
12a00 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
12a10 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  !=0 ){.      pIn
12a20 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e  dex->tnum = db->
12a30 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20  init.newTnum;.  
12a40 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
12a50 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
12a60 73 79 20 69 73 20 30 20 74 68 65 6e 20 63 72 65  sy is 0 then cre
12a70 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  ate the index on
12a80 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a   disk.  This.  *
12a90 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69  * involves writi
12aa0 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  ng the index int
12ab0 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  o the master tab
12ac0 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69  le and filling i
12ad0 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  n the.  ** index
12ae0 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
12af0 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73  t table contents
12b00 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
12b10 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
12b20 20 30 20 77 68 65 6e 20 74 68 65 20 75 73 65 72   0 when the user
12b30 20 66 69 72 73 74 20 65 6e 74 65 72 73 20 61 20   first enters a 
12b40 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20  CREATE INDEX .  
12b50 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d  ** command.  db-
12b60 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20  >init.busy is 1 
12b70 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  when a database 
12b80 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20  is opened and . 
12b90 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45 58   ** CREATE INDEX
12ba0 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
12bb0 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65 20  read out of the 
12bc0 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 49  master table.  I
12bd0 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74 65  n.  ** the latte
12be0 72 20 63 61 73 65 20 74 68 65 20 69 6e 64 65 78  r case the index
12bf0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
12c00 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20 69  on disk, which i
12c10 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f  s why.  ** we do
12c20 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63 72  n't want to recr
12c30 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20  eate it..  **.  
12c40 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d  ** If pTblName==
12c50 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
12c60 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74  index is generat
12c70 65 64 20 61 73 20 61 20 70 72 69 6d 61 72 79 20  ed as a primary 
12c80 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51  key.  ** or UNIQ
12c90 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66  UE constraint of
12ca0 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
12cb0 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63  statement.  Sinc
12cc0 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a  e the table.  **
12cd0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63   has just been c
12ce0 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61  reated, it conta
12cf0 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20  ins no data and 
12d00 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61  the index initia
12d10 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74  lization.  ** st
12d20 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65  ep can be skippe
12d30 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  d..  */.  else i
12d40 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
12d50 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ==0 ){.    Vdbe 
12d60 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  *v;.    char *zS
12d70 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65  tmt;.    int iMe
12d80 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
12d90 2b 2b 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c  ++;..    v = sql
12da0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
12db0 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
12dc0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
12dd0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20  eate_index;..   
12de0 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72   /* Create the r
12df0 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20  ootpage for the 
12e00 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20  index.    */.   
12e10 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
12e20 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
12e30 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
12e40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12e50 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e  p(v, OP_CreateIn
12e60 64 65 78 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  dex, iDb, 0);.  
12e70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12e80 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
12e90 65 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 0a 20 20  e, iMem, 0);..  
12ea0 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20    /* Gather the 
12eb0 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
12ec0 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
12ed0 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f  X statement into
12ee0 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d  .    ** the zStm
12ef0 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  t variable.    *
12f00 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  /.    if( pStart
12f10 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20   && pEnd ){.    
12f20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64    /* A named ind
12f30 65 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69  ex with an expli
12f40 63 69 74 20 43 52 45 41 54 45 20 49 4e 44 45 58  cit CREATE INDEX
12f50 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
12f60 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69      zStmt = sqli
12f70 74 65 33 4d 50 72 69 6e 74 66 28 22 43 52 45 41  te3MPrintf("CREA
12f80 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22  TE%s INDEX %.*s"
12f90 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f  ,.        onErro
12fa0 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20  r==OE_None ? "" 
12fb0 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a 20 20 20  : " UNIQUE",.   
12fc0 20 20 20 20 20 41 64 64 72 28 70 45 6e 64 2d 3e       Addr(pEnd->
12fd0 7a 29 20 2d 20 41 64 64 72 28 70 4e 61 6d 65 2d  z) - Addr(pName-
12fe0 3e 7a 29 20 2b 20 31 2c 0a 20 20 20 20 20 20 20  >z) + 1,.       
12ff0 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20   pName->z);.    
13000 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
13010 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  An automatic ind
13020 65 78 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ex created by a 
13030 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
13040 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
13050 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74   */.      /* zSt
13060 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
13070 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20  ntf(""); */.    
13080 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    zStmt = 0;.   
13090 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61   }..    /* Add a
130a0 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74  n entry in sqlit
130b0 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69  e_master for thi
130c0 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20  s index.    */. 
130d0 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
130e0 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
130f0 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
13100 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53  NTO %Q.%s VALUES
13110 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23  ('index',%Q,%Q,#
13120 30 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20  0,%Q);",.       
13130 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
13140 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
13150 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20  E(iDb),.        
13160 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20  pIndex->zName,. 
13170 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
13180 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d  me,.        zStm
13190 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  t.    );.    sql
131a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
131b0 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
131c0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
131d0 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  Stmt);..    /* F
131e0 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69  ill the index wi
131f0 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70 61  th data and repa
13200 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 0a 20  rse the schema. 
13210 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
13220 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  blName ){.      
13230 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
13240 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
13250 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  x, iMem);.      
13260 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
13270 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b  kie(db, v, iDb);
13280 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13290 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73  beOp3(v, OP_Pars
132a0 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
132b0 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
132c0 33 4d 50 72 69 6e 74 66 28 22 6e 61 6d 65 3d 27  3MPrintf("name='
132d0 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  %q'", pIndex->zN
132e0 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43  ame), P3_DYNAMIC
132f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
13300 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61  /* When adding a
13310 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c  n index to the l
13320 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66  ist of indices f
13330 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65  or a table, make
13340 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69  .  ** sure all i
13350 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f  ndices labeled O
13360 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61  E_Replace come a
13370 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c  fter all those l
13380 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49  abeled.  ** OE_I
13390 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20  gnore.  This is 
133a0 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68  necessary for th
133b0 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  e correct operat
133c0 69 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20  ion of UPDATE.  
133d0 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20  ** and INSERT.. 
133e0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
133f0 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e  it.busy || pTblN
13400 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ame==0 ){.    if
13410 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ( onError!=OE_Re
13420 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70  place || pTab->p
13430 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20  Index==0.       
13440 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65    || pTab->pInde
13450 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52  x->onError==OE_R
13460 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70  eplace){.      p
13470 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
13480 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
13490 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20     pTab->pIndex 
134a0 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65  = pIndex;.    }e
134b0 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
134c0 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d   *pOther = pTab-
134d0 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77  >pIndex;.      w
134e0 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e  hile( pOther->pN
134f0 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70  ext && pOther->p
13500 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  Next->onError!=O
13510 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20  E_Replace ){.   
13520 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f       pOther = pO
13530 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
13540 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65     }.      pInde
13550 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65  x->pNext = pOthe
13560 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
13570 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20  pOther->pNext = 
13580 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  pIndex;.    }.  
13590 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
135a0 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  }..  /* Clean up
135b0 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20   before exiting 
135c0 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69  */.exit_create_i
135d0 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64  ndex:.  if( pInd
135e0 65 78 20 29 7b 0a 20 20 20 20 66 72 65 65 49 6e  ex ){.    freeIn
135f0 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d  dex(pIndex);.  }
13600 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
13610 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
13620 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
13630 74 44 65 6c 65 74 65 28 70 54 62 6c 4e 61 6d 65  tDelete(pTblName
13640 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
13650 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
13660 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
13670 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f  routine will dro
13680 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61  p an existing na
13690 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73  med index.  This
136a0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c   routine.** impl
136b0 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20  ements the DROP 
136c0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e  INDEX statement.
136d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
136e0 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20  DropIndex(Parse 
136f0 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
13700 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65   *pName){.  Inde
13710 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62  x *pIndex;.  Vdb
13720 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
13730 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
13740 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
13750 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
13760 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
13770 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
13780 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
13790 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  1 );.  if( SQLIT
137a0 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
137b0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
137c0 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 49 6e 64  ) return;.  pInd
137d0 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
137e0 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d  Index(db, pName-
137f0 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61  >a[0].zName, pNa
13800 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
13810 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  se);.  if( pInde
13820 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x==0 ){.    sqli
13830 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13840 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
13850 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20  ex: %S", pName, 
13860 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
13870 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
13880 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
13890 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
138a0 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74   if( pIndex->aut
138b0 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71  oIndex ){.    sq
138c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
138d0 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73  arse, "index ass
138e0 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49  ociated with UNI
138f0 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20  QUE ".      "or 
13900 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
13910 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65  traint cannot be
13920 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20   dropped", 0);. 
13930 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
13940 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66  p_index;.  }.#if
13950 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13960 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
13970 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20   {.    int code 
13980 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e  = SQLITE_DROP_IN
13990 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  DEX;.    Table *
139a0 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
139b0 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  Table;.    const
139c0 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
139d0 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62  >aDb[pIndex->iDb
139e0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  ].zName;.    con
139f0 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
13a00 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 49 6e  SCHEMA_TABLE(pIn
13a10 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 69  dex->iDb);.    i
13a20 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
13a30 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
13a40 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
13a50 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
13a60 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
13a70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
13a80 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 44    if( pIndex->iD
13a90 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  b ) code = SQLIT
13aa0 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45  E_DROP_TEMP_INDE
13ab0 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
13ac0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
13ad0 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78  se, code, pIndex
13ae0 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  ->zName, pTab->z
13af0 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
13b00 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
13b10 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
13b20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
13b30 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
13b40 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  o remove the ind
13b50 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20  ex and from the 
13b60 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
13b70 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
13b80 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
13b90 69 66 28 20 76 20 29 7b 0a 20 20 20 20 69 6e 74  if( v ){.    int
13ba0 20 69 44 62 20 3d 20 70 49 6e 64 65 78 2d 3e 69   iDb = pIndex->i
13bb0 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e  Db;.    sqlite3N
13bc0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
13bd0 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54  e,.       "DELET
13be0 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
13bf0 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20  RE name=%Q",.   
13c00 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
13c10 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
13c20 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20  ABLE(iDb),.     
13c30 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a    pIndex->zName.
13c40 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
13c50 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  e3ChangeCookie(d
13c60 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  b, v, iDb);.    
13c70 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
13c80 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e  pParse, pIndex->
13c90 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
13ca0 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
13cb0 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20  , OP_DropIndex, 
13cc0 69 44 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  iDb, 0, pIndex->
13cd0 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a  zName, 0);.  }..
13ce0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a  exit_drop_index:
13cf0 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
13d00 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a  tDelete(pName);.
13d10 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
13d20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
13d30 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73   the given IdLis
13d40 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
13d50 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65   IdList if.** ne
13d60 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ed be..**.** A n
13d70 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74  ew IdList is ret
13d80 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
13d90 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
13da0 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c  ..*/.IdList *sql
13db0 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
13dc0 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
13dd0 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
13de0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
13df0 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
13e00 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
13e10 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
13e20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
13e30 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
13e40 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30  List->nAlloc = 0
13e50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
13e60 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73 74 2d 3e 6e  t->nId>=pList->n
13e70 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 73 74 72  Alloc ){.    str
13e80 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20  uct IdList_item 
13e90 2a 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e  *a;.    pList->n
13ea0 41 6c 6c 6f 63 20 3d 20 70 4c 69 73 74 2d 3e 6e  Alloc = pList->n
13eb0 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20 20  Alloc*2 + 5;.   
13ec0 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c   a = sqliteReall
13ed0 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69  oc(pList->a, pLi
13ee0 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f  st->nAlloc*sizeo
13ef0 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
13f00 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
13f10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
13f20 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
13f30 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
13f40 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c   0;.    }.    pL
13f50 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a  ist->a = a;.  }.
13f60 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d    memset(&pList-
13f70 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20  >a[pList->nId], 
13f80 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  0, sizeof(pList-
13f90 3e 61 5b 30 5d 29 29 3b 0a 20 20 70 4c 69 73 74  >a[0]));.  pList
13fa0 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e  ->a[pList->nId].
13fb0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
13fc0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f  ameFromToken(pTo
13fd0 6b 65 6e 29 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e  ken);.  pList->n
13fe0 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70  Id++;.  return p
13ff0 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  List;.}../*.** A
14000 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c  ppend a new tabl
14010 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69  e name to the gi
14020 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72  ven SrcList.  Cr
14030 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69  eate a new SrcLi
14040 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
14050 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
14060 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  s created in the
14070 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66   SrcList even if
14080 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e   pToken is NULL.
14090 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63  .**.** A new Src
140a0 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
140b0 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
140c0 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a  loc() fails..**.
140d0 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20  ** If pDatabase 
140e0 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20  is not null, it 
140f0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74  means that the t
14100 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69  able has an opti
14110 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  onal.** database
14120 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c   name prefix.  L
14130 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61  ike this:  "data
14140 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68  base.table".  Th
14150 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70  e pDatabase.** p
14160 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62  oints to the tab
14170 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
14180 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  pTable points to
14190 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
141a0 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69  me..** The SrcLi
141b0 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65  st.a[].zName fie
141c0 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ld is filled wit
141d0 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
141e0 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20   which might.** 
141f0 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  come from pTable
14200 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69   (if pDatabase i
14210 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20  s NULL) or from 
14220 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20  pDatabase.  .** 
14230 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74  SrcList.a[].zDat
14240 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20  abase is filled 
14250 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
14260 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62  e name from pTab
14270 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e  le,.** or with N
14280 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61  ULL if no databa
14290 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e  se is specified.
142a0 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
142b0 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c  words, if call l
142c0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
142d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
142e0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42  rcListAppend(A,B
142f0 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,0);.**.** Then 
14300 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d  B is a table nam
14310 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
14320 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65  se name is unspe
14330 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c  cified.  If call
14340 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a  ed.** like this:
14350 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
14360 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
14370 65 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a  end(A,B,C);.**.*
14380 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20  * Then C is the 
14390 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42  table name and B
143a0 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65   is the database
143b0 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73   name..*/.SrcLis
143c0 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
143d0 74 41 70 70 65 6e 64 28 53 72 63 4c 69 73 74 20  tAppend(SrcList 
143e0 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
143f0 54 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70 44  Table, Token *pD
14400 61 74 61 62 61 73 65 29 7b 0a 20 20 73 74 72 75  atabase){.  stru
14410 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
14420 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
14430 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
14440 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ist = sqliteMall
14450 6f 63 28 20 73 69 7a 65 6f 66 28 53 72 63 4c 69  oc( sizeof(SrcLi
14460 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
14470 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
14480 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
14490 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20  Alloc = 1;.  }. 
144a0 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53 72 63   if( pList->nSrc
144b0 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20  >=pList->nAlloc 
144c0 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  ){.    SrcList *
144d0 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73 74 2d  pNew;.    pList-
144e0 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20  >nAlloc *= 2;.  
144f0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    pNew = sqliteR
14500 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a 20 20  ealloc(pList,.  
14510 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
14520 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20 28 70  eof(*pList) + (p
14530 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a  List->nAlloc-1)*
14540 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
14550 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  0]) );.    if( p
14560 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
14570 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
14580 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
14590 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
145a0 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70   }.    pList = p
145b0 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  New;.  }.  pItem
145c0 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
145d0 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20 20 6d 65 6d  st->nSrc];.  mem
145e0 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69  set(pItem, 0, si
145f0 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
14600 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62  ));.  if( pDatab
14610 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65  ase && pDatabase
14620 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  ->z==0 ){.    pD
14630 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
14640 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
14650 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a 20 20   && pTable ){.  
14660 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d    Token *pTemp =
14670 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20   pDatabase;.    
14680 70 44 61 74 61 62 61 73 65 20 3d 20 70 54 61 62  pDatabase = pTab
14690 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d  le;.    pTable =
146a0 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49   pTemp;.  }.  pI
146b0 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
146c0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
146d0 6e 28 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74  n(pTable);.  pIt
146e0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
146f0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
14700 6f 6b 65 6e 28 70 44 61 74 61 62 61 73 65 29 3b  oken(pDatabase);
14710 0a 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  .  pItem->iCurso
14720 72 20 3d 20 2d 31 3b 0a 20 20 70 4c 69 73 74 2d  r = -1;.  pList-
14730 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72  >nSrc++;.  retur
14740 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
14750 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f 72 73  * Assign cursors
14760 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   to all tables i
14770 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76  n a SrcList.*/.v
14780 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
14790 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
147a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
147b0 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
147c0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
147d0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
147e0 70 49 74 65 6d 3b 0a 20 20 66 6f 72 28 69 3d 30  pItem;.  for(i=0
147f0 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
14800 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
14810 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
14820 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69      if( pItem->i
14830 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61  Cursor>=0 ) brea
14840 6b 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 43  k;.    pItem->iC
14850 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
14860 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28 20  nTab++;.    if( 
14870 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
14880 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
14890 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
148a0 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65  ors(pParse, pIte
148b0 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  m->pSelect->pSrc
148c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
148d0 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69  /*.** Add an ali
148e0 61 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 69  as to the last i
148f0 64 65 6e 74 69 66 69 65 72 20 6f 6e 20 74 68 65  dentifier on the
14900 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66 69 65   given identifie
14910 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  r list..*/.void 
14920 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 64  sqlite3SrcListAd
14930 64 41 6c 69 61 73 28 53 72 63 4c 69 73 74 20 2a  dAlias(SrcList *
14940 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
14950 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69  oken){.  if( pLi
14960 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53 72  st && pList->nSr
14970 63 3e 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  c>0 ){.    pList
14980 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d  ->a[pList->nSrc-
14990 31 5d 2e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  1].zAlias = sqli
149a0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
149b0 28 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 7d 0a  (pToken);.  }.}.
149c0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
149d0 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64   IdList..*/.void
149e0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
149f0 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69  lete(IdList *pLi
14a00 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
14a10 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
14a20 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
14a30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
14a40 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
14a50 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Free(pList->a[i]
14a60 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
14a70 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
14a80 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  >a);.  sqliteFre
14a90 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pList);.}../*.
14aa0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
14ab0 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20  dex in pList of 
14ac0 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e  the identifier n
14ad0 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72  amed zId.  Retur
14ae0 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66  n -1.** if not f
14af0 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
14b00 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28  ite3IdListIndex(
14b10 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63  IdList *pList, c
14b20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
14b30 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
14b40 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
14b50 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d  urn -1;.  for(i=
14b60 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
14b70 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
14b80 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c  qlite3StrICmp(pL
14b90 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
14ba0 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74   zName)==0 ) ret
14bb0 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
14bc0 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
14bd0 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
14be0 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64  e SrcList includ
14bf0 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73  ing all its subs
14c00 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
14c10 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
14c20 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20 2a  Delete(SrcList *
14c30 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
14c40 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
14c50 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
14c60 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
14c70 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49  return;.  for(pI
14c80 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
14c90 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  0; i<pList->nSrc
14ca0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
14cb0 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
14cc0 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
14cd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
14ce0 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  e(pItem->zName);
14cf0 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
14d00 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
14d10 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
14d20 54 61 62 20 26 26 20 70 49 74 65 6d 2d 3e 70 54  Tab && pItem->pT
14d30 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20  ab->isTransient 
14d40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14d50 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
14d60 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
14d70 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65   }.    sqlite3Se
14d80 6c 65 63 74 44 65 6c 65 74 65 28 70 49 74 65 6d  lectDelete(pItem
14d90 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
14da0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
14db0 65 28 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20  e(pItem->pOn);. 
14dc0 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
14dd0 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 55  Delete(pItem->pU
14de0 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sing);.  }.  sql
14df0 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a  iteFree(pList);.
14e00 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
14e10 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
14e20 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
14e30 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  nTransaction(Par
14e40 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
14e50 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  type){.  sqlite3
14e60 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
14e70 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
14e80 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
14e90 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
14ea0 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
14eb0 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
14ec0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
14ed0 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
14ee0 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
14ef0 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
14f00 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
14f10 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
14f20 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22  SACTION, "BEGIN"
14f30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
14f40 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
14f50 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
14f60 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75  .  if( !v ) retu
14f70 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d  rn;.  if( type!=
14f80 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20  TK_DEFERRED ){. 
14f90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
14fa0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
14fb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14fc0 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  dOp(v, OP_Transa
14fd0 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d  ction, i, (type=
14fe0 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31  =TK_EXCLUSIVE)+1
14ff0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
15000 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
15010 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
15020 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 0, 0);.}../*.*
15030 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73  * Commit a trans
15040 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
15050 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e  qlite3CommitTran
15060 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
15070 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
15080 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
15090 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
150a0 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
150b0 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
150c0 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
150d0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
150e0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
150f0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
15100 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
15110 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
15120 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
15130 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
15140 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29   "COMMIT", 0, 0)
15150 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20   ) return;..  v 
15160 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
15170 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
15180 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
15190 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
151a0 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30  AutoCommit, 1, 0
151b0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
151c0 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  Rollback a trans
151d0 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
151e0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72  qlite3RollbackTr
151f0 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
15200 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
15210 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
15220 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  *v;..  if( pPars
15230 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
15240 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
15250 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
15260 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
15270 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
15280 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
15290 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
152a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
152b0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
152c0 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
152d0 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30  N, "ROLLBACK", 0
152e0 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  , 0) ) return;..
152f0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
15300 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
15310 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
15320 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
15330 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
15340 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1, 1);.  }.}../*
15350 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
15360 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
15370 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69  is open and avai
15380 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20  lable for use.  
15390 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  Return.** the nu
153a0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
153b0 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
153c0 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65   messages in the
153d0 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
153e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
153f0 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
15400 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a  Database(Parse *
15410 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
15420 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
15430 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61  >db;.  if( db->a
15440 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20  Db[1].pBt==0 && 
15450 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
15460 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
15470 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 63   sqlite3BtreeFac
15480 74 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20 4d  tory(db, 0, 0, M
15490 41 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 61  AX_PAGES, &db->a
154a0 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[1].pBt);.    
154b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
154c0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
154d0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
154e0 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  e, "unable to op
154f0 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64  en a temporary d
15500 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20  atabase ".      
15510 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72    "file for stor
15520 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
15530 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50  bles");.      pP
15540 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
15550 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
15560 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
15570 3e 66 6c 61 67 73 20 26 20 21 64 62 2d 3e 61 75  >flags & !db->au
15580 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
15590 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
155a0 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62  reeBeginTrans(db
155b0 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 2c 20 31 29  ->aDb[1].pBt, 1)
155c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
155d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
155e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
155f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
15600 61 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72  able to get a wr
15610 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20  ite lock on ".  
15620 20 20 20 20 20 20 20 20 22 74 68 65 20 74 65 6d          "the tem
15630 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
15640 66 69 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20  file");.        
15650 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b  pParse->rc = rc;
15660 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
15670 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
15680 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
15690 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
156a0 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
156b0 74 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68  t will verify th
156c0 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
156d0 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72  and start.** a r
156e0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
156f0 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61  for all named da
15700 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a  tabase files..**
15710 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74  .** It is import
15720 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68  ant that all sch
15730 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76  ema cookies be v
15740 65 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a  erified and all.
15750 2a 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63 74  ** read transact
15760 69 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64 20  ions be started 
15770 62 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20  before anything 
15780 65 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a  else happens in.
15790 2a 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f 67  ** the VDBE prog
157a0 72 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72  ram.  But this r
157b0 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61  outine can be ca
157c0 6c 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68 20  lled after much 
157d0 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61  other.** code ha
157e0 73 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64  s been generated
157f0 2e 20 20 53 6f 20 68 65 72 65 20 69 73 20 77 68  .  So here is wh
15800 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20  at we do:.**.** 
15810 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
15820 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
15830 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61  alled, we code a
15840 6e 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a  n OP_Goto that.*
15850 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61  * will jump to a
15860 20 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74   subroutine at t
15870 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72  he end of the pr
15880 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a  ogram.  Then we.
15890 2a 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79 20  ** record every 
158a0 64 61 74 61 62 61 73 65 20 74 68 61 74 20 6e 65  database that ne
158b0 65 64 73 20 69 74 73 20 73 63 68 65 6d 61 20 76  eds its schema v
158c0 65 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  erified in the.*
158d0 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  * pParse->cookie
158e0 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74  Mask field.  Lat
158f0 65 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74  er, after all ot
15900 68 65 72 20 63 6f 64 65 20 68 61 73 20 62 65 65  her code has bee
15910 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20  n.** generated, 
15920 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  the subroutine t
15930 68 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f  hat does the coo
15940 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  kie verification
15950 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20  s and.** starts 
15960 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  the transactions
15970 20 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61   will be coded a
15980 6e 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50  nd the OP_Goto P
15990 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  2 value.** will 
159a0 62 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74  be made to point
159b0 20 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74   to that subrout
159c0 69 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61  ine.  The genera
159d0 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63  tion of the.** c
159e0 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69  ookie verificati
159f0 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f  on subroutine co
15a00 64 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71  de happens in sq
15a10 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
15a20 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44  g()..**.** If iD
15a30 62 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68  b<0 then code th
15a40 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d  e OP_Goto only -
15a50 20 64 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20   don't set flag 
15a60 74 6f 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a  to verify the.**
15a70 20 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64   schema on any d
15a80 61 74 61 62 61 73 65 73 2e 20 20 54 68 69 73 20  atabases.  This 
15a90 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70  can be used to p
15aa0 6f 73 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47  osition the OP_G
15ab0 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20  oto.** early in 
15ac0 74 68 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65  the code, before
15ad0 20 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20   we know if any 
15ae0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 73 20  database tables 
15af0 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f  will be used..*/
15b00 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
15b10 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61  eVerifySchema(Pa
15b20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
15b30 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33   iDb){.  sqlite3
15b40 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
15b50 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20  .  int mask;..  
15b60 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
15b70 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
15b80 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
15b90 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68    /* This only h
15ba0 61 70 70 65 6e 73 20 69 66 20 74 68 65 72 65 20  appens if there 
15bb0 77 61 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f  was a prior erro
15bc0 72 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  r */.  db = pPar
15bd0 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50  se->db;.  if( pP
15be0 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
15bf0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ==0 ){.    pPars
15c00 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20  e->cookieGoto = 
15c10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15c20 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
15c30 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  0)+1;.  }.  if( 
15c40 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73  iDb>=0 ){.    as
15c50 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44  sert( iDb<db->nD
15c60 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b );.    assert(
15c70 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
15c80 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29  t!=0 || iDb==1 )
15c90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  ;.    assert( iD
15ca0 62 3c 33 32 20 29 3b 0a 20 20 20 20 6d 61 73 6b  b<32 );.    mask
15cb0 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 20 20 69   = 1<<iDb;.    i
15cc0 66 28 20 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  f( (pParse->cook
15cd0 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  ieMask & mask)==
15ce0 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  0 ){.      pPars
15cf0 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d  e->cookieMask |=
15d00 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 50 61   mask;.      pPa
15d10 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65  rse->cookieValue
15d20 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  [iDb] = db->aDb[
15d30 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b  iDb].schema_cook
15d40 69 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 44  ie;.      if( iD
15d50 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
15d60 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
15d70 61 74 61 62 61 73 65 28 70 50 61 72 73 65 29 3b  atabase(pParse);
15d80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15d90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
15da0 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
15db0 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72  hat prepares for
15dc0 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74   doing an operat
15dd0 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  ion that.** migh
15de0 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74  t change the dat
15df0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abase..**.** Thi
15e00 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
15e10 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
15e20 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  on if we are not
15e30 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a   already within.
15e40 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
15e50 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72  .  If we are alr
15e60 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72  eady within a tr
15e70 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
15e80 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  a checkpoint.** 
15e90 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65  is set if the se
15ea0 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d  tStatement param
15eb0 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41  eter is true.  A
15ec0 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
15ed0 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72  ld.** be set for
15ee0 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74   operations that
15ef0 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65   might fail (due
15f00 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   to a constraint
15f10 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  ) part of.** the
15f20 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64   way through and
15f30 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64   which will need
15f40 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72   to undo some wr
15f50 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76  ites without hav
15f60 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61  ing to.** rollba
15f70 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  ck the whole tra
15f80 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f  nsaction.  For o
15f90 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20  perations where 
15fa0 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
15fb0 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65  ** can be checke
15fc0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  d before any cha
15fd0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
15fe0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
15ff0 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65  t is never.** ne
16000 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
16010 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20  a write and the 
16020 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
16030 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a  d not be set..**
16040 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73  .** Only databas
16050 65 20 69 44 62 20 61 6e 64 20 74 68 65 20 74 65  e iDb and the te
16060 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20  mp database are 
16070 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 62 79  made writable by
16080 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49   this call..** I
16090 66 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74  f iDb==0, then t
160a0 68 65 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70  he main and temp
160b0 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 6d   databases are m
160c0 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20  ade writable.   
160d0 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65  If.** iDb==1 the
160e0 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20  n only the temp 
160f0 64 61 74 61 62 61 73 65 20 69 73 20 6d 61 64 65  database is made
16100 20 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69   writable.  If i
16110 44 62 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a  Db>1 then the.**
16120 20 73 70 65 63 69 66 69 65 64 20 61 75 78 69 6c   specified auxil
16130 69 61 72 79 20 64 61 74 61 62 61 73 65 20 61 6e  iary database an
16140 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  d the temp datab
16150 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69  ase are made wri
16160 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
16170 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
16180 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
16190 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74  *pParse, int set
161a0 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69  Statement, int i
161b0 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
161c0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
161d0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
161e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
161f0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
16200 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
16210 69 44 62 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  iDb);.  pParse->
16220 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c  writeMask |= 1<<
16230 69 44 62 3b 0a 20 20 69 66 28 20 73 65 74 53 74  iDb;.  if( setSt
16240 61 74 65 6d 65 6e 74 20 26 26 20 70 50 61 72 73  atement && pPars
16250 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a  e->nested==0 ){.
16260 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16270 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74 65  ddOp(v, OP_State
16280 6d 65 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20  ment, iDb, 0);. 
16290 20 7d 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20   }.  if( iDb!=1 
162a0 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  && pParse->db->a
162b0 44 62 5b 31 5d 2e 70 42 74 21 3d 30 20 29 7b 0a  Db[1].pBt!=0 ){.
162c0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
162d0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
162e0 50 61 72 73 65 2c 20 73 65 74 53 74 61 74 65 6d  Parse, setStatem
162f0 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  ent, 1);.  }.}..
16300 2f 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  /* .** Return th
16310 65 20 74 72 61 6e 73 69 65 6e 74 20 73 71 6c 69  e transient sqli
16320 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74  te3_value object
16330 20 75 73 65 64 20 66 6f 72 20 65 6e 63 6f 64 69   used for encodi
16340 6e 67 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 2a  ng conversions.*
16350 2a 20 64 75 72 69 6e 67 20 53 51 4c 20 63 6f 6d  * during SQL com
16360 70 69 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c  pilation..*/.sql
16370 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69  ite3_value *sqli
16380 74 65 33 47 65 74 54 72 61 6e 73 69 65 6e 74 56  te3GetTransientV
16390 61 6c 75 65 28 73 71 6c 69 74 65 33 20 2a 64 62  alue(sqlite3 *db
163a0 29 7b 0a 20 20 69 66 28 20 21 64 62 2d 3e 70 56  ){.  if( !db->pV
163b0 61 6c 75 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e  alue ){.    db->
163c0 70 56 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33  pValue = sqlite3
163d0 56 61 6c 75 65 4e 65 77 28 29 3b 0a 20 20 7d 0a  ValueNew();.  }.
163e0 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 70 56 61    return db->pVa
163f0 6c 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  lue;.}../*.** Ch
16400 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49  eck to see if pI
16410 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f  ndex uses the co
16420 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
16430 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a   pColl.  Return.
16440 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  ** true if it do
16450 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  es and false if 
16460 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a  it does not..*/.
16470 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16480 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
16490 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e  ic int collation
164a0 4d 61 74 63 68 28 43 6f 6c 6c 53 65 71 20 2a 70  Match(CollSeq *p
164b0 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e  Coll, Index *pIn
164c0 64 65 78 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  dex){.  int n = 
164d0 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
164e0 6e 46 69 65 6c 64 3b 0a 20 20 43 6f 6c 6c 53 65  nField;.  CollSe
164f0 71 20 2a 2a 70 70 20 3d 20 70 49 6e 64 65 78 2d  q **pp = pIndex-
16500 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 3b 0a  >keyInfo.aColl;.
16510 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 29 7b 0a    while( n-- ){.
16520 20 20 20 20 69 66 28 20 2a 70 70 3d 3d 70 43 6f      if( *pp==pCo
16530 6c 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ll ) return 1;. 
16540 20 20 20 70 70 2b 2b 3b 0a 20 20 7d 0a 20 20 72     pp++;.  }.  r
16550 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
16560 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75  f../*.** Recompu
16570 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
16580 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20  f pTab that use 
16590 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
165a0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a  quence pColl..**
165b0 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65   If pColl==0 the
165c0 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  n recompute all 
165d0 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e  indices of pTab.
165e0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
165f0 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
16600 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c  void reindexTabl
16610 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
16620 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f   Table *pTab, Co
16630 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
16640 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
16650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16660 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
16670 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
16680 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70  ..  for(pIndex=p
16690 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  Tab->pIndex; pIn
166a0 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64  dex; pIndex=pInd
166b0 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ex->pNext){.    
166c0 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 7c 7c 20  if( pColl==0 || 
166d0 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 70  collationMatch(p
166e0 43 6f 6c 6c 2c 70 49 6e 64 65 78 29 20 29 7b 0a  Coll,pIndex) ){.
166f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
16700 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
16710 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 61 62  (pParse, 0, pTab
16720 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  ->iDb);.      sq
16730 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
16740 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
16750 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   -1);.    }.  }.
16760 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
16770 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
16780 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62  dices of all tab
16790 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  les in all datab
167a0 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a  ases where the.*
167b0 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68  * indices use th
167c0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
167d0 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20  ence pColl.  If 
167e0 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
167f0 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69  compute.** all i
16800 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72  ndices everywher
16810 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
16820 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
16830 58 0a 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61  X.void reindexDa
16840 74 61 62 61 73 65 73 28 50 61 72 73 65 20 2a 70  tabases(Parse *p
16850 50 61 72 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a  Parse, CollSeq *
16860 70 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44  pColl){.  Db *pD
16870 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
16880 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
16890 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
168a0 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
168b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
168c0 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
168d0 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
168e0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
168f0 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
16900 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
16910 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c  tion */.  HashEl
16920 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20  em *k;          
16930 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
16940 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73  ping over tables
16950 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62   in pDb */.  Tab
16960 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
16970 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
16980 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
16990 61 73 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44  ase */..  for(iD
169a0 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62  b=0, pDb=db->aDb
169b0 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
169c0 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20  Db++, pDb++){.  
169d0 20 20 69 66 28 20 70 44 62 3d 3d 30 20 29 20 63    if( pDb==0 ) c
169e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
169f0 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46  or(k=sqliteHashF
16a00 69 72 73 74 28 26 70 44 62 2d 3e 74 62 6c 48 61  irst(&pDb->tblHa
16a10 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74  sh);  k; k=sqlit
16a20 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20  eHashNext(k)){. 
16a30 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62       pTab = (Tab
16a40 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  le*)sqliteHashDa
16a50 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69  ta(k);.      rei
16a60 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
16a70 2c 20 70 54 61 62 2c 20 70 43 6f 6c 6c 29 3b 0a  , pTab, pColl);.
16a80 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
16a90 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
16aa0 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
16ab0 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e  REINDEX command.
16ac0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  .**.**        RE
16ad0 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20  INDEX           
16ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16af0 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20   -- 1.**        
16b00 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74  REINDEX  <collat
16b10 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20  ion>            
16b20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20     -- 2.**      
16b30 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74    REINDEX  ?<dat
16b40 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61  abase>.?<tablena
16b50 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20  me>  -- 3.**    
16b60 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64      REINDEX  ?<d
16b70 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78  atabase>.?<index
16b80 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a  name>  -- 4.**.*
16b90 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20  * Form 1 causes 
16ba0 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
16bb0 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
16bc0 62 61 73 65 73 20 74 6f 20 62 65 20 72 65 62 75  bases to be rebu
16bd0 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72  ilt..** Form 2 r
16be0 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69  ebuilds all indi
16bf0 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  ces in all datab
16c00 61 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68  ases that use th
16c10 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61  e named.** colla
16c20 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ting function.  
16c30 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65  Forms 3 and 4 re
16c40 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20  build the named 
16c50 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20  index or all.** 
16c60 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
16c70 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
16c80 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e  d table..*/.#ifn
16c90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16ca0 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c  REINDEX.void sql
16cb0 69 74 65 33 52 65 69 6e 64 65 78 28 50 61 72 73  ite3Reindex(Pars
16cc0 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
16cd0 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20   *pName1, Token 
16ce0 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c  *pName2){.  Coll
16cf0 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
16d00 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
16d10 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
16d20 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f   be reindexed, o
16d30 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72  r NULL */.  char
16d40 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
16d50 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
16d60 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
16d70 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dex */.  const c
16d80 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20  har *zDb;       
16d90 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
16da0 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
16db0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16dd0 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
16de0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e  database */.  In
16df0 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
16e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
16e10 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
16e20 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20   with pTab */.  
16e30 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
16e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16e50 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
16e60 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
16e70 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
16e80 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
16e90 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
16ea0 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tion */.  Token 
16eb0 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20  *pObjName;      
16ec0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
16ed0 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
16ee0 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65  dex to be reinde
16ef0 78 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4e  xed */..  if( pN
16f00 61 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65  ame1==0 || pName
16f10 31 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72  1->z==0 ){.    r
16f20 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
16f30 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20  pParse, 0);.    
16f40 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20  return;.  }else 
16f50 69 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c  if( pName2==0 ||
16f60 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b   pName2->z==0 ){
16f70 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
16f80 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
16f90 64 62 2c 20 64 62 2d 3e 65 6e 63 2c 20 70 4e 61  db, db->enc, pNa
16fa0 6d 65 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d 3e  me1->z, pName1->
16fb0 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  n, 0);.    if( p
16fc0 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
16fd0 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
16fe0 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20  Parse, pColl);. 
16ff0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
17000 20 7d 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73   }.  }.  iDb = s
17010 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
17020 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
17030 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e  , pName2, &pObjN
17040 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
17050 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20  0 ) return;.  z 
17060 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
17070 6d 54 6f 6b 65 6e 28 70 4f 62 6a 4e 61 6d 65 29  mToken(pObjName)
17080 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  zDb = db->aD
17090 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
170a0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
170b0 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a  ndTable(db, z, z
170c0 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20  Db);.  if( pTab 
170d0 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61  ){.    reindexTa
170e0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
170f0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
17100 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 72 65 74  Free(z);.    ret
17110 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65  urn;.  }.  pInde
17120 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
17130 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29  ndex(db, z, zDb)
17140 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
17150 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  );.  if( pIndex 
17160 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
17170 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
17180 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
17190 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
171a0 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
171b0 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20  , pIndex, -1);. 
171c0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
171d0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
171e0 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
171f0 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65   to identify the
17200 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65   object to be re
17210 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e  indexed");.}.#en
17220 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
17230 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41  ITE_OMIT_ALTERTA
17240 42 4c 45 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  BLE./*.** Genera
17250 74 65 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  te code to imple
17260 6d 65 6e 74 20 74 68 65 20 22 41 4c 54 45 52 20  ment the "ALTER 
17270 54 41 42 4c 45 20 78 78 78 20 52 45 4e 41 4d 45  TABLE xxx RENAME
17280 20 54 4f 20 79 79 79 22 20 0a 2a 2a 20 63 6f 6d   TO yyy" .** com
17290 6d 61 6e 64 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  mand. .*/.void s
172a0 71 6c 69 74 65 33 41 6c 74 65 72 52 65 6e 61 6d  qlite3AlterRenam
172b0 65 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  eTable(.  Parse 
172c0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
172d0 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
172e0 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53 72 63 4c  ntext. */.  SrcL
172f0 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
17300 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
17310 6c 65 20 74 6f 20 72 65 6e 61 6d 65 2e 20 2a 2f  le to rename. */
17320 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  .  Token *pName 
17330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17340 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  The new table na
17350 6d 65 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  me. */.){.  int 
17360 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
17370 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
17380 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
17390 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63  the table */.  c
173a0 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20  har *zDb;       
173b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
173c0 20 6f 66 20 64 61 74 61 62 61 73 65 20 69 44 62   of database iDb
173d0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
173e0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
173f0 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 72  /* Table being r
17400 65 6e 61 6d 65 64 20 2a 2f 0a 20 20 63 68 61 72  enamed */.  char
17410 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *zName = 0;    
17420 20 20 20 20 20 20 2f 2a 20 4e 55 4c 4c 2d 74 65        /* NULL-te
17430 72 6d 69 6e 61 74 65 64 20 76 65 72 73 69 6f 6e  rminated version
17440 20 6f 66 20 70 4e 61 6d 65 20 2a 2f 20 0a 20 20   of pName */ .  
17450 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30  char *zWhere = 0
17460 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  ;         /* Whe
17470 72 65 20 63 6c 61 75 73 65 20 6f 66 20 73 63 68  re clause of sch
17480 65 6d 61 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20  ema elements to 
17490 72 65 70 61 72 73 65 20 2a 2f 0a 20 20 73 71 6c  reparse */.  sql
174a0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
174b0 65 2d 3e 64 62 3b 20 2f 2a 20 44 61 74 61 62 61  e->db; /* Databa
174c0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
174d0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 23 69 66 6e  .  Vdbe *v;.#ifn
174e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
174f0 54 52 49 47 47 45 52 0a 20 20 63 68 61 72 20 2a  TRIGGER.  char *
17500 7a 54 65 6d 70 54 72 69 67 20 3d 20 30 3b 20 20  zTempTrig = 0;  
17510 20 20 20 20 2f 2a 20 57 68 65 72 65 20 63 6c 61      /* Where cla
17520 75 73 65 20 74 6f 20 6c 6f 63 61 74 65 20 74 65  use to locate te
17530 6d 70 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 23  mp triggers */.#
17540 65 6e 64 69 66 0a 20 20 0a 20 20 61 73 73 65 72  endif.  .  asser
17550 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 31  t( pSrc->nSrc==1
17560 20 29 3b 0a 0a 20 20 70 54 61 62 20 3d 20 73 71   );..  pTab = sq
17570 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
17580 28 70 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 61  (pParse, pSrc->a
17590 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 53 72 63 2d  [0].zName, pSrc-
175a0 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
175b0 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20 29 20  ;.  if( !pTab ) 
175c0 67 6f 74 6f 20 65 78 69 74 5f 61 6c 74 65 72 5f  goto exit_alter_
175d0 74 61 62 6c 65 3b 0a 20 20 69 44 62 20 3d 20 70  table;.  iDb = p
175e0 54 61 62 2d 3e 69 44 62 3b 0a 20 20 7a 44 62 20  Tab->iDb;.  zDb 
175f0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
17600 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  Name;..  /* Get 
17610 61 20 4e 55 4c 4c 20 74 65 72 6d 69 6e 61 74 65  a NULL terminate
17620 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  d version of the
17630 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 2e   new table name.
17640 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71   */.  zName = sq
17650 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
17660 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  en(pName);.  if(
17670 20 21 7a 4e 61 6d 65 20 29 20 67 6f 74 6f 20 65   !zName ) goto e
17680 78 69 74 5f 61 6c 74 65 72 5f 74 61 62 6c 65 3b  xit_alter_table;
17690 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
176a0 74 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  t a table or ind
176b0 65 78 20 6e 61 6d 65 64 20 27 7a 4e 61 6d 65 27  ex named 'zName'
176c0 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
176d0 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 69 6e 20  y exist.  ** in 
176e0 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 49 66  database iDb. If
176f0 20 73 6f 2c 20 74 68 69 73 20 69 73 20 61 6e 20   so, this is an 
17700 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  error..  */.  if
17710 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
17720 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  le(db, zName, zD
17730 62 29 20 7c 7c 20 73 71 6c 69 74 65 33 46 69 6e  b) || sqlite3Fin
17740 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
17750 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 73 71  , zDb) ){.    sq
17760 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
17770 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22  arse, .        "
17780 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
17790 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 6f   another table o
177a0 72 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 69  r index with thi
177b0 73 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61  s name: %s", zNa
177c0 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
177d0 69 74 5f 61 6c 74 65 72 5f 74 61 62 6c 65 3b 0a  it_alter_table;.
177e0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
177f0 75 72 65 20 69 74 20 69 73 20 6e 6f 74 20 61 20  ure it is not a 
17800 73 79 73 74 65 6d 20 74 61 62 6c 65 20 62 65 69  system table bei
17810 6e 67 20 61 6c 74 65 72 65 64 2c 20 6f 72 20 61  ng altered, or a
17820 20 72 65 73 65 72 76 65 64 20 6e 61 6d 65 0a 20   reserved name. 
17830 20 2a 2a 20 74 68 61 74 20 74 68 65 20 74 61 62   ** that the tab
17840 6c 65 20 69 73 20 62 65 69 6e 67 20 72 65 6e 61  le is being rena
17850 6d 65 64 20 74 6f 2e 0a 20 20 2a 2f 0a 20 20 69  med to..  */.  i
17860 66 28 20 73 74 72 6c 65 6e 28 70 54 61 62 2d 3e  f( strlen(pTab->
17870 7a 4e 61 6d 65 29 3e 36 20 26 26 20 30 3d 3d 73  zName)>6 && 0==s
17880 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
17890 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
178a0 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20  ite_", 7) ){.   
178b0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
178c0 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
178d0 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c  %s may not be al
178e0 74 65 72 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  tered", pTab->zN
178f0 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
17900 78 69 74 5f 61 6c 74 65 72 5f 74 61 62 6c 65 3b  xit_alter_table;
17910 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54  .  }.  if( SQLIT
17920 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65  E_OK!=sqlite3Che
17930 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61  ckObjectName(pPa
17940 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  rse, zName) ){. 
17950 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 61 6c 74     goto exit_alt
17960 65 72 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23  er_table;.  }..#
17970 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17980 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
17990 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  /* Invoke the
179a0 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63   authorization c
179b0 61 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 69 66  allback. */.  if
179c0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
179d0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
179e0 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 2c 20 7a  E_ALTER_TABLE, z
179f0 44 62 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Db, pTab->zName,
17a00 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   0) ){.    goto 
17a10 65 78 69 74 5f 61 6c 74 65 72 5f 74 61 62 6c 65  exit_alter_table
17a20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
17a30 2f 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73  /* Begin a trans
17a40 61 63 74 69 6f 6e 20 61 6e 64 20 63 6f 64 65 20  action and code 
17a50 74 68 65 20 56 65 72 69 66 79 43 6f 6f 6b 69 65  the VerifyCookie
17a60 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 69 44   for database iD
17a70 62 2e 20 0a 20 20 2a 2a 20 54 68 65 6e 20 6d 6f  b. .  ** Then mo
17a80 64 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  dify the schema 
17a90 63 6f 6f 6b 69 65 20 28 73 69 6e 63 65 20 74 68  cookie (since th
17aa0 65 20 41 4c 54 45 52 20 54 41 42 4c 45 20 6d 6f  e ALTER TABLE mo
17ab0 64 69 66 69 65 73 20 74 68 65 0a 20 20 2a 2a 20  difies the.  ** 
17ac0 73 63 68 65 6d 61 29 2e 0a 20 20 2a 2f 0a 20 20  schema)..  */.  
17ad0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
17ae0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
17af0 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  ( v==0 ){.    go
17b00 74 6f 20 65 78 69 74 5f 61 6c 74 65 72 5f 74 61  to exit_alter_ta
17b10 62 6c 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ble;.  }.  sqlit
17b20 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
17b30 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
17b40 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
17b50 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
17b60 20 76 2c 20 69 44 62 29 3b 0a 0a 20 20 2f 2a 20   v, iDb);..  /* 
17b70 4d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74  Modify the sqlit
17b80 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74  e_master table t
17b90 6f 20 75 73 65 20 74 68 65 20 6e 65 77 20 74 61  o use the new ta
17ba0 62 6c 65 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 73  ble name. */.  s
17bb0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
17bc0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
17bd0 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45  "UPDATE %Q.%s SE
17be0 54 20 22 0a 23 69 66 64 65 66 20 53 51 4c 49 54  T ".#ifdef SQLIT
17bf0 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
17c00 20 20 20 20 20 20 20 20 20 22 73 71 6c 20 3d 20           "sql = 
17c10 73 71 6c 69 74 65 5f 61 6c 74 65 72 5f 74 61 62  sqlite_alter_tab
17c20 6c 65 28 73 71 6c 2c 20 25 51 29 2c 20 22 0a 23  le(sql, %Q), ".#
17c30 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 22  else.          "
17c40 73 71 6c 20 3d 20 43 41 53 45 20 22 0a 20 20 20  sql = CASE ".   
17c50 20 20 20 20 20 20 20 20 20 22 57 48 45 4e 20 74           "WHEN t
17c60 79 70 65 20 3d 20 27 74 72 69 67 67 65 72 27 20  ype = 'trigger' 
17c70 54 48 45 4e 20 73 71 6c 69 74 65 5f 61 6c 74 65  THEN sqlite_alte
17c80 72 5f 74 72 69 67 67 65 72 28 73 71 6c 2c 20 25  r_trigger(sql, %
17c90 51 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  Q)".            
17ca0 22 45 4c 53 45 20 73 71 6c 69 74 65 5f 61 6c 74  "ELSE sqlite_alt
17cb0 65 72 5f 74 61 62 6c 65 28 73 71 6c 2c 20 25 51  er_table(sql, %Q
17cc0 29 20 45 4e 44 2c 20 22 0a 23 65 6e 64 69 66 0a  ) END, ".#endif.
17cd0 20 20 20 20 20 20 20 20 20 20 22 74 62 6c 5f 6e            "tbl_n
17ce0 61 6d 65 20 3d 20 25 51 2c 20 22 0a 20 20 20 20  ame = %Q, ".    
17cf0 20 20 20 20 20 20 22 6e 61 6d 65 20 3d 20 43 41        "name = CA
17d00 53 45 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  SE ".           
17d10 20 22 57 48 45 4e 20 74 79 70 65 3d 27 74 61 62   "WHEN type='tab
17d20 6c 65 27 20 54 48 45 4e 20 25 51 20 22 0a 20 20  le' THEN %Q ".  
17d30 20 20 20 20 20 20 20 20 20 20 22 57 48 45 4e 20            "WHEN 
17d40 6e 61 6d 65 20 4c 49 4b 45 20 27 73 71 6c 69 74  name LIKE 'sqlit
17d50 65 5f 61 75 74 6f 69 6e 64 65 78 25 25 27 20 41  e_autoindex%%' A
17d60 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20  ND type='index' 
17d70 54 48 45 4e 20 22 0a 20 20 20 20 20 20 20 20 20  THEN ".         
17d80 20 20 20 20 20 22 27 73 71 6c 69 74 65 5f 61 75       "'sqlite_au
17d90 74 6f 69 6e 64 65 78 5f 27 20 7c 7c 20 25 51 20  toindex_' || %Q 
17da0 7c 7c 20 73 75 62 73 74 72 28 6e 61 6d 65 2c 20  || substr(name, 
17db0 25 64 2b 31 38 2c 31 30 29 20 22 0a 20 20 20 20  %d+18,10) ".    
17dc0 20 20 20 20 20 20 20 20 22 45 4c 53 45 20 6e 61          "ELSE na
17dd0 6d 65 20 45 4e 44 20 22 0a 20 20 20 20 20 20 22  me END ".      "
17de0 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25  WHERE tbl_name=%
17df0 51 20 41 4e 44 20 74 79 70 65 20 49 4e 20 28 27  Q AND type IN ('
17e00 74 61 62 6c 65 27 2c 20 27 69 6e 64 65 78 27 2c  table', 'index',
17e10 20 27 74 72 69 67 67 65 72 27 29 3b 22 2c 20 0a   'trigger');", .
17e20 20 20 20 20 20 20 7a 44 62 2c 20 53 43 48 45 4d        zDb, SCHEM
17e30 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 7a 4e  A_TABLE(iDb), zN
17e40 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  ame, zName, zNam
17e50 65 2c 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e, .#ifndef SQLI
17e60 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
17e70 7a 4e 61 6d 65 2c 0a 23 65 6e 64 69 66 0a 20 20  zName,.#endif.  
17e80 20 20 20 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65      zName, strle
17e90 6e 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 2c 20  n(pTab->zName), 
17ea0 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 29 3b  pTab->zName.  );
17eb0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
17ec0 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
17ed0 45 4e 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  ENT.  /* If the 
17ee0 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
17ef0 74 61 62 6c 65 20 65 78 69 73 74 73 20 69 6e 20  table exists in 
17f00 74 68 69 73 20 64 61 74 61 62 61 73 65 2c 20 74  this database, t
17f10 68 65 6e 20 75 70 64 61 74 65 20 0a 20 20 2a 2a  hen update .  **
17f20 20 69 74 20 77 69 74 68 20 74 68 65 20 6e 65 77   it with the new
17f30 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 20 20 2a   table name..  *
17f40 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  /.  if( sqlite3F
17f50 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71  indTable(db, "sq
17f60 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 2c 20  lite_sequence", 
17f70 7a 44 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  zDb) ){.    sqli
17f80 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
17f90 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
17fa0 55 50 44 41 54 45 20 25 51 2e 73 71 6c 69 74 65  UPDATE %Q.sqlite
17fb0 5f 73 65 71 75 65 6e 63 65 20 73 65 74 20 6e 61  _sequence set na
17fc0 6d 65 20 3d 20 25 51 20 57 48 45 52 45 20 6e 61  me = %Q WHERE na
17fd0 6d 65 20 3d 20 25 51 22 2c 0a 20 20 20 20 20 20  me = %Q",.      
17fe0 20 20 7a 44 62 2c 20 7a 4e 61 6d 65 2c 20 70 54    zDb, zName, pT
17ff0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  ab->zName);.  }.
18000 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
18010 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
18020 47 45 52 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  GER.  /* If ther
18030 65 20 61 72 65 20 54 45 4d 50 20 74 72 69 67 67  e are TEMP trigg
18040 65 72 73 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  ers on this tabl
18050 65 2c 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71  e, modify the sq
18060 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
18070 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 44 6f 6e  .  ** table. Don
18080 27 74 20 64 6f 20 74 68 69 73 20 69 66 20 74 68  't do this if th
18090 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 41 4c  e table being AL
180a0 54 45 52 65 64 20 69 73 20 69 74 73 65 6c 66 20  TERed is itself 
180b0 6c 6f 63 61 74 65 64 20 69 6e 0a 20 20 2a 2a 20  located in.  ** 
180c0 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
180d0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44  e..  */.  if( iD
180e0 62 21 3d 31 20 29 7b 0a 20 20 20 20 54 72 69 67  b!=1 ){.    Trig
180f0 67 65 72 20 2a 70 54 72 69 67 3b 0a 20 20 20 20  ger *pTrig;.    
18100 63 68 61 72 20 2a 74 6d 70 20 3d 20 30 3b 0a 20  char *tmp = 0;. 
18110 20 20 20 66 6f 72 28 20 70 54 72 69 67 3d 70 54     for( pTrig=pT
18120 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 20 70 54  ab->pTrigger; pT
18130 72 69 67 3b 20 70 54 72 69 67 3d 70 54 72 69 67  rig; pTrig=pTrig
18140 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
18150 20 69 66 28 20 70 54 72 69 67 2d 3e 69 44 62 3d   if( pTrig->iDb=
18160 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =1 ){.        if
18170 28 20 21 7a 54 65 6d 70 54 72 69 67 20 29 7b 0a  ( !zTempTrig ){.
18180 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 54            zTempT
18190 72 69 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20  rig = .         
181a0 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
181b0 6e 74 66 28 22 74 79 70 65 20 3d 20 27 74 72 69  ntf("type = 'tri
181c0 67 67 65 72 27 20 41 4e 44 20 6e 61 6d 65 20 49  gger' AND name I
181d0 4e 28 25 51 22 2c 20 70 54 72 69 67 2d 3e 6e 61  N(%Q", pTrig->na
181e0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  me);.        }el
181f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 74 6d  se{.          tm
18200 70 20 3d 20 7a 54 65 6d 70 54 72 69 67 3b 0a 20  p = zTempTrig;. 
18210 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 54 72           zTempTr
18220 69 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  ig = sqlite3MPri
18230 6e 74 66 28 22 25 73 2c 20 25 51 22 2c 20 7a 54  ntf("%s, %Q", zT
18240 65 6d 70 54 72 69 67 2c 20 70 54 72 69 67 2d 3e  empTrig, pTrig->
18250 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
18260 20 73 71 6c 69 74 65 46 72 65 65 28 74 6d 70 29   sqliteFree(tmp)
18270 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18280 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
18290 28 20 7a 54 65 6d 70 54 72 69 67 20 29 7b 0a 20  ( zTempTrig ){. 
182a0 20 20 20 20 20 74 6d 70 20 3d 20 7a 54 65 6d 70       tmp = zTemp
182b0 54 72 69 67 3b 0a 20 20 20 20 20 20 7a 54 65 6d  Trig;.      zTem
182c0 70 54 72 69 67 20 3d 20 73 71 6c 69 74 65 33 4d  pTrig = sqlite3M
182d0 50 72 69 6e 74 66 28 22 25 73 29 22 2c 20 7a 54  Printf("%s)", zT
182e0 65 6d 70 54 72 69 67 29 3b 0a 20 20 20 20 20 20  empTrig);.      
182f0 73 71 6c 69 74 65 46 72 65 65 28 74 6d 70 29 3b  sqliteFree(tmp);
18300 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65  .      sqlite3Ne
18310 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
18320 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 55 50  , .          "UP
18330 44 41 54 45 20 73 71 6c 69 74 65 5f 74 65 6d 70  DATE sqlite_temp
18340 5f 6d 61 73 74 65 72 20 53 45 54 20 22 0a 20 20  _master SET ".  
18350 20 20 20 20 20 20 20 20 20 20 20 20 22 73 71 6c              "sql
18360 20 3d 20 73 71 6c 69 74 65 5f 61 6c 74 65 72 5f   = sqlite_alter_
18370 74 72 69 67 67 65 72 28 73 71 6c 2c 20 25 51 29  trigger(sql, %Q)
18380 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
18390 20 20 22 74 62 6c 5f 6e 61 6d 65 20 3d 20 25 51    "tbl_name = %Q
183a0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
183b0 20 22 57 48 45 52 45 20 25 73 3b 22 2c 20 7a 4e   "WHERE %s;", zN
183c0 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 7a 54 65 6d  ame, zName, zTem
183d0 70 54 72 69 67 29 3b 0a 20 20 20 20 7d 0a 20 20  pTrig);.    }.  
183e0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  }.#endif..  /* D
183f0 72 6f 70 20 74 68 65 20 65 6c 65 6d 65 6e 74 73  rop the elements
18400 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
18410 79 20 73 63 68 65 6d 61 20 74 68 61 74 20 72 65  y schema that re
18420 66 65 72 65 64 20 74 6f 20 74 68 65 20 74 61 62  fered to the tab
18430 6c 65 0a 20 20 2a 2a 20 72 65 6e 61 6d 65 64 20  le.  ** renamed 
18440 61 6e 64 20 6c 6f 61 64 20 74 68 65 20 6e 65 77  and load the new
18450 20 76 65 72 73 69 6f 6e 73 20 66 72 6f 6d 20 74   versions from t
18460 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
18470 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
18480 6e 45 72 72 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  nErr==0 ){.#ifnd
18490 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
184a0 52 49 47 47 45 52 0a 20 20 20 20 54 72 69 67 67  RIGGER.    Trigg
184b0 65 72 20 2a 70 54 72 69 67 3b 0a 20 20 20 20 66  er *pTrig;.    f
184c0 6f 72 28 20 70 54 72 69 67 3d 70 54 61 62 2d 3e  or( pTrig=pTab->
184d0 70 54 72 69 67 67 65 72 3b 20 70 54 72 69 67 3b  pTrigger; pTrig;
184e0 20 70 54 72 69 67 3d 70 54 72 69 67 2d 3e 70 4e   pTrig=pTrig->pN
184f0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ext ){.      ass
18500 65 72 74 28 20 70 54 72 69 67 2d 3e 69 44 62 3d  ert( pTrig->iDb=
18510 3d 69 44 62 20 7c 7c 20 70 54 72 69 67 2d 3e 69  =iDb || pTrig->i
18520 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  Db==1 );.      s
18530 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
18540 20 4f 50 5f 44 72 6f 70 54 72 69 67 67 65 72 2c   OP_DropTrigger,
18550 20 70 54 72 69 67 2d 3e 69 44 62 2c 20 30 2c 20   pTrig->iDb, 0, 
18560 70 54 72 69 67 2d 3e 6e 61 6d 65 2c 20 30 29 3b  pTrig->name, 0);
18570 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
18580 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
18590 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65  (v, OP_DropTable
185a0 2c 20 69 44 62 2c 20 30 2c 20 70 54 61 62 2d 3e  , iDb, 0, pTab->
185b0 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7a  zName, 0);.    z
185c0 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 4d  Where = sqlite3M
185d0 50 72 69 6e 74 66 28 22 74 62 6c 5f 6e 61 6d 65  Printf("tbl_name
185e0 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  =%Q", zName);.  
185f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
18600 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65  (v, OP_ParseSche
18610 6d 61 2c 20 69 44 62 2c 20 30 2c 20 7a 57 68 65  ma, iDb, 0, zWhe
18620 72 65 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b  re, P3_DYNAMIC);
18630 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18640 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
18650 20 69 66 28 20 7a 54 65 6d 70 54 72 69 67 20 29   if( zTempTrig )
18660 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
18670 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72  dbeOp3(v, OP_Par
18680 73 65 53 63 68 65 6d 61 2c 20 31 2c 20 30 2c 20  seSchema, 1, 0, 
18690 7a 54 65 6d 70 54 72 69 67 2c 20 50 33 5f 44 59  zTempTrig, P3_DY
186a0 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  NAMIC);.    }.  
186b0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
186c0 65 46 72 65 65 28 7a 54 65 6d 70 54 72 69 67 29  eFree(zTempTrig)
186d0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 65 78  ;.#endif.  }..ex
186e0 69 74 5f 61 6c 74 65 72 5f 74 61 62 6c 65 3a 0a  it_alter_table:.
186f0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
18700 44 65 6c 65 74 65 28 70 53 72 63 29 3b 0a 20 20  Delete(pSrc);.  
18710 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
18720 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a              );.}.#endif.