/ Hex Artifact Content
Login

Artifact c09954ebeef8d7464305b4b2ff53f7fe193d7ae3:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 0a 2a 2a    ROLLBACK.**.**
02d0: 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20   $Id: build.c,v 
02e0: 31 2e 33 30 34 20 32 30 30 35 2f 30 31 2f 33 31  1.304 2005/01/31
02f0: 20 32 33 3a 34 35 3a 35 36 20 64 72 68 20 45 78   23:45:56 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 6e 4d 61 78 44 65 70   pParse->nMaxDep
0c60: 74 68 2b 31 2c 20 70 50 61 72 73 65 2d 3e 65 78  th+1, pParse->ex
0c70: 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50 61 72  plain);.    pPar
0c80: 73 65 2d 3e 72 63 20 3d 20 70 50 61 72 73 65 2d  se->rc = pParse-
0c90: 3e 6e 45 72 72 20 3f 20 53 51 4c 49 54 45 5f 45  >nErr ? SQLITE_E
0ca0: 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f 44 4f  RROR : SQLITE_DO
0cb0: 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  NE;.    pParse->
0cc0: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b  colNamesSet = 0;
0cd0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
0ce0: 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  rse->rc==SQLITE_
0cf0: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  OK ){.    pParse
0d00: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
0d10: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73  ROR;.  }.  pPars
0d20: 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70  e->nTab = 0;.  p
0d30: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b  Parse->nMem = 0;
0d40: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20  .  pParse->nSet 
0d50: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
0d60: 56 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Var = 0;.  pPars
0d70: 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20  e->cookieMask = 
0d80: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f  0;.  pParse->coo
0d90: 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a  kieGoto = 0;.}..
0da0: 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70 61  /*.** Run the pa
0db0: 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67 65  rser and code ge
0dc0: 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69 76  nerator recursiv
0dd0: 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ely in order to 
0de0: 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65  generate.** code
0df0: 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74 61   for the SQL sta
0e00: 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74  tement given ont
0e10: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
0e20: 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74 0a   pParse context.
0e30: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  ** currently und
0e40: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
0e50: 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73 65    When the parse
0e60: 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73 69  r is run recursi
0e70: 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61 79  vely.** this way
0e80: 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48  , the final OP_H
0e90: 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65 6e  alt is not appen
0ea0: 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e  ded and other in
0eb0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20  itialization.** 
0ec0: 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  and finalization
0ed0: 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74 74   steps are omitt
0ee0: 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73 65  ed because those
0ef0: 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62 79   are handling by
0f00: 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73   the.** outermos
0f10: 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20  t parser..**.** 
0f20: 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20 69  Not everything i
0f30: 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68 69  s nestable.  Thi
0f40: 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64 65  s facility is de
0f50: 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69 74  signed to permit
0f60: 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41  .** INSERT, UPDA
0f70: 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 6f  TE, and DELETE o
0f80: 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e 73  perations agains
0f90: 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e  t SQLITE_MASTER.
0fa0: 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69 66    Use.** care if
0fb0: 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20 74   you decide to t
0fc0: 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20 72  ry to use this r
0fd0: 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20  outine for some 
0fe0: 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a  other purposes..
0ff0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e  */.void sqlite3N
1000: 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73 65  estedParse(Parse
1010: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
1020: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
1030: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
1040: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  p;.  char *zSql;
1050: 0a 20 20 69 6e 74 20 72 63 3b 0a 23 20 64 65 66  .  int rc;.# def
1060: 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69  ine SAVE_SZ  (si
1070: 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66  zeof(Parse) - of
1080: 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61  fsetof(Parse,nVa
1090: 72 29 29 0a 20 20 63 68 61 72 20 73 61 76 65 42  r)).  char saveB
10a0: 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20  uf[SAVE_SZ];..  
10b0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
10c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
10d0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73  ert( pParse->nes
10e0: 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65  ted<10 );  /* Ne
10f0: 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c  sting should onl
1100: 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20  y be of limited 
1110: 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74  depth */.  va_st
1120: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
1130: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
1140: 65 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72 6d  e3VMPrintf(zForm
1150: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
1160: 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71  d(ap);.  if( zSq
1170: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  l==0 ){.    retu
1180: 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f  rn;   /* A mallo
1190: 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
11a0: 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72  ed */.  }.  pPar
11b0: 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20  se->nested++;.  
11c0: 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20  memcpy(saveBuf, 
11d0: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53  &pParse->nVar, S
11e0: 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65  AVE_SZ);.  memse
11f0: 74 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  t(&pParse->nVar,
1200: 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20   0, SAVE_SZ);.  
1210: 72 63 20 3d 20 73 71 6c 69 74 65 33 52 75 6e 50  rc = sqlite3RunP
1220: 61 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53  arser(pParse, zS
1230: 71 6c 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  ql, 0);.  sqlite
1240: 46 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 6d 65  Free(zSql);.  me
1250: 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e 6e 56  mcpy(&pParse->nV
1260: 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53 41 56  ar, saveBuf, SAV
1270: 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d  E_SZ);.  pParse-
1280: 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a  >nested--;.}../*
1290: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
12a0: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
12b0: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
12c0: 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  s a particular d
12d0: 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65  atabase.** table
12e0: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
12f0: 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e  of that table an
1300: 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74  d (optionally) t
1310: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a  he name of the.*
1320: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  * database conta
1330: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e  ining the table.
1340: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
1350: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
1360: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
1370: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
1380: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
1390: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e  for the table an
13a0: 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d  d the.** first m
13b0: 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69 73  atching table is
13c0: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
13d0: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75 70  checking for dup
13e0: 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20  licate table.** 
13f0: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
1400: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
1410: 72 20 69 73 20 54 45 4d 50 20 66 69 72 73 74 2c  r is TEMP first,
1420: 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e   then MAIN, then
1430: 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72   any.** auxiliar
1440: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
1450: 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41  d using the ATTA
1460: 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  CH command..**.*
1470: 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
1480: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e  e3LocateTable().
1490: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
14a0: 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69  e3FindTable(sqli
14b0: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
14c0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
14d0: 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73  t char *zDatabas
14e0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d  e){.  Table *p =
14f0: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61   0;.  int i;.  a
1500: 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20  ssert( zName!=0 
1510: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 64 62  );.  assert( (db
1520: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1530: 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 20 7c 7c  _Initialized) ||
1540: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
1550: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
1560: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
1570: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
1580: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20  ? i^1 : i;   /* 
1590: 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f  Search TEMP befo
15a0: 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69  re MAIN */.    i
15b0: 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20  f( zDatabase!=0 
15c0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
15d0: 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d  p(zDatabase, db-
15e0: 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29  >aDb[j].zName) )
15f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
1600: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
1610: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74  nd(&db->aDb[j].t
1620: 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73  blHash, zName, s
1630: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b  trlen(zName)+1);
1640: 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65  .    if( p ) bre
1650: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
1660: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63   p;.}../*.** Loc
1670: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
1680: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
1690: 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72   describes a par
16a0: 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
16b0: 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20  .** table given 
16c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
16d0: 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69   table and (opti
16e0: 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65  onally) the name
16f0: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
1700: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
1710: 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
1720: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
1730: 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65  und.  Also leave
1740: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73   an.** error mes
1750: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
1760: 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
1770: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
1780: 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
1790: 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69  ne and sqlite3Fi
17a0: 6e 64 54 61 62 6c 65 28 29 20 69 73 20 74 68 61  ndTable() is tha
17b0: 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  t this.** routin
17c0: 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f  e leaves an erro
17d0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
17e0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65  rse->zErrMsg whe
17f0: 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e  re.** sqlite3Fin
1800: 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f  dTable() does no
1810: 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  t..*/.Table *sql
1820: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
1830: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
1840: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1850: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
1860: 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  base){.  Table *
1870: 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  p;..  /* Read th
1880: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1890: 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  a. If an error o
18a0: 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
18b0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20  error message.  
18c0: 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70  ** and code in p
18d0: 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
18e0: 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20   NULL. */.  if( 
18f0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
1900: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
1910: 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rse) ){.    retu
1920: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d  rn 0;.  }..  p =
1930: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
1940: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e  e(pParse->db, zN
1950: 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20  ame, zDbase);.  
1960: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
1970: 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20 20  if( zDbase ){.  
1980: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1990: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
19a0: 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 2e 25  such table: %s.%
19b0: 73 22 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d  s", zDbase, zNam
19c0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  e);.    }else if
19d0: 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
19e0: 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  le(pParse->db, z
19f0: 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20  Name, 0)!=0 ){. 
1a00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1a10: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
1a20: 62 6c 65 20 5c 22 25 73 5c 22 20 69 73 20 6e 6f  ble \"%s\" is no
1a30: 74 20 69 6e 20 64 61 74 61 62 61 73 65 20 5c 22  t in database \"
1a40: 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\"",.         
1a50: 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a  zName, zDbase);.
1a60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a70: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1a80: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
1a90: 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 4e  h table: %s", zN
1aa0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
1ab0: 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
1ac0: 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  ema = 1;.  }.  r
1ad0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
1ae0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
1af0: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
1b00: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
1b10: 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72  .** a particular
1b20: 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65   index given the
1b30: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e   name of that in
1b40: 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e  dex.** and the n
1b50: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1b60: 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ase that contain
1b70: 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20  s the index..** 
1b80: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
1b90: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  ot found..**.** 
1ba0: 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20  If zDatabase is 
1bb0: 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  0, all databases
1bc0: 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f   are searched fo
1bd0: 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61  r the.** table a
1be0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  nd the first mat
1bf0: 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72  ching index is r
1c00: 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68  eturned.  (No ch
1c10: 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75  ecking.** for du
1c20: 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61  plicate index na
1c30: 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54  mes is done.)  T
1c40: 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20  he search order 
1c50: 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74  is.** TEMP first
1c60: 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65  , then MAIN, the
1c70: 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20  n any auxiliary 
1c80: 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64 0a  databases added.
1c90: 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54 54  ** using the ATT
1ca0: 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  ACH command..*/.
1cb0: 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69  Index *sqlite3Fi
1cc0: 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  ndIndex(sqlite3 
1cd0: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1ce0: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
1cf0: 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65  ar *zDb){.  Inde
1d00: 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  x *p = 0;.  int 
1d10: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 28 64 62  i;.  assert( (db
1d20: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1d30: 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 20 7c 7c  _Initialized) ||
1d40: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
1d50: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
1d60: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
1d70: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
1d80: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53  ? i^1 : i;  /* S
1d90: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
1da0: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66  e MAIN */.    if
1db0: 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33  ( zDb && sqlite3
1dc0: 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d  StrICmp(zDb, db-
1dd0: 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29  >aDb[j].zName) )
1de0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
1df0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
1e00: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 69  nd(&db->aDb[j].i
1e10: 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73  dxHash, zName, s
1e20: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b  trlen(zName)+1);
1e30: 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65  .    if( p ) bre
1e40: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
1e50: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63   p;.}../*.** Rec
1e60: 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20  laim the memory 
1e70: 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78  used by an index
1e80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e90: 66 72 65 65 49 6e 64 65 78 28 49 6e 64 65 78 20  freeIndex(Index 
1ea0: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65  *p){.  sqliteFre
1eb0: 65 28 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  e(p->zColAff);. 
1ec0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a   sqliteFree(p);.
1ed0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
1ee0: 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20  the given index 
1ef0: 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68  from the index h
1f00: 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20 66  ash table, and f
1f10: 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f 72  ree.** its memor
1f20: 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a  y structures..**
1f30: 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69 73  .** The index is
1f40: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
1f50: 65 20 64 61 74 61 62 61 73 65 20 68 61 73 68 20  e database hash 
1f60: 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69 74  tables but.** it
1f70: 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64   is not unlinked
1f80: 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20   from the Table 
1f90: 74 68 61 74 20 69 74 20 69 6e 64 65 78 65 73 2e  that it indexes.
1fa0: 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72  .** Unlinking fr
1fb0: 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75 73  om the Table mus
1fc0: 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68 65  t be done by the
1fd0: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
1fe0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1ff0: 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e  d sqliteDeleteIn
2000: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
2010: 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e   Index *p){.  In
2020: 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20 20 61 73  dex *pOld;..  as
2030: 73 65 72 74 28 20 64 62 21 3d 30 20 26 26 20 70  sert( db!=0 && p
2040: 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ->zName!=0 );.  
2050: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
2060: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
2070: 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73  b[p->iDb].idxHas
2080: 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  h, 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 20 73 74 72 6c 65 6e 28 70 2d         strlen(p-
20b0: 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20  >zName)+1, 0);. 
20c0: 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 26 26 20   if( pOld!=0 && 
20d0: 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20 73  pOld!=p ){.    s
20e0: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
20f0: 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62  (&db->aDb[p->iDb
2100: 5d 2e 69 64 78 48 61 73 68 2c 20 70 4f 6c 64 2d  ].idxHash, pOld-
2110: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
2130: 6c 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29  len(pOld->zName)
2140: 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a 20  +1, pOld);.  }. 
2150: 20 66 72 65 65 49 6e 64 65 78 28 70 29 3b 0a 7d   freeIndex(p);.}
2160: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74  ../*.** Unlink t
2170: 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66  he given index f
2180: 72 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c 20 74  rom its table, t
2190: 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20 74 68  hen remove.** th
21a0: 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65  e index from the
21b0: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
21c0: 65 20 61 6e 64 20 66 72 65 65 20 69 74 73 20 6d  e and free its m
21d0: 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63 74 75  emory.** structu
21e0: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
21f0: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
2200: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  eteIndex(sqlite3
2210: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
2220: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e  onst char *zIdxN
2230: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
2240: 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c 65 6e  Index;.  int len
2250: 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  ;..  len = strle
2260: 6e 28 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70  n(zIdxName);.  p
2270: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 48  Index = sqlite3H
2280: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61  ashInsert(&db->a
2290: 44 62 5b 69 44 62 5d 2e 69 64 78 48 61 73 68 2c  Db[iDb].idxHash,
22a0: 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31   zIdxName, len+1
22b0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  , 0);.  if( pInd
22c0: 65 78 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ex ){.    if( pI
22d0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
22e0: 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  ndex==pIndex ){.
22f0: 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54        pIndex->pT
2300: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70  able->pIndex = p
2310: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
2320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
2330: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 66  ndex *p;.      f
2340: 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61  or(p=pIndex->pTa
2350: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  ble->pIndex; p &
2360: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
2370: 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b  ex; p=p->pNext){
2380: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20 26 26  }.      if( p &&
2390: 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65   p->pNext==pInde
23a0: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  x ){.        p->
23b0: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
23c0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
23d0: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64     }.    freeInd
23e0: 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  ex(pIndex);.  }.
23f0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
2400: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
2410: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  ges;.}../*.** Er
2420: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
2430: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
2440: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
2450: 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20  sh tables of.** 
2460: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
2470: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
2480: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
2490: 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20  claim memory.** 
24a0: 62 65 66 6f 72 65 20 74 68 65 20 64 61 74 61 62  before the datab
24b0: 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49 74 20  ase closes.  It 
24c0: 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64  is also called d
24d0: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
24e0: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72  .** if there wer
24f0: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
2500: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
2510: 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a  saction or if a.
2520: 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65  ** schema-cookie
2530: 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75 72 73   mismatch occurs
2540: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 3d  ..**.** If iDb<=
2550: 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65  0 then reset the
2560: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
2570: 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20   tables for all 
2580: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
2590: 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20 74 68  s.  If iDb>=2 th
25a0: 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74  en reset the int
25b0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72  ernal schema for
25c0: 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e   only the.** sin
25d0: 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74  gle file indicat
25e0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
25f0: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
2600: 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a  Schema(sqlite3 *
2610: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
2620: 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b  HashElem *pElem;
2630: 0a 20 20 48 61 73 68 20 74 65 6d 70 31 3b 0a 20  .  Hash temp1;. 
2640: 20 48 61 73 68 20 74 65 6d 70 32 3b 0a 20 20 69   Hash temp2;.  i
2650: 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65  nt i, j;..  asse
2660: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
2670: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 64  b<db->nDb );.  d
2680: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
2690: 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 3b  ITE_Initialized;
26a0: 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c  .  for(i=iDb; i<
26b0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
26c0: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
26d0: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 74 65  ->aDb[i];.    te
26e0: 6d 70 31 20 3d 20 70 44 62 2d 3e 74 62 6c 48 61  mp1 = pDb->tblHa
26f0: 73 68 3b 0a 20 20 20 20 74 65 6d 70 32 20 3d 20  sh;.    temp2 = 
2700: 70 44 62 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20  pDb->trigHash;. 
2710: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
2720: 69 74 28 26 70 44 62 2d 3e 74 72 69 67 48 61 73  it(&pDb->trigHas
2730: 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53  h, SQLITE_HASH_S
2740: 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73  TRING, 0);.    s
2750: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
2760: 26 70 44 62 2d 3e 61 46 4b 65 79 29 3b 0a 20 20  &pDb->aFKey);.  
2770: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
2780: 61 72 28 26 70 44 62 2d 3e 69 64 78 48 61 73 68  ar(&pDb->idxHash
2790: 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d  );.    for(pElem
27a0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
27b0: 28 26 74 65 6d 70 32 29 3b 20 70 45 6c 65 6d 3b  (&temp2); pElem;
27c0: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
27d0: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
27e0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
27f0: 74 65 54 72 69 67 67 65 72 28 28 54 72 69 67 67  teTrigger((Trigg
2800: 65 72 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  er*)sqliteHashDa
2810: 74 61 28 70 45 6c 65 6d 29 29 3b 0a 20 20 20 20  ta(pElem));.    
2820: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73  }.    sqlite3Has
2830: 68 43 6c 65 61 72 28 26 74 65 6d 70 32 29 3b 0a  hClear(&temp2);.
2840: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
2850: 6e 69 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73  nit(&pDb->tblHas
2860: 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53  h, SQLITE_HASH_S
2870: 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 66  TRING, 0);.    f
2880: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
2890: 61 73 68 46 69 72 73 74 28 26 74 65 6d 70 31 29  ashFirst(&temp1)
28a0: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
28b0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
28c0: 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 54 61 62  lem)){.      Tab
28d0: 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
28e0: 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
28f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
2900: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
2910: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Tab);.    }.    
2920: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
2930: 28 26 74 65 6d 70 31 29 3b 0a 20 20 20 20 70 44  (&temp1);.    pD
2940: 62 2d 3e 70 53 65 71 54 61 62 20 3d 20 30 3b 0a  b->pSeqTab = 0;.
2950: 20 20 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65      DbClearPrope
2960: 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 53 63  rty(db, i, DB_Sc
2970: 68 65 6d 61 4c 6f 61 64 65 64 29 3b 0a 20 20 20  hemaLoaded);.   
2980: 20 69 66 28 20 69 44 62 3e 30 20 29 20 72 65 74   if( iDb>0 ) ret
2990: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
29a0: 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64  t( iDb==0 );.  d
29b0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
29c0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
29d0: 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20  s;..  /* If one 
29e0: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 61  or more of the a
29f0: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
2a00: 65 20 66 69 6c 65 73 20 68 61 73 20 62 65 65 6e  e files has been
2a10: 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68   closed,.  ** th
2a20: 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 6e 20 66  en remove then f
2a30: 72 6f 6d 20 74 68 65 20 61 75 78 69 6c 69 61 72  rom the auxiliar
2a40: 79 20 64 61 74 61 62 61 73 65 20 6c 69 73 74 2e  y database list.
2a50: 20 20 57 65 20 74 61 6b 65 20 74 68 65 0a 20 20    We take the.  
2a60: 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  ** opportunity t
2a70: 6f 20 64 6f 20 74 68 69 73 20 68 65 72 65 20 73  o do this here s
2a80: 69 6e 63 65 20 77 65 20 68 61 76 65 20 6a 75 73  ince we have jus
2a90: 74 20 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66  t deleted all of
2aa0: 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61   the.  ** schema
2ab0: 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64   hash tables and
2ac0: 20 74 68 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f   therefore do no
2ad0: 74 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61  t have to make a
2ae0: 6e 79 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20  ny changes.  ** 
2af0: 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20  to any of those 
2b00: 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66  tables..  */.  f
2b10: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
2b20: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  b; i++){.    str
2b30: 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64  uct Db *pDb = &d
2b40: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
2b50: 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29  f( pDb->pBt==0 )
2b60: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
2b70: 3e 70 41 75 78 20 26 26 20 70 44 62 2d 3e 78 46  >pAux && pDb->xF
2b80: 72 65 65 41 75 78 20 29 20 70 44 62 2d 3e 78 46  reeAux ) pDb->xF
2b90: 72 65 65 41 75 78 28 70 44 62 2d 3e 70 41 75 78  reeAux(pDb->pAux
2ba0: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 41  );.      pDb->pA
2bb0: 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ux = 0;.    }.  
2bc0: 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69  }.  for(i=j=2; i
2bd0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
2be0: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
2bf0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
2c00: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
2c10: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  Bt==0 ){.      s
2c20: 71 6c 69 74 65 46 72 65 65 28 70 44 62 2d 3e 7a  qliteFree(pDb->z
2c30: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62  Name);.      pDb
2c40: 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ->zName = 0;.   
2c50: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2c60: 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29   }.    if( j<i )
2c70: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  {.      db->aDb[
2c80: 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b  j] = db->aDb[i];
2c90: 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a  .    }.    j++;.
2ca0: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62    }.  memset(&db
2cb0: 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62  ->aDb[j], 0, (db
2cc0: 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28  ->nDb-j)*sizeof(
2cd0: 64 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20  db->aDb[j]));.  
2ce0: 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69  db->nDb = j;.  i
2cf0: 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26  f( db->nDb<=2 &&
2d00: 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44   db->aDb!=db->aD
2d10: 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d  bStatic ){.    m
2d20: 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61  emcpy(db->aDbSta
2d30: 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a  tic, db->aDb, 2*
2d40: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30  sizeof(db->aDb[0
2d50: 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  ]));.    sqliteF
2d60: 72 65 65 28 64 62 2d 3e 61 44 62 29 3b 0a 20 20  ree(db->aDb);.  
2d70: 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e    db->aDb = db->
2d80: 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d  aDbStatic;.  }.}
2d90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2da0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
2db0: 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61  henever a rollba
2dc0: 63 6b 20 6f 63 63 75 72 73 2e 20 20 49 66 20 74  ck occurs.  If t
2dd0: 68 65 72 65 20 77 65 72 65 0a 2a 2a 20 73 63 68  here were.** sch
2de0: 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69  ema changes duri
2df0: 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ng the transacti
2e00: 6f 6e 2c 20 74 68 65 6e 20 77 65 20 68 61 76 65  on, then we have
2e10: 20 74 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a   to reset the.**
2e20: 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74   internal hash t
2e30: 61 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f 61 64  ables and reload
2e40: 20 74 68 65 6d 20 66 72 6f 6d 20 64 69 73 6b 2e   them from disk.
2e50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2e60: 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c  RollbackInternal
2e70: 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
2e80: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
2e90: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
2ea0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a  nternChanges ){.
2eb0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
2ec0: 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64  InternalSchema(d
2ed0: 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  b, 0);.  }.}../*
2ee0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2ef0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
2f00: 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e  a commit occurs.
2f10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2f20: 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
2f30: 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
2f40: 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  b){.  db->flags 
2f50: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
2f60: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
2f70: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c  ** Clear the col
2f80: 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 61  umn names from a
2f90: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2e 0a   table or view..
2fa0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2fb0: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
2fc0: 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70 54 61  Names(Table *pTa
2fd0: 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ble){.  int i;. 
2fe0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
2ff0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21   assert( pTable!
3000: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  =0 );.  for(i=0,
3010: 20 70 43 6f 6c 3d 70 54 61 62 6c 65 2d 3e 61 43   pCol=pTable->aC
3020: 6f 6c 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  ol; i<pTable->nC
3030: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
3040: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
3050: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
3060: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
3070: 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66 6c 74  lete(pCol->pDflt
3080: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
3090: 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a  e(pCol->zType);.
30a0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
30b0: 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a  (pTable->aCol);.
30c0: 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d    pTable->aCol =
30d0: 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43   0;.  pTable->nC
30e0: 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ol = 0;.}../*.**
30f0: 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f   Remove the memo
3100: 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ry data structur
3110: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
3120: 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  th the given.** 
3130: 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67  Table.  No chang
3140: 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64  es are made to d
3150: 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74  isk by this rout
3160: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ine..**.** This 
3170: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c  routine just del
3180: 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74  etes the data st
3190: 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65  ructure.  It doe
31a0: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20  s not unlink.** 
31b0: 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73  the table data s
31c0: 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
31d0: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4e  e hash table.  N
31e0: 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d 6f 76  or does it remov
31f0: 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79  e.** foreign key
3200: 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74  s from the sqlit
3210: 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62  e.aFKey hash tab
3220: 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73  le.  But it does
3230: 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f   destroy.** memo
3240: 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66  ry structures of
3250: 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64   the indices and
3260: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73   foreign keys as
3270: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a  sociated with .*
3280: 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  * the table..**.
3290: 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73 6f 63  ** Indices assoc
32a0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
32b0: 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e 6b 65  able are unlinke
32c0: 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62 22 0a  d from the "db".
32d0: 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ** data structur
32e0: 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e 20 20  e if db!=NULL.  
32f0: 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64  If db==NULL, ind
3300: 69 63 65 73 20 61 74 74 61 63 68 65 64 20 74 6f  ices attached to
3310: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 61 72  .** the table ar
3320: 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74 20 69  e deleted, but i
3330: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 65  t is assumed the
3340: 79 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  y have already b
3350: 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e  een.** unlinked.
3360: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3370: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
3380: 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  te3 *db, Table *
3390: 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78  pTable){.  Index
33a0: 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74   *pIndex, *pNext
33b0: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c  ;.  FKey *pFKey,
33c0: 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20   *pNextFKey;..  
33d0: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20  if( pTable==0 ) 
33e0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 65  return;..  /* De
33f0: 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  lete all indices
3400: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3410: 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f   this table.  */
3420: 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20  .  for(pIndex = 
3430: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
3440: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
3450: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
3460: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
3470: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
3480: 6e 64 65 78 2d 3e 69 44 62 3d 3d 70 54 61 62 6c  ndex->iDb==pTabl
3490: 65 2d 3e 69 44 62 20 7c 7c 20 28 70 54 61 62 6c  e->iDb || (pTabl
34a0: 65 2d 3e 69 44 62 3d 3d 30 20 26 26 20 70 49 6e  e->iDb==0 && pIn
34b0: 64 65 78 2d 3e 69 44 62 3d 3d 31 29 20 29 3b 0a  dex->iDb==1) );.
34c0: 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65      sqliteDelete
34d0: 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
34e0: 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
34f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
3500: 49 47 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 65 6c  IGN_KEY.  /* Del
3510: 65 74 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20  ete all foreign 
3520: 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  keys associated 
3530: 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e  with this table.
3540: 20 20 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20    The keys.  ** 
3550: 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65  should have alre
3560: 61 64 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65  ady been unlinke
3570: 64 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 61  d from the db->a
3580: 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65 20  FKey hash table 
3590: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b 65  .  */.  for(pFKe
35a0: 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79 3b  y=pTable->pFKey;
35b0: 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e   pFKey; pFKey=pN
35c0: 65 78 74 46 4b 65 79 29 7b 0a 20 20 20 20 70 4e  extFKey){.    pN
35d0: 65 78 74 46 4b 65 79 20 3d 20 70 46 4b 65 79 2d  extFKey = pFKey-
35e0: 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20  >pNextFrom;.    
35f0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
3600: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
3610: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
3620: 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
3630: 61 44 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d  aDb[pTable->iDb]
3640: 2e 61 46 4b 65 79 2c 0a 20 20 20 20 20 20 20 20  .aFKey,.        
3650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3660: 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73     pFKey->zTo, s
3670: 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f  trlen(pFKey->zTo
3680: 29 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20  )+1)!=pFKey );. 
3690: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 46     sqliteFree(pF
36a0: 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Key);.  }.#endif
36b0: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
36c0: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
36d0: 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20  e itself..  */. 
36e0: 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75   sqliteResetColu
36f0: 6d 6e 4e 61 6d 65 73 28 70 54 61 62 6c 65 29 3b  mnNames(pTable);
3700: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
3710: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
3720: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
3730: 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73  e->zColAff);.  s
3740: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
3750: 74 65 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  te(pTable->pSele
3760: 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ct);.  sqliteFre
3770: 65 28 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a  e(pTable);.}../*
3780: 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67  .** Unlink the g
3790: 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20  iven table from 
37a0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  the hash tables 
37b0: 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20 74  and the delete t
37c0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75  he.** table stru
37d0: 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69  cture with all i
37e0: 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66  ts indices and f
37f0: 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a  oreign keys..*/.
3800: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
3810: 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65  nkAndDeleteTable
3820: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
3830: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
3840: 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20  r *zTabName){.  
3850: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 46 4b 65 79  Table *p;.  FKey
3860: 20 2a 70 46 31 2c 20 2a 70 46 32 3b 0a 20 20 44   *pF1, *pF2;.  D
3870: 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72  b *pDb;..  asser
3880: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
3890: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
38a0: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
38b0: 20 61 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d   assert( zTabNam
38c0: 65 20 26 26 20 7a 54 61 62 4e 61 6d 65 5b 30 5d  e && zTabName[0]
38d0: 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d   );.  pDb = &db-
38e0: 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d  >aDb[iDb];.  p =
38f0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
3900: 72 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68  rt(&pDb->tblHash
3910: 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c  , zTabName, strl
3920: 65 6e 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 20  en(zTabName)+1, 
3930: 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 23  0);.  if( p ){.#
3940: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3950: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
3960: 20 20 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46     for(pF1=p->pF
3970: 4b 65 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46  Key; pF1; pF1=pF
3980: 31 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20  1->pNextFrom){. 
3990: 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73       int nTo = s
39a0: 74 72 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20  trlen(pF1->zTo) 
39b0: 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 32 20 3d  + 1;.      pF2 =
39c0: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
39d0: 28 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46  (&pDb->aFKey, pF
39e0: 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20  1->zTo, nTo);.  
39f0: 20 20 20 20 69 66 28 20 70 46 32 3d 3d 70 46 31      if( pF2==pF1
3a00: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3a10: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
3a20: 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e  Db->aFKey, pF1->
3a30: 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70  zTo, nTo, pF1->p
3a40: 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d  NextTo);.      }
3a50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68  else{.        wh
3a60: 69 6c 65 28 20 70 46 32 20 26 26 20 70 46 32 2d  ile( pF2 && pF2-
3a70: 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b  >pNextTo!=pF1 ){
3a80: 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54   pF2=pF2->pNextT
3a90: 6f 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  o; }.        if(
3aa0: 20 70 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20   pF2 ){.        
3ab0: 20 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d    pF2->pNextTo =
3ac0: 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20   pF1->pNextTo;. 
3ad0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
3ae0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
3af0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
3b00: 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d  able(db, p);.  }
3b10: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
3b20: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
3b30: 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  nges;.}../*.** G
3b40: 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65  iven a token, re
3b50: 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68  turn a string th
3b60: 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  at consists of t
3b70: 68 65 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a  he text of that.
3b80: 2a 2a 20 74 6f 6b 65 6e 20 77 69 74 68 20 61 6e  ** token with an
3b90: 79 20 71 75 6f 74 61 74 69 6f 6e 73 20 72 65 6d  y quotations rem
3ba0: 6f 76 65 64 2e 20 20 53 70 61 63 65 20 74 6f 20  oved.  Space to 
3bb0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
3bc0: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f  d string.** is o
3bd0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
3be0: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
3bf0: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
3c00: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
3c10: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
3c20: 54 6f 6b 65 6e 73 20 61 72 65 20 72 65 61 6c 6c  Tokens are reall
3c30: 79 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20  y just pointers 
3c40: 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
3c50: 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73  l SQL text and s
3c60: 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30  o.** are not \00
3c70: 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64  0 terminated and
3c80: 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74   are not persist
3c90: 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ent.  The return
3ca0: 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20  ed string.** is 
3cb0: 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20  \000 terminated 
3cc0: 61 6e 64 20 69 73 20 70 65 72 73 69 73 74 65 6e  and is persisten
3cd0: 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  t..*/.char *sqli
3ce0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
3cf0: 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a  (Token *pName){.
3d00: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
3d10: 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
3d20: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
3d30: 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a  StrNDup(pName->z
3d40: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  , pName->n);.   
3d50: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
3d60: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  zName);.  }else{
3d70: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a  .    zName = 0;.
3d80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61    }.  return zNa
3d90: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  me;.}../*.** Ope
3da0: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
3db0: 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64  ter table stored
3dc0: 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d   in database num
3dd0: 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77  ber iDb for.** w
3de0: 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c  riting. The tabl
3df0: 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e  e is opened usin
3e00: 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76  g cursor 0..*/.v
3e10: 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d  oid sqlite3OpenM
3e20: 61 73 74 65 72 54 61 62 6c 65 28 56 64 62 65 20  asterTable(Vdbe 
3e30: 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *v, int iDb){.  
3e40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3e50: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
3e60: 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  iDb, 0);.  sqlit
3e70: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3e80: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20  P_OpenWrite, 0, 
3e90: 4d 41 53 54 45 52 5f 52 4f 4f 54 29 3b 0a 20 20  MASTER_ROOT);.  
3ea0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3eb0: 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c  (v, OP_SetNumCol
3ec0: 75 6d 6e 73 2c 20 30 2c 20 35 29 3b 20 2f 2a 20  umns, 0, 5); /* 
3ed0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 68 61  sqlite_master ha
3ee0: 73 20 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d  s 5 columns */.}
3ef0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65  ../*.** The toke
3f00: 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e  n *pName contain
3f10: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
3f20: 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72  database (either
3f30: 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74   "main" or.** "t
3f40: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
3f50: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
3f60: 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  db). This routin
3f70: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
3f80: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61   index of the na
3f90: 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20  med database in 
3fa0: 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31  db->aDb[], or -1
3fb0: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62   if the named db
3fc0: 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78   .** does not ex
3fd0: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
3fe0: 6e 74 20 66 69 6e 64 44 62 28 73 71 6c 69 74 65  nt findDb(sqlite
3ff0: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
4000: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ame){.  int i = 
4010: 2d 31 3b 20 20 20 20 2f 2a 20 44 61 74 61 62 61  -1;    /* Databa
4020: 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  se number */.  i
4030: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  nt n;         /*
4040: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
4050: 63 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61 6d  cters in the nam
4060: 65 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20  e */.  Db *pDb; 
4070: 20 20 20 20 20 20 2f 2a 20 41 20 64 61 74 61 62        /* A datab
4080: 61 73 65 20 77 68 6f 73 65 20 6e 61 6d 65 20 73  ase whose name s
4090: 70 61 63 65 20 69 73 20 62 65 69 6e 67 20 73 65  pace is being se
40a0: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 68 61 72  arched */.  char
40b0: 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61   *zName;   /* Na
40c0: 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68  me we are search
40d0: 69 6e 67 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a 4e  ing for */..  zN
40e0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
40f0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
4100: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  );.  if( zName )
4110: 7b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e  {.    n = strlen
4120: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72  (zName);.    for
4130: 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20  (i=(db->nDb-1), 
4140: 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  pDb=&db->aDb[i];
4150: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d   i>=0; i--, pDb-
4160: 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d  -){.      if( n=
4170: 3d 73 74 72 6c 65 6e 28 70 44 62 2d 3e 7a 4e 61  =strlen(pDb->zNa
4180: 6d 65 29 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  me) && 0==sqlite
4190: 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e  3StrICmp(pDb->zN
41a0: 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  ame, zName) ){. 
41b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
41c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
41d0: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
41e0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
41f0: 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62  i;.}../* The tab
4200: 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72  le or view or tr
4210: 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61  igger name is pa
4220: 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75  ssed to this rou
4230: 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a  tine via tokens.
4240: 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e  ** pName1 and pN
4250: 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62  ame2. If the tab
4260: 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c  le name was full
4270: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72  y qualified, for
4280: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
4290: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78  CREATE TABLE xxx
42a0: 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a  .yyy (...);.** .
42b0: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
42c0: 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61  s set to "xxx" a
42d0: 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e  nd pName2 "yyy".
42e0: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
42f0: 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  nd if.** the tab
4300: 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66  le name is not f
4310: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
4320: 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41  i.e.:.**.** CREA
4330: 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e  TE TABLE yyy(...
4340: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e  );.**.** Then pN
4350: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
4360: 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  yyy" and pName2 
4370: 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  is ""..**.** Thi
4380: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
4390: 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69  he *ppUnqual poi
43a0: 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  nter to point at
43b0: 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d   the token (pNam
43c0: 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29  e1 or.** pName2)
43d0: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
43e0: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   unqualified tab
43f0: 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e  le name.  The in
4400: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  dex of the.** da
4410: 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20  tabase "xxx" is 
4420: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
4430: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
4440: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
4450: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
4460: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
4470: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
4480: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
4490: 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68  ame1,      /* Th
44a0: 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e  e "xxx" in the n
44b0: 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72  ame "xxx.yyy" or
44c0: 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65   "xxx" */.  Toke
44d0: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20  n *pName2,      
44e0: 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20  /* The "yyy" in 
44f0: 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79  the name "xxx.yy
4500: 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a  y" */.  Token **
4510: 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57  pUnqual     /* W
4520: 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69  rite the unquali
4530: 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65  fied object name
4540: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
4550: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
4560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
4570: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68  abase holding th
4580: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  e object */.  sq
4590: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
45a0: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
45b0: 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d  Name2 && pName2-
45c0: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65  >n>0 ){.    asse
45d0: 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
45e0: 73 79 20 29 3b 0a 20 20 20 20 2a 70 55 6e 71 75  sy );.    *pUnqu
45f0: 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20  al = pName2;.   
4600: 20 69 44 62 20 3d 20 66 69 6e 64 44 62 28 64 62   iDb = findDb(db
4610: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69  , pName1);.    i
4620: 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20  f( iDb<0 ){.    
4630: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4640: 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
4650: 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c  wn database %T",
4660: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20   pName1);.      
4670: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
4680: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
4690: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
46a0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
46b0: 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64  init.iDb==0 || d
46c0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a  b->init.busy );.
46d0: 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e      iDb = db->in
46e0: 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e  it.iDb;.    *pUn
46f0: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20  qual = pName1;. 
4700: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b   }.  return iDb;
4710: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
4720: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
4730: 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55  o check if the U
4740: 54 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d  TF-8 string zNam
4750: 65 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20  e is a legal.** 
4760: 75 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  unqualified name
4770: 20 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d   for a new schem
4780: 61 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c  a object (table,
4790: 20 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a   index, view or.
47a0: 2a 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c  ** trigger). All
47b0: 20 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c   names are legal
47c0: 20 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68   except those th
47d0: 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  at begin with th
47e0: 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c  e string.** "sql
47f0: 69 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c  ite_" (in upper,
4800: 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20   lower or mixed 
4810: 63 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74  case). This port
4820: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73  ion of the names
4830: 70 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72  pace.** is reser
4840: 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ved for internal
4850: 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   use..*/.int sql
4860: 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
4870: 61 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ame(Parse *pPars
4880: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
4890: 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50  Name){.  if( !pP
48a0: 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  arse->db->init.b
48b0: 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  usy && pParse->n
48c0: 65 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20  ested==0 .      
48d0: 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
48e0: 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c  3StrNICmp(zName,
48f0: 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29   "sqlite_", 7) )
4900: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
4910: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
4920: 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72  bject name reser
4930: 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ved for internal
4940: 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65   use: %s", zName
4950: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
4960: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
4970: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4980: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  OK;.}../*.** Beg
4990: 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20  in constructing 
49a0: 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72  a new table repr
49b0: 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65  esentation in me
49c0: 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a  mory.  This is.*
49d0: 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73  * the first of s
49e0: 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f  everal action ro
49f0: 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20  utines that get 
4a00: 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e  called in respon
4a10: 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54  se.** to a CREAT
4a20: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
4a30: 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61  t.  In particula
4a40: 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  r, this routine 
4a50: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74  is called.** aft
4a60: 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73  er seeing tokens
4a70: 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54   "CREATE" and "T
4a80: 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61  ABLE" and the ta
4a90: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a 2a  ble name.  The.*
4aa0: 2a 20 70 53 74 61 72 74 20 74 6f 6b 65 6e 20 69  * pStart token i
4ab0: 73 20 74 68 65 20 43 52 45 41 54 45 20 61 6e 64  s the CREATE and
4ac0: 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 74 61   pName is the ta
4ad0: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69  ble name.  The i
4ae0: 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73  sTemp.** flag is
4af0: 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62   true if the tab
4b00: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  le should be sto
4b10: 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c  red in the auxil
4b20: 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  iary database.**
4b30: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
4b40: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
4b50: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
4b60: 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68  s is normally th
4b70: 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74  e case.** when t
4b80: 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45  he "TEMP" or "TE
4b90: 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64  MPORARY" keyword
4ba0: 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65   occurs in betwe
4bb0: 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64  en.** CREATE and
4bc0: 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68   TABLE..**.** Th
4bd0: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
4be0: 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  rd is initialize
4bf0: 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61  d and put in pPa
4c00: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a  rse->pNewTable..
4c10: 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68  ** As more of th
4c20: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
4c30: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
4c40: 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61  ed, additional a
4c50: 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65  ction.** routine
4c60: 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  s will be called
4c70: 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66   to add more inf
4c80: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73  ormation to this
4c90: 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74   record..** At t
4ca0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
4cb0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
4cc0: 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65  ment, the sqlite
4cd0: 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74  3EndTable() rout
4ce0: 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
4cf0: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
4d00: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66   construction of
4d10: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   the new table r
4d20: 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ecord..*/.void s
4d30: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
4d40: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4d50: 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63  e,   /* Parser c
4d60: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
4d70: 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20  n *pStart,   /* 
4d80: 54 68 65 20 22 43 52 45 41 54 45 22 20 74 6f 6b  The "CREATE" tok
4d90: 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  en */.  Token *p
4da0: 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73  Name1,   /* Firs
4db0: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  t part of the na
4dc0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
4dd0: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  or view */.  Tok
4de0: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a  en *pName2,   /*
4df0: 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
4e00: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
4e10: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
4e20: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
4e30: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
4e40: 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61  his is a TEMP ta
4e50: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ble */.  int isV
4e60: 69 65 77 20 20 20 20 20 20 20 2f 2a 20 54 72 75  iew       /* Tru
4e70: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
4e80: 49 45 57 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  IEW */.){.  Tabl
4e90: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49 6e 64  e *pTable;.  Ind
4ea0: 65 78 20 2a 70 49 64 78 3b 0a 20 20 63 68 61 72  ex *pIdx;.  char
4eb0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20   *zName = 0; /* 
4ec0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
4ed0: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  new table */.  s
4ee0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
4ef0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
4f00: 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  *v;.  int iDb;  
4f10: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
4f20: 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65  se number to cre
4f30: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e  ate the table in
4f40: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
4f50: 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c  me;    /* Unqual
4f60: 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
4f70: 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74  e table to creat
4f80: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74  e */..  /* The t
4f90: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
4fa0: 65 20 74 6f 20 63 72 65 61 74 65 20 69 73 20 70  e to create is p
4fb0: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f  assed to this ro
4fc0: 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73  utine via tokens
4fd0: 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64  .  ** pName1 and
4fe0: 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20   pName2. If the 
4ff0: 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66  table name was f
5000: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
5010: 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a  for example:.  *
5020: 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41  *.  ** CREATE TA
5030: 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e  BLE xxx.yyy (...
5040: 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68  );.  ** .  ** Th
5050: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
5060: 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e   to "xxx" and pN
5070: 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74  ame2 "yyy". On t
5080: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66  he other hand if
5090: 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  .  ** the table 
50a0: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
50b0: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
50c0: 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45  .:.  **.  ** CRE
50d0: 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e  ATE TABLE yyy(..
50e0: 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .);.  **.  ** Th
50f0: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
5100: 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e   to "yyy" and pN
5110: 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a  ame2 is ""..  **
5120: 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62  .  ** The call b
5130: 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20 70 4e  elow sets the pN
5140: 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  ame pointer to p
5150: 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65  oint at the toke
5160: 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a  n (pName1 or.  *
5170: 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73  * pName2) that s
5180: 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c  tores the unqual
5190: 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65  ified table name
51a0: 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 69  . The variable i
51b0: 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74 20 74  Db is.  ** set t
51c0: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
51d0: 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
51e0: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
51f0: 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a  ew is to be.  **
5200: 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a   created in..  *
5210: 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  /.  iDb = sqlite
5220: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
5230: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
5240: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
5250: 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
5260: 72 6e 3b 0a 20 20 69 66 28 20 69 73 54 65 6d 70  rn;.  if( isTemp
5270: 20 26 26 20 69 44 62 3e 31 20 29 7b 0a 20 20 20   && iDb>1 ){.   
5280: 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20   /* If creating 
5290: 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68  a temp table, th
52a0: 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62  e name may not b
52b0: 65 20 71 75 61 6c 69 66 69 65 64 20 2a 2f 0a 20  e qualified */. 
52c0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
52d0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70  sg(pParse, "temp
52e0: 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  orary table name
52f0: 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69   must be unquali
5300: 66 69 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75  fied");.    retu
5310: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  rn;.  }.  if( is
5320: 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a  Temp ) iDb = 1;.
5330: 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65  .  pParse->sName
5340: 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a  Token = *pName;.
5350: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
5360: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
5370: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
5380: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
5390: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
53a0: 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
53b0: 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
53c0: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f  zName) ){.    go
53d0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
53e0: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rror;.  }.  if( 
53f0: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20  db->init.iDb==1 
5400: 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69  ) isTemp = 1;.#i
5410: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5420: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
5430: 20 20 61 73 73 65 72 74 28 20 28 69 73 54 65 6d    assert( (isTem
5440: 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29  p & 1)==isTemp )
5450: 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  ;.  {.    int co
5460: 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44  de;.    char *zD
5470: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
5480: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
5490: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
54a0: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
54b0: 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
54c0: 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c  ABLE(isTemp), 0,
54d0: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
54e0: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
54f0: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
5500: 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
5510: 20 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20       if( isTemp 
5520: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
5530: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
5540: 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
5550: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5560: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
5570: 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20  EATE_VIEW;.     
5580: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5590: 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29      if( isTemp )
55a0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
55b0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
55c0: 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
55d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
55e0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
55f0: 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20  EATE_TABLE;.    
5600: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
5610: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
5620: 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
5630: 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20   zName, 0, zDb) 
5640: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
5650: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
5660: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
5670: 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
5680: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  e the new table 
5690: 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f  name does not co
56a0: 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65 78  llide with an ex
56b0: 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65  isting.  ** inde
56c0: 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20  x or table name 
56d0: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
56e0: 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20  base.  Issue an 
56f0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66  error message if
5700: 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 0a 20  .  ** it does.. 
5710: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
5720: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
5730: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
5740: 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  {.    goto begin
5750: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
5760: 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  }.  pTable = sql
5770: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
5780: 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62  , zName, db->aDb
5790: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  [iDb].zName);.  
57a0: 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20  if( pTable ){.  
57b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
57c0: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
57d0: 20 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73   %T already exis
57e0: 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  ts", pName);.   
57f0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
5800: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69  e_error;.  }.  i
5810: 66 28 20 28 70 49 64 78 20 3d 20 73 71 6c 69 74  f( (pIdx = sqlit
5820: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
5830: 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 26 26  zName, 0))!=0 &&
5840: 20 0a 20 20 20 20 20 20 28 20 69 44 62 3d 3d 30   .      ( iDb==0
5850: 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75   || !db->init.bu
5860: 73 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sy) ){.    sqlit
5870: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5880: 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
5890: 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61  eady an index na
58a0: 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
58b0: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
58c0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
58d0: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
58e0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
58f0: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
5900: 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20   pTable==0 ){.  
5910: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
5920: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
5930: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
5940: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
5950: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
5960: 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  .  pTable->zName
5970: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62   = zName;.  pTab
5980: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->nCol = 0;.  
5990: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30  pTable->aCol = 0
59a0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65  ;.  pTable->iPKe
59b0: 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65  y = -1;.  pTable
59c0: 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  ->pIndex = 0;.  
59d0: 70 54 61 62 6c 65 2d 3e 69 44 62 20 3d 20 69 44  pTable->iDb = iD
59e0: 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  b;.  if( pParse-
59f0: 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c  >pNewTable ) sql
5a00: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
5a10: 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  db, pParse->pNew
5a20: 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65  Table);.  pParse
5a30: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54  ->pNewTable = pT
5a40: 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  able;..  /* If t
5a50: 68 69 73 20 69 73 20 74 68 65 20 6d 61 67 69 63  his is the magic
5a60: 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
5a70: 20 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 61   table used by a
5a80: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20  utoincrement,.  
5a90: 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61  ** then record a
5aa0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
5ab0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61   table in the ma
5ac0: 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75  in database stru
5ad0: 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68  cture.  ** so th
5ae0: 61 74 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69  at INSERT can fi
5af0: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 65 61 73  nd the table eas
5b00: 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ily..  */.#ifnde
5b10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
5b20: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66  TOINCREMENT.  if
5b30: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
5b40: 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  "sqlite_sequence
5b50: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  ")==0 ){.    db-
5b60: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 65 71 54 61  >aDb[iDb].pSeqTa
5b70: 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a  b = pTable;.  }.
5b80: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67  #endif..  /* Beg
5b90: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
5ba0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
5bb0: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
5bc0: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
5bd0: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
5be0: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
5bf0: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
5c00: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
5c10: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
5c20: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
5c30: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
5c40: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
5c50: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
5c60: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
5c70: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
5c80: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
5c90: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
5ca0: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
5cb0: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
5cc0: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
5cd0: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
5ce0: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
5cf0: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
5d00: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
5d10: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
5d20: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
5d30: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
5d40: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
5d50: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28  ->init.busy && (
5d60: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
5d70: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
5d80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
5d90: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
5da0: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
5db0: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 65 72 79 20  ;..    /* Every 
5dc0: 74 69 6d 65 20 61 20 6e 65 77 20 74 61 62 6c 65  time a new table
5dd0: 20 69 73 20 63 72 65 61 74 65 64 20 74 68 65 20   is created the 
5de0: 66 69 6c 65 2d 66 6f 72 6d 61 74 0a 20 20 20 20  file-format.    
5df0: 2a 2a 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20  ** and encoding 
5e00: 6d 65 74 61 2d 76 61 6c 75 65 73 20 61 72 65 20  meta-values are 
5e10: 73 65 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  set in the datab
5e20: 61 73 65 2c 20 69 6e 0a 20 20 20 20 2a 2a 20 63  ase, in.    ** c
5e30: 61 73 65 20 74 68 69 73 20 69 73 20 74 68 65 20  ase this is the 
5e40: 66 69 72 73 74 20 74 61 62 6c 65 20 63 72 65 61  first table crea
5e50: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
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 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
5e80: 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c  db->file_format,
5e90: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
5ea0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5eb0: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
5ec0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
5ed0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
5ee0: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 65 6e 63 2c  nteger, db->enc,
5ef0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
5f00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5f10: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
5f20: 34 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  4);..    /* This
5f30: 20 6a 75 73 74 20 63 72 65 61 74 65 73 20 61 20   just creates a 
5f40: 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63  place-holder rec
5f50: 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74  ord in the sqlit
5f60: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a  e_master table..
5f70: 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72      ** The recor
5f80: 64 20 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e  d created does n
5f90: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68  ot contain anyth
5fa0: 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c  ing yet.  It wil
5fb0: 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20  l be replaced.  
5fc0: 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c    ** by the real
5fd0: 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67   entry in code g
5fe0: 65 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c 69  enerated at sqli
5ff0: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20  te3EndTable().. 
6000: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
6010: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e   rowid for the n
6020: 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74  ew entry is left
6030: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74   on the top of t
6040: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a  he stack..    **
6050: 20 54 68 65 20 72 6f 77 69 64 20 76 61 6c 75 65   The rowid value
6060: 20 69 73 20 6e 65 65 64 65 64 20 62 79 20 74 68   is needed by th
6070: 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69  e code that sqli
6080: 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c  te3EndTable will
6090: 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65  .    ** generate
60a0: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
60b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
60c0: 57 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  W.    if( isView
60d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
60e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
60f0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
6100: 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
6110: 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71  f.    {.      sq
6120: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6130: 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  , OP_CreateTable
6140: 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 7d  , iDb, 0);.    }
6150: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
6160: 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69  MasterTable(v, i
6170: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
6180: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6190: 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b  NewRecno, 0, 0);
61a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
61b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
61c0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
61d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
61e0: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
61f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6200: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
6210: 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a  tIntKey, 0, 0);.
6220: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6230: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
6240: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
6250: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6260: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
6270: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61  .  }..  /* Norma
6280: 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65  l (non-error) re
6290: 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72  turn. */.  retur
62a0: 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  n;..  /* If an e
62b0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20  rror occurs, we 
62c0: 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67  jump here */.beg
62d0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a  in_table_error:.
62e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
62f0: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  me);.  return;.}
6300: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63  ../*.** This mac
6310: 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  ro is used to co
6320: 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69 6e 67  mpare two string
6330: 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e 73 65  s in a case-inse
6340: 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e 0a  nsitive manner..
6350: 2a 2a 20 49 74 20 69 73 20 73 6c 69 67 68 74 6c  ** It is slightl
6360: 79 20 66 61 73 74 65 72 20 74 68 61 6e 20 63 61  y faster than ca
6370: 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 53 74 72  lling sqlite3Str
6380: 49 43 6d 70 28 29 20 64 69 72 65 63 74 6c 79 2c  ICmp() directly,
6390: 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65 73   but.** produces
63a0: 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a 2a   larger code..**
63b0: 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 69  .** WARNING: Thi
63c0: 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 63  s macro is not c
63d0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
63e0: 68 65 20 73 74 72 63 6d 70 28 29 20 66 61 6d 69  he strcmp() fami
63f0: 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e  ly. It.** return
6400: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74 77  s true if the tw
6410: 6f 20 73 74 72 69 6e 67 73 20 61 72 65 20 65 71  o strings are eq
6420: 75 61 6c 2c 20 6f 74 68 65 72 77 69 73 65 20 66  ual, otherwise f
6430: 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  alse..*/.#define
6440: 20 53 54 52 49 43 4d 50 28 78 2c 20 79 29 20 28   STRICMP(x, y) (
6450: 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  \.sqlite3UpperTo
6460: 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64  Lower[*(unsigned
6470: 20 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20 20   char *)(x)]==  
6480: 20 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54   \.sqlite3UpperT
6490: 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65  oLower[*(unsigne
64a0: 64 20 63 68 61 72 20 2a 29 28 79 29 5d 20 20 20  d char *)(y)]   
64b0: 20 20 5c 0a 26 26 20 73 71 6c 69 74 65 33 53 74    \.&& sqlite3St
64c0: 72 49 43 6d 70 28 28 78 29 2b 31 2c 28 79 29 2b  rICmp((x)+1,(y)+
64d0: 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41  1)==0 )../*.** A
64e0: 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20  dd a new column 
64f0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
6500: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
6510: 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  structed..**.** 
6520: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
6530: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
6540: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
6550: 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  mn declaration.*
6560: 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  * in a CREATE TA
6570: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
6580: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
6590: 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a  e() gets called.
65a0: 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20  ** first to get 
65b0: 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54  things going.  T
65c0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
65d0: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65   is called for e
65e0: 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a  ach.** column..*
65f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
6600: 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70  dColumn(Parse *p
6610: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
6620: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
6630: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
6640: 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  r *z;.  Column *
6650: 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d  pCol;.  if( (p =
6660: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6670: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
6680: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61  .  z = sqlite3Na
6690: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
66a0: 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  e);.  if( z==0 )
66b0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
66c0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
66d0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 54 52  ++){.    if( STR
66e0: 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b  ICMP(z, p->aCol[
66f0: 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  i].zName) ){.   
6700: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6710: 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c  sg(pParse, "dupl
6720: 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  icate column nam
6730: 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  e: %s", z);.    
6740: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
6750: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
6760: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28     }.  }.  if( (
6770: 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d  p->nCol & 0x7)==
6780: 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  0 ){.    Column 
6790: 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20  *aNew;.    aNew 
67a0: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
67b0: 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43   p->aCol, (p->nC
67c0: 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e  ol+8)*sizeof(p->
67d0: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69  aCol[0]));.    i
67e0: 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( aNew==0 ) ret
67f0: 75 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c  urn;.    p->aCol
6800: 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = aNew;.  }.  p
6810: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70  Col = &p->aCol[p
6820: 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65  ->nCol];.  memse
6830: 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pCol, 0, sizeo
6840: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
6850: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
6860: 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65  z;. .  /* If the
6870: 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70  re is no type sp
6880: 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73  ecified, columns
6890: 20 68 61 76 65 20 74 68 65 20 64 65 66 61 75 6c   have the defaul
68a0: 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20  t affinity.  ** 
68b0: 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65  'NONE'. If there
68c0: 20 69 73 20 61 20 74 79 70 65 20 73 70 65 63 69   is a type speci
68d0: 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74  fied, then sqlit
68e0: 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  e3AddColumnType(
68f0: 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63  ) will.  ** be c
6900: 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65  alled next to se
6910: 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  t pCol->affinity
6920: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f   correctly..  */
6930: 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  .  pCol->affinit
6940: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  y = SQLITE_AFF_N
6950: 4f 4e 45 3b 0a 20 20 70 43 6f 6c 2d 3e 70 43 6f  ONE;.  pCol->pCo
6960: 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
6970: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 70 2d  >pDfltColl;.  p-
6980: 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nCol++;.}../*.*
6990: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
69a0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
69b0: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
69c0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
69d0: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
69e0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
69f0: 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22  t.  A "NOT NULL"
6a00: 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a   constraint has.
6a10: 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20  ** been seen on 
6a20: 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20  a column.  This 
6a30: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
6a40: 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e   notNull flag on
6a50: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  .** the column c
6a60: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
6a70: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
6a80: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e  void sqlite3AddN
6a90: 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50  otNull(Parse *pP
6aa0: 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  arse, int onErro
6ab0: 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  r){.  Table *p;.
6ac0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28    int i;.  if( (
6ad0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
6ae0: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
6af0: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
6b00: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20  l-1;.  if( i>=0 
6b10: 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74  ) p->aCol[i].not
6b20: 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  Null = onError;.
6b30: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  }../*.** Scan th
6b40: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61  e column type na
6b50: 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68  me zType (length
6b60: 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74 75   nType) and retu
6b70: 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69  rn the.** associ
6b80: 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 79  ated affinity ty
6b90: 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  pe..*/.static ch
6ba0: 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69  ar sqlite3Affini
6bb0: 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61  tyType(const cha
6bc0: 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54  r *zType, int nT
6bd0: 79 70 65 29 7b 0a 20 20 69 6e 74 20 6e 2c 20 69  ype){.  int n, i
6be0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
6bf0: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f   struct {.    co
6c00: 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 62 3b 20  nst char *zSub; 
6c10: 20 2f 2a 20 4b 65 79 77 6f 72 64 73 20 73 75 62   /* Keywords sub
6c20: 73 74 72 69 6e 67 20 74 6f 20 73 65 61 72 63 68  string to search
6c30: 20 66 6f 72 20 2a 2f 0a 20 20 20 20 63 68 61 72   for */.    char
6c40: 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 2f   nSub;         /
6c50: 2a 20 6c 65 6e 67 74 68 20 6f 66 20 7a 53 75 62  * length of zSub
6c60: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 61 66 66   */.    char aff
6c70: 69 6e 69 74 79 3b 20 20 20 20 20 2f 2a 20 41 66  inity;     /* Af
6c80: 66 69 6e 69 74 79 20 74 6f 20 72 65 74 75 72 6e  finity to return
6c90: 20 69 66 20 69 74 20 6d 61 74 63 68 65 73 20 2a   if it matches *
6ca0: 2f 0a 20 20 7d 20 73 75 62 73 74 72 69 6e 67 73  /.  } substrings
6cb0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 22 49 4e 54  [] = {.    {"INT
6cc0: 22 2c 20 20 33 2c 20 53 51 4c 49 54 45 5f 41 46  ",  3, SQLITE_AF
6cd0: 46 5f 49 4e 54 45 47 45 52 7d 2c 0a 20 20 20 20  F_INTEGER},.    
6ce0: 7b 22 43 48 41 52 22 2c 20 34 2c 20 53 51 4c 49  {"CHAR", 4, SQLI
6cf0: 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20 20  TE_AFF_TEXT},.  
6d00: 20 20 7b 22 43 4c 4f 42 22 2c 20 34 2c 20 53 51    {"CLOB", 4, SQ
6d10: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a  LITE_AFF_TEXT},.
6d20: 20 20 20 20 7b 22 54 45 58 54 22 2c 20 34 2c 20      {"TEXT", 4, 
6d30: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 7d  SQLITE_AFF_TEXT}
6d40: 2c 0a 20 20 20 20 7b 22 42 4c 4f 42 22 2c 20 34  ,.    {"BLOB", 4
6d50: 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  , SQLITE_AFF_NON
6d60: 45 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20  E},.  };..  if( 
6d70: 6e 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nType==0 ){.    
6d80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
6d90: 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 66 6f  F_NONE;.  }.  fo
6da0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
6db0: 73 75 62 73 74 72 69 6e 67 73 29 2f 73 69 7a 65  substrings)/size
6dc0: 6f 66 28 73 75 62 73 74 72 69 6e 67 73 5b 30 5d  of(substrings[0]
6dd0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  ); i++){.    con
6de0: 73 74 20 63 68 61 72 20 2a 7a 53 75 62 20 3d 20  st char *zSub = 
6df0: 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 7a 53  substrings[i].zS
6e00: 75 62 3b 0a 20 20 20 20 69 6e 74 20 63 31 20 3d  ub;.    int c1 =
6e10: 20 74 6f 6c 6f 77 65 72 28 7a 53 75 62 5b 30 5d   tolower(zSub[0]
6e20: 29 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d  );.    int len =
6e30: 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 6e   substrings[i].n
6e40: 53 75 62 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d  Sub;.    int lim
6e50: 69 74 20 3d 20 6e 54 79 70 65 20 2d 20 6c 65 6e  it = nType - len
6e60: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
6e70: 20 2a 7a 20 3d 20 7a 54 79 70 65 3b 0a 20 20 20   *z = zType;.   
6e80: 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 3d 6c 69 6d   for(n=0; n<=lim
6e90: 69 74 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20  it; n++, z++){. 
6ea0: 20 20 20 20 20 69 66 28 20 74 6f 6c 6f 77 65 72       if( tolower
6eb0: 28 7a 5b 30 5d 29 3d 3d 63 31 20 26 26 20 30 3d  (z[0])==c1 && 0=
6ec0: 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  =sqlite3StrNICmp
6ed0: 28 7a 2c 20 7a 53 75 62 2c 20 6c 65 6e 29 20 29  (z, zSub, len) )
6ee0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
6ef0: 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 61   substrings[i].a
6f00: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 7d  ffinity;.      }
6f10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6f20: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
6f30: 55 4d 45 52 49 43 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  UMERIC;.}../*.**
6f40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
6f50: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
6f60: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
6f70: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
6f80: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
6f90: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
6fa0: 2e 20 20 54 68 65 20 70 46 69 72 73 74 20 74 6f  .  The pFirst to
6fb0: 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72 73 74  ken is the first
6fc0: 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  .** token in the
6fd0: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b   sequence of tok
6fe0: 65 6e 73 20 74 68 61 74 20 64 65 73 63 72 69 62  ens that describ
6ff0: 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68  e the type of th
7000: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72  e.** column curr
7010: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
7020: 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73  truction.   pLas
7030: 74 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f  t is the last to
7040: 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65  ken.** in the se
7050: 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69  quence.  Use thi
7060: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  s information to
7070: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72   construct a str
7080: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74  ing.** that cont
7090: 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d  ains the typenam
70a0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
70b0: 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 73  and store that s
70c0: 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70  tring.** in zTyp
70d0: 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69  e..*/ .void sqli
70e0: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  te3AddColumnType
70f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7100: 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54  Token *pFirst, T
7110: 6f 6b 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20  oken *pLast){.  
7120: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
7130: 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  i, j;.  int n;. 
7140: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e 73   char *z;.  cons
7150: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
7160: 2a 7a 49 6e 3b 0a 0a 20 20 43 6f 6c 75 6d 6e 20  *zIn;..  Column 
7170: 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20  *pCol;.  if( (p 
7180: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
7190: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
71a0: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
71b0: 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72  1;.  if( i<0 ) r
71c0: 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20  eturn;.  pCol = 
71d0: 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 7a  &p->aCol[i];.  z
71e0: 49 6e 20 3d 20 70 46 69 72 73 74 2d 3e 7a 3b 0a  In = pFirst->z;.
71f0: 20 20 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b    n = pLast->n +
7200: 20 28 70 4c 61 73 74 2d 3e 7a 20 2d 20 7a 49 6e   (pLast->z - zIn
7210: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f  );.  assert( pCo
7220: 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 3b 0a 20  l->zType==0 );. 
7230: 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65   z = pCol->zType
7240: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
7250: 61 77 28 6e 2b 31 29 3b 0a 20 20 69 66 28 20 7a  aw(n+1);.  if( z
7260: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7270: 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
7280: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 20  i++){.    int c 
7290: 3d 20 7a 49 6e 5b 69 5d 3b 0a 20 20 20 20 69 66  = zIn[i];.    if
72a0: 28 20 69 73 73 70 61 63 65 28 63 29 20 29 20 63  ( isspace(c) ) c
72b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a  ontinue;.    z[j
72c0: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a  ++] = c;.  }.  z
72d0: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 70 43 6f 6c 2d  [j] = 0;.  pCol-
72e0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
72f0: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
7300: 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  z, n);.}../*.** 
7310: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
7320: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  s the default va
7330: 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  lue for the most
7340: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
7350: 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65  column.** of the
7360: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
7370: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
7380: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75  ion..**.** Defau
7390: 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73 73  lt value express
73a0: 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e  ions must be con
73b0: 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e  stant.  Raise an
73c0: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68   exception if th
73d0: 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65  is.** is not the
73e0: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   case..**.** Thi
73f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7400: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
7410: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
7420: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
7430: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
7440: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  LE statement..*/
7450: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
7460: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72  DefaultValue(Par
7470: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
7480: 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 61 62 6c   *pExpr){.  Tabl
7490: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
74a0: 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d  pCol;.  if( (p =
74b0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
74c0: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
74d0: 0a 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61  .  pCol = &(p->a
74e0: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b  Col[p->nCol-1]);
74f0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
7500: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
7510: 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  xpr) ){.    sqli
7520: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7530: 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c  se, "default val
7540: 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73  ue of column [%s
7550: 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  ] is not constan
7560: 74 22 2c 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  t",.        pCol
7570: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73  ->zName);.  }els
7580: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
7590: 70 72 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70  prDelete(pCol->p
75a0: 44 66 6c 74 29 3b 0a 20 20 20 20 70 43 6f 6c 2d  Dflt);.    pCol-
75b0: 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33  >pDflt = sqlite3
75c0: 45 78 70 72 44 75 70 28 70 45 78 70 72 29 3b 0a  ExprDup(pExpr);.
75d0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
75e0: 72 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b 0a  rDelete(pExpr);.
75f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61  }../*.** Designa
7600: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
7610: 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  EY for the table
7620: 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  .  pList is a li
7630: 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20  st of names .** 
7640: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
7650: 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79  form the primary
7660: 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20   key.  If pList 
7670: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
7680: 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74  e.** most recent
7690: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20  ly added column 
76a0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
76b0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
76c0: 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63  .**.** A table c
76d0: 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  an have at most 
76e0: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  one primary key.
76f0: 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61    If the table a
7700: 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20  lready has.** a 
7710: 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64  primary key (and
7720: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
7730: 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29  ond primary key)
7740: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a   then create an.
7750: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
7760: 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  If the PRIMARY K
7770: 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c  EY is on a singl
7780: 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64  e column whose d
7790: 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47  atatype is INTEG
77a0: 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77  ER,.** then we w
77b0: 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74  ill try to use t
77c0: 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  hat column as th
77d0: 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68  e rowid.  Set th
77e0: 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a  e Table.iPKey.**
77f0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61   field of the ta
7800: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
7810: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65  uction to be the
7820: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
7830: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
7840: 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61   KEY column.  Ta
7850: 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74  ble.iPKey is set
7860: 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20   to -1 if there 
7870: 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52  is.** no INTEGER
7880: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a   PRIMARY KEY..**
7890: 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69  .** If the key i
78a0: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
78b0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
78c0: 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  en create a uniq
78d0: 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20  ue.** index for 
78e0: 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64  the key.  No ind
78f0: 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f  ex is created fo
7900: 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  r INTEGER PRIMAR
7910: 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20  Y KEYs..*/.void 
7920: 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72  sqlite3AddPrimar
7930: 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  yKey(.  Parse *p
7940: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
7950: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
7960: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
7970: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66  t,  /* List of f
7980: 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65  ield names to be
7990: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
79a0: 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
79b0: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
79c0: 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20  th a uniqueness 
79d0: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e  conflict */.  in
79e0: 74 20 61 75 74 6f 49 6e 63 20 20 20 20 20 20 20  t autoInc       
79f0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41  /* True if the A
7a00: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79  UTOINCREMENT key
7a10: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
7a20: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
7a30: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
7a40: 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20  ewTable;.  char 
7a50: 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e  *zType = 0;.  in
7a60: 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a  t iCol = -1, i;.
7a70: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
7a80: 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79  goto primary_key
7a90: 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61  _exit;.  if( pTa
7aa0: 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b  b->hasPrimKey ){
7ab0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
7ac0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
7ad0: 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c      "table \"%s\
7ae0: 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  " has more than 
7af0: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22  one primary key"
7b00: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
7b10: 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79      goto primary
7b20: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  _key_exit;.  }. 
7b30: 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65   pTab->hasPrimKe
7b40: 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69  y = 1;.  if( pLi
7b50: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f  st==0 ){.    iCo
7b60: 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d  l = pTab->nCol -
7b70: 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43   1;.    pTab->aC
7b80: 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b  ol[iCol].isPrimK
7b90: 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ey = 1;.  }else{
7ba0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7bb0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
7bc0: 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43  +){.      for(iC
7bd0: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
7be0: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
7bf0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
7c00: 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
7c10: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
7c20: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
7c30: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
7c40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7c50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7c60: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54       if( iCol<pT
7c70: 61 62 2d 3e 6e 43 6f 6c 20 29 20 70 54 61 62 2d  ab->nCol ) pTab-
7c80: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72  >aCol[iCol].isPr
7c90: 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d  imKey = 1;.    }
7ca0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
7cb0: 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d  nExpr>1 ) iCol =
7cc0: 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   -1;.  }.  if( i
7cd0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
7ce0: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
7cf0: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
7d00: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
7d10: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65  .  }.  if( zType
7d20: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
7d30: 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47  mp(zType, "INTEG
7d40: 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ER")==0 ){.    p
7d50: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f  Tab->iPKey = iCo
7d60: 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79  l;.    pTab->key
7d70: 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  Conf = onError;.
7d80: 20 20 20 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e      pTab->autoIn
7d90: 63 20 3d 20 61 75 74 6f 49 6e 63 3b 0a 20 20 7d  c = autoInc;.  }
7da0: 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63  else if( autoInc
7db0: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
7dc0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
7dd0: 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65  EMENT.    sqlite
7de0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7df0: 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  , "AUTOINCREMENT
7e00: 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64   is only allowed
7e10: 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20   on an ".       
7e20: 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59  "INTEGER PRIMARY
7e30: 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20   KEY");.#endif. 
7e40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
7e50: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
7e60: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Parse, 0, 0, 0, 
7e70: 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20  pList, onError, 
7e80: 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74  0, 0);.    pList
7e90: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61   = 0;.  }..prima
7ea0: 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73  ry_key_exit:.  s
7eb0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
7ec0: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72  lete(pList);.  r
7ed0: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
7ee0: 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  Set the collatio
7ef0: 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68  n function of th
7f00: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
7f10: 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c  parsed table col
7f20: 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f  umn.** to the Co
7f30: 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a  llSeq given..*/.
7f40: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
7f50: 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65  ollateType(Parse
7f60: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
7f70: 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74  char *zType, int
7f80: 20 6e 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65   nType){.  Table
7f90: 20 2a 70 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49   *p;.  Index *pI
7fa0: 64 78 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  dx;.  CollSeq *p
7fb0: 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Coll;.  int i;..
7fc0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
7fd0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
7fe0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
7ff0: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20 70   p->nCol-1;..  p
8000: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Coll = sqlite3Lo
8010: 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
8020: 73 65 2c 20 7a 54 79 70 65 2c 20 6e 54 79 70 65  se, zType, nType
8030: 29 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  );.  p->aCol[i].
8040: 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 0a  pColl = pColl;..
8050: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
8060: 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61  mn is declared a
8070: 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52  s "<name> PRIMAR
8080: 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74  Y KEY COLLATE <t
8090: 79 70 65 3e 22 2c 0a 20 20 2a 2a 20 74 68 65 6e  ype>",.  ** then
80a0: 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61   an index may ha
80b0: 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  ve been created 
80c0: 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62  on this column b
80d0: 65 66 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20 63  efore the.  ** c
80e0: 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61  ollation type wa
80f0: 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74  s added. Correct
8100: 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74   this if it is t
8110: 68 65 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  he case..  */.  
8120: 66 6f 72 28 70 49 64 78 20 3d 20 70 2d 3e 70 49  for(pIdx = p->pI
8130: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
8140: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
8150: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
8160: 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20  >nColumn==1 );. 
8170: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
8180: 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 20 70 49  olumn[0]==i ) pI
8190: 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  dx->keyInfo.aCol
81a0: 6c 5b 30 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  l[0] = pColl;.  
81b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  }.}../*.** Locat
81c0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  e and return an 
81d0: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 64  entry from the d
81e0: 62 2e 61 43 6f 6c 6c 53 65 71 20 68 61 73 68 20  b.aCollSeq hash 
81f0: 74 61 62 6c 65 2e 20 49 66 20 74 68 65 20 65 6e  table. If the en
8200: 74 72 79 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  try.** specified
8210: 20 62 79 20 7a 4e 61 6d 65 20 61 6e 64 20 6e 4e   by zName and nN
8220: 61 6d 65 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  ame is not found
8230: 20 61 6e 64 20 70 61 72 61 6d 65 74 65 72 20 27   and parameter '
8240: 63 72 65 61 74 65 27 20 69 73 0a 2a 2a 20 74 72  create' is.** tr
8250: 75 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ue, then create 
8260: 61 20 6e 65 77 20 65 6e 74 72 79 2e 20 4f 74 68  a new entry. Oth
8270: 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 4e 55  erwise return NU
8280: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 70  LL..**.** Each p
8290: 6f 69 6e 74 65 72 20 73 74 6f 72 65 64 20 69 6e  ointer stored in
82a0: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 43 6f   the sqlite3.aCo
82b0: 6c 6c 53 65 71 20 68 61 73 68 20 74 61 62 6c 65  llSeq hash table
82c0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 0a 2a 2a 20   contains an.** 
82d0: 61 72 72 61 79 20 6f 66 20 74 68 72 65 65 20 43  array of three C
82e0: 6f 6c 6c 53 65 71 20 73 74 72 75 63 74 75 72 65  ollSeq structure
82f0: 73 2e 20 54 68 65 20 66 69 72 73 74 20 69 73 20  s. The first is 
8300: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
8310: 71 75 65 6e 63 65 0a 2a 2a 20 70 72 65 66 66 65  quence.** preffe
8320: 72 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20  rred for UTF-8, 
8330: 74 68 65 20 73 65 63 6f 6e 64 20 55 54 46 2d 31  the second UTF-1
8340: 36 6c 65 2c 20 61 6e 64 20 74 68 65 20 74 68 69  6le, and the thi
8350: 72 64 20 55 54 46 2d 31 36 62 65 2e 0a 2a 2a 0a  rd UTF-16be..**.
8360: 2a 2a 20 53 74 6f 72 65 64 20 69 6d 6d 65 64 69  ** Stored immedi
8370: 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65 20  ately after the 
8380: 74 68 72 65 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  three collation 
8390: 73 65 71 75 65 6e 63 65 73 20 69 73 20 61 20 63  sequences is a c
83a0: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f  opy of.** the co
83b0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
83c0: 20 6e 61 6d 65 2e 20 41 20 70 6f 69 6e 74 65 72   name. A pointer
83d0: 20 74 6f 20 74 68 69 73 20 73 74 72 69 6e 67 20   to this string 
83e0: 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  is stored in.** 
83f0: 65 61 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  each collation s
8400: 65 71 75 65 6e 63 65 20 73 74 72 75 63 74 75 72  equence structur
8410: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c  e..*/.static Col
8420: 6c 53 65 71 20 2a 20 66 69 6e 64 43 6f 6c 6c 53  lSeq * findCollS
8430: 65 71 45 6e 74 72 79 28 0a 20 20 73 71 6c 69 74  eqEntry(.  sqlit
8440: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
8450: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  char *zName,.  i
8460: 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  nt nName,.  int 
8470: 63 72 65 61 74 65 0a 29 7b 0a 20 20 43 6f 6c 6c  create.){.  Coll
8480: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 66  Seq *pColl;.  if
8490: 28 20 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61 6d  ( nName<0 ) nNam
84a0: 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
84b0: 29 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  );.  pColl = sql
84c0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
84d0: 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d  ->aCollSeq, zNam
84e0: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 0a 20 20 69 66  e, nName);..  if
84f0: 28 20 30 3d 3d 70 43 6f 6c 6c 20 26 26 20 63 72  ( 0==pColl && cr
8500: 65 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c  eate ){.    pCol
8510: 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
8520: 28 20 33 2a 73 69 7a 65 6f 66 28 2a 70 43 6f 6c  ( 3*sizeof(*pCol
8530: 6c 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 20 29  l) + nName + 1 )
8540: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
8550: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 30  ){.      pColl[0
8560: 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ].zName = (char*
8570: 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20  )&pColl[3];.    
8580: 20 20 70 43 6f 6c 6c 5b 30 5d 2e 65 6e 63 20 3d    pColl[0].enc =
8590: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
85a0: 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e 7a 4e 61      pColl[1].zNa
85b0: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f  me = (char*)&pCo
85c0: 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f  ll[3];.      pCo
85d0: 6c 6c 5b 31 5d 2e 65 6e 63 20 3d 20 53 51 4c 49  ll[1].enc = SQLI
85e0: 54 45 5f 55 54 46 31 36 4c 45 3b 0a 20 20 20 20  TE_UTF16LE;.    
85f0: 20 20 70 43 6f 6c 6c 5b 32 5d 2e 7a 4e 61 6d 65    pColl[2].zName
8600: 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c   = (char*)&pColl
8610: 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  [3];.      pColl
8620: 5b 32 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54 45  [2].enc = SQLITE
8630: 5f 55 54 46 31 36 42 45 3b 0a 20 20 20 20 20 20  _UTF16BE;.      
8640: 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 5b 30 5d 2e  memcpy(pColl[0].
8650: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  zName, zName, nN
8660: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  ame);.      pCol
8670: 6c 5b 30 5d 2e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65  l[0].zName[nName
8680: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  ] = 0;.      sql
8690: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
86a0: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 70 43  db->aCollSeq, pC
86b0: 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 6e 4e  oll[0].zName, nN
86c0: 61 6d 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20  ame, pColl);.   
86d0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
86e0: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
86f0: 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20  Parameter zName 
8700: 70 6f 69 6e 74 73 20 74 6f 20 61 20 55 54 46 2d  points to a UTF-
8710: 38 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67  8 encoded string
8720: 20 6e 4e 61 6d 65 20 62 79 74 65 73 20 6c 6f 6e   nName bytes lon
8730: 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  g..** Return the
8740: 20 43 6f 6c 6c 53 65 71 2a 20 70 6f 69 6e 74 65   CollSeq* pointe
8750: 72 20 66 6f 72 20 74 68 65 20 63 6f 6c 6c 61 74  r for the collat
8760: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
8770: 65 64 20 7a 4e 61 6d 65 0a 2a 2a 20 66 6f 72 20  ed zName.** for 
8780: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 27 65 6e  the encoding 'en
8790: 63 27 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  c' from the data
87a0: 62 61 73 65 20 27 64 62 27 2e 0a 2a 2a 0a 2a 2a  base 'db'..**.**
87b0: 20 49 66 20 74 68 65 20 65 6e 74 72 79 20 73 70   If the entry sp
87c0: 65 63 69 66 69 65 64 20 69 73 20 6e 6f 74 20 66  ecified is not f
87d0: 6f 75 6e 64 20 61 6e 64 20 27 63 72 65 61 74 65  ound and 'create
87e0: 27 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  ' is true, then 
87f0: 63 72 65 61 74 65 20 61 0a 2a 2a 20 6e 65 77 20  create a.** new 
8800: 65 6e 74 72 79 2e 20 20 4f 74 68 65 72 77 69 73  entry.  Otherwis
8810: 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  e return NULL..*
8820: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
8830: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 0a 20  e3FindCollSeq(. 
8840: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
8850: 75 38 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74 20  u8 enc,.  const 
8860: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  char *zName,.  i
8870: 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  nt nName,.  int 
8880: 63 72 65 61 74 65 0a 29 7b 0a 20 20 43 6f 6c 6c  create.){.  Coll
8890: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 66 69 6e  Seq *pColl = fin
88a0: 64 43 6f 6c 6c 53 65 71 45 6e 74 72 79 28 64 62  dCollSeqEntry(db
88b0: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  , zName, nName, 
88c0: 63 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72  create);.  asser
88d0: 74 28 20 53 51 4c 49 54 45 5f 55 54 46 38 3d 3d  t( SQLITE_UTF8==
88e0: 31 20 26 26 20 53 51 4c 49 54 45 5f 55 54 46 31  1 && SQLITE_UTF1
88f0: 36 4c 45 3d 3d 32 20 26 26 20 53 51 4c 49 54 45  6LE==2 && SQLITE
8900: 5f 55 54 46 31 36 42 45 3d 3d 33 20 29 3b 0a 20  _UTF16BE==3 );. 
8910: 20 61 73 73 65 72 74 28 20 65 6e 63 3e 3d 53 51   assert( enc>=SQ
8920: 4c 49 54 45 5f 55 54 46 38 20 26 26 20 65 6e 63  LITE_UTF8 && enc
8930: 3c 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  <=SQLITE_UTF16BE
8940: 20 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20   );.  if( pColl 
8950: 29 20 70 43 6f 6c 6c 20 2b 3d 20 65 6e 63 2d 31  ) pColl += enc-1
8960: 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c  ;.  return pColl
8970: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
8980: 65 20 74 68 65 20 27 63 6f 6c 6c 61 74 69 6f 6e  e the 'collation
8990: 20 6e 65 65 64 65 64 27 20 63 61 6c 6c 62 61 63   needed' callbac
89a0: 6b 20 74 6f 20 72 65 71 75 65 73 74 20 61 20 63  k to request a c
89b0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
89c0: 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61  e.** in the data
89d0: 62 61 73 65 20 74 65 78 74 20 65 6e 63 6f 64 69  base text encodi
89e0: 6e 67 20 6f 66 20 6e 61 6d 65 20 7a 4e 61 6d 65  ng of name zName
89f0: 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a  , length nName..
8a00: 2a 2a 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74  ** If the collat
8a10: 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2f 0a  ion sequence.*/.
8a20: 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 6c 6c  static void call
8a30: 43 6f 6c 6c 4e 65 65 64 65 64 28 73 71 6c 69 74  CollNeeded(sqlit
8a40: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
8a50: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e  ar *zName, int n
8a60: 4e 61 6d 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Name){.  assert(
8a70: 20 21 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65   !db->xCollNeede
8a80: 64 20 7c 7c 20 21 64 62 2d 3e 78 43 6f 6c 6c 4e  d || !db->xCollN
8a90: 65 65 64 65 64 31 36 20 29 3b 0a 20 20 69 66 28  eeded16 );.  if(
8aa0: 20 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61 6d 65   nName<0 ) nName
8ab0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   = strlen(zName)
8ac0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 78 43 6f 6c  ;.  if( db->xCol
8ad0: 6c 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 63  lNeeded ){.    c
8ae0: 68 61 72 20 2a 7a 45 78 74 65 72 6e 61 6c 20 3d  har *zExternal =
8af0: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 7a   sqliteStrNDup(z
8b00: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
8b10: 20 20 69 66 28 20 21 7a 45 78 74 65 72 6e 61 6c    if( !zExternal
8b20: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 64   ) return;.    d
8b30: 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 28 64  b->xCollNeeded(d
8b40: 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
8b50: 67 2c 20 64 62 2c 20 28 69 6e 74 29 64 62 2d 3e  g, db, (int)db->
8b60: 65 6e 63 2c 20 7a 45 78 74 65 72 6e 61 6c 29 3b  enc, zExternal);
8b70: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
8b80: 7a 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20 7d 0a  zExternal);.  }.
8b90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8ba0: 4d 49 54 5f 55 54 46 31 36 0a 20 20 69 66 28 20  MIT_UTF16.  if( 
8bb0: 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
8bc0: 36 20 29 7b 0a 20 20 20 20 63 68 61 72 20 63 6f  6 ){.    char co
8bd0: 6e 73 74 20 2a 7a 45 78 74 65 72 6e 61 6c 3b 0a  nst *zExternal;.
8be0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
8bf0: 65 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65  e *pTmp = sqlite
8c00: 33 47 65 74 54 72 61 6e 73 69 65 6e 74 56 61 6c  3GetTransientVal
8c10: 75 65 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ue(db);.    sqli
8c20: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
8c30: 54 6d 70 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20  Tmp, -1, zName, 
8c40: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
8c50: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
8c60: 20 7a 45 78 74 65 72 6e 61 6c 20 3d 20 73 71 6c   zExternal = sql
8c70: 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 54  ite3ValueText(pT
8c80: 6d 70 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  mp, SQLITE_UTF16
8c90: 4e 41 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28  NATIVE);.    if(
8ca0: 20 21 7a 45 78 74 65 72 6e 61 6c 20 29 20 72 65   !zExternal ) re
8cb0: 74 75 72 6e 3b 0a 20 20 20 20 64 62 2d 3e 78 43  turn;.    db->xC
8cc0: 6f 6c 6c 4e 65 65 64 65 64 31 36 28 64 62 2d 3e  ollNeeded16(db->
8cd0: 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20  pCollNeededArg, 
8ce0: 64 62 2c 20 28 69 6e 74 29 64 62 2d 3e 65 6e 63  db, (int)db->enc
8cf0: 2c 20 7a 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20  , zExternal);.  
8d00: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
8d10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8d20: 73 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20  s called if the 
8d30: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
8d40: 79 20 66 61 69 6c 73 20 74 6f 20 64 65 6c 69 76  y fails to deliv
8d50: 65 72 20 61 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6f  er a.** collatio
8d60: 6e 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68  n function in th
8d70: 65 20 62 65 73 74 20 65 6e 63 6f 64 69 6e 67 20  e best encoding 
8d80: 62 75 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  but there may be
8d90: 20 6f 74 68 65 72 20 76 65 72 73 69 6f 6e 73 0a   other versions.
8da0: 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6c 6c 61  ** of this colla
8db0: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 28 66  tion function (f
8dc0: 6f 72 20 6f 74 68 65 72 20 74 65 78 74 20 65 6e  or other text en
8dd0: 63 6f 64 69 6e 67 73 29 20 61 76 61 69 6c 61 62  codings) availab
8de0: 6c 65 2e 20 55 73 65 20 6f 6e 65 0a 2a 2a 20 6f  le. Use one.** o
8df0: 66 20 74 68 65 73 65 20 69 6e 73 74 65 61 64 20  f these instead 
8e00: 69 66 20 74 68 65 79 20 65 78 69 73 74 2e 20 41  if they exist. A
8e10: 76 6f 69 64 20 61 20 55 54 46 2d 38 20 3c 2d 3e  void a UTF-8 <->
8e20: 20 55 54 46 2d 31 36 20 63 6f 6e 76 65 72 73 69   UTF-16 conversi
8e30: 6f 6e 20 69 66 0a 2a 2a 20 70 6f 73 73 69 62 6c  on if.** possibl
8e40: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
8e50: 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 50 61   synthCollSeq(Pa
8e60: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c  rse *pParse, Col
8e70: 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20  lSeq *pColl){.  
8e80: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 32 3b  CollSeq *pColl2;
8e90: 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 70 43 6f  .  char *z = pCo
8ea0: 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74  ll->zName;.  int
8eb0: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a   n = strlen(z);.
8ec0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8ed0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
8ee0: 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  t i;.  static co
8ef0: 6e 73 74 20 75 38 20 61 45 6e 63 5b 5d 20 3d 20  nst u8 aEnc[] = 
8f00: 7b 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  { SQLITE_UTF16BE
8f10: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
8f20: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7d 3b  , SQLITE_UTF8 };
8f30: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 3b  .  for(i=0; i<3;
8f40: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43 6f 6c 6c   i++){.    pColl
8f50: 32 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  2 = sqlite3FindC
8f60: 6f 6c 6c 53 65 71 28 64 62 2c 20 61 45 6e 63 5b  ollSeq(db, aEnc[
8f70: 69 5d 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20  i], z, n, 0);.  
8f80: 20 20 69 66 28 20 70 43 6f 6c 6c 32 2d 3e 78 43    if( pColl2->xC
8f90: 6d 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  mp!=0 ){.      m
8fa0: 65 6d 63 70 79 28 70 43 6f 6c 6c 2c 20 70 43 6f  emcpy(pColl, pCo
8fb0: 6c 6c 32 2c 20 73 69 7a 65 6f 66 28 43 6f 6c 6c  ll2, sizeof(Coll
8fc0: 53 65 71 29 29 3b 0a 20 20 20 20 20 20 72 65 74  Seq));.      ret
8fd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
8fe0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
8ff0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
9000: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
9010: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
9020: 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e  o such collation
9030: 20 73 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22   sequence: %.*s"
9040: 2c 20 6e 2c 20 7a 29 3b 0a 20 20 7d 0a 20 20 70  , n, z);.  }.  p
9050: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
9060: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
9070: 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  RROR;.}../*.** T
9080: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
9090: 61 6c 6c 65 64 20 6f 6e 20 61 20 63 6f 6c 6c 61  alled on a colla
90a0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 62 65  tion sequence be
90b0: 66 6f 72 65 20 69 74 20 69 73 20 75 73 65 64 20  fore it is used 
90c0: 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68 61 74  to.** check that
90d0: 20 69 74 20 69 73 20 64 65 66 69 6e 65 64 2e 20   it is defined. 
90e0: 41 6e 20 75 6e 64 65 66 69 6e 65 64 20 63 6f 6c  An undefined col
90f0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
9100: 65 78 69 73 74 73 20 77 68 65 6e 0a 2a 2a 20 61  exists when.** a
9110: 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 61   database is loa
9120: 64 65 64 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ded that contain
9130: 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  s references to 
9140: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
9150: 63 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65  ces.** that have
9160: 20 6e 6f 74 20 62 65 65 6e 20 64 65 66 69 6e 65   not been define
9170: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 72 65  d by sqlite3_cre
9180: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29 20  ate_collation() 
9190: 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65  etc..**.** If re
91a0: 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75  quired, this rou
91b0: 74 69 6e 65 20 63 61 6c 6c 73 20 74 68 65 20 27  tine calls the '
91c0: 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64  collation needed
91d0: 27 20 63 61 6c 6c 62 61 63 6b 20 74 6f 0a 2a 2a  ' callback to.**
91e0: 20 72 65 71 75 65 73 74 20 61 20 64 65 66 69 6e   request a defin
91f0: 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c  ition of the col
9200: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
9210: 20 49 66 20 74 68 69 73 20 64 6f 65 73 6e 27 74   If this doesn't
9220: 20 77 6f 72 6b 2c 20 0a 2a 2a 20 61 6e 20 65 71   work, .** an eq
9230: 75 69 76 61 6c 65 6e 74 20 63 6f 6c 6c 61 74 69  uivalent collati
9240: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 68 61 74  ng sequence that
9250: 20 75 73 65 73 20 61 20 74 65 78 74 20 65 6e 63   uses a text enc
9260: 6f 64 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a  oding different.
9270: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ** from the main
9280: 20 64 61 74 61 62 61 73 65 20 69 73 20 73 75 62   database is sub
9290: 73 74 69 74 75 74 65 64 2c 20 69 66 20 6f 6e 65  stituted, if one
92a0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
92b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
92c0: 63 6b 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  ckCollSeq(Parse 
92d0: 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c 53 65 71  *pParse, CollSeq
92e0: 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 66 28 20   *pColl){.  if( 
92f0: 70 43 6f 6c 6c 20 26 26 20 21 70 43 6f 6c 6c 2d  pColl && !pColl-
9300: 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 2f 2a 20  >xCmp ){.    /* 
9310: 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  No collation seq
9320: 75 65 6e 63 65 20 6f 66 20 74 68 69 73 20 74 79  uence of this ty
9330: 70 65 20 66 6f 72 20 74 68 69 73 20 65 6e 63 6f  pe for this enco
9340: 64 69 6e 67 20 69 73 20 72 65 67 69 73 74 65 72  ding is register
9350: 65 64 2e 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 20  ed..    ** Call 
9360: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
9370: 63 74 6f 72 79 20 74 6f 20 73 65 65 20 69 66 20  ctory to see if 
9380: 69 74 20 63 61 6e 20 73 75 70 70 6c 79 20 75 73  it can supply us
9390: 20 77 69 74 68 20 6f 6e 65 2e 0a 20 20 20 20 2a   with one..    *
93a0: 2f 0a 20 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e 65  /.    callCollNe
93b0: 65 64 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  eded(pParse->db,
93c0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 73   pColl->zName, s
93d0: 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  trlen(pColl->zNa
93e0: 6d 65 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70  me));.    if( !p
93f0: 43 6f 6c 6c 2d 3e 78 43 6d 70 20 26 26 20 73 79  Coll->xCmp && sy
9400: 6e 74 68 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  nthCollSeq(pPars
9410: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, pColl) ){.   
9420: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9430: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
9440: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
9450: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
9460: 61 6c 6c 20 73 71 6c 69 74 65 33 43 68 65 63 6b  all sqlite3Check
9470: 43 6f 6c 6c 53 65 71 28 29 20 66 6f 72 20 61 6c  CollSeq() for al
9480: 6c 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  l collating sequ
9490: 65 6e 63 65 73 20 69 6e 20 61 6e 20 69 6e 64 65  ences in an inde
94a0: 78 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  x,.** in order t
94b0: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 61 6c  o verify that al
94c0: 6c 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  l the necessary 
94d0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
94e0: 63 65 73 20 61 72 65 0a 2a 2a 20 6c 6f 61 64 65  ces are.** loade
94f0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
9500: 33 43 68 65 63 6b 49 6e 64 65 78 43 6f 6c 6c 53  3CheckIndexCollS
9510: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
9520: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
9530: 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
9540: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
9550: 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43  (i=0; i<pIdx->nC
9560: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
9570: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68     if( sqlite3Ch
9580: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
9590: 65 2c 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f  e, pIdx->keyInfo
95a0: 2e 61 43 6f 6c 6c 5b 69 5d 29 20 29 7b 0a 20 20  .aColl[i]) ){.  
95b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
95c0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
95d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
95e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
95f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
9600: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
9610: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
9620: 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62  quence for datab
9630: 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a  ase native text.
9640: 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e  ** encoding iden
9650: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 74  tified by the st
9660: 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67  ring zName, leng
9670: 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  th nName..**.** 
9680: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
9690: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
96a0: 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  nce is not avail
96b0: 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61  able, or not ava
96c0: 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65  ilable.** in the
96d0: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
96e0: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63   encoding, the c
96f0: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
9700: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a   is invoked to.*
9710: 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49 66  * request it. If
9720: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
9730: 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20  actory does not 
9740: 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73 65  supply such a se
9750: 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74  quence,.** and t
9760: 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20 61  he sequence is a
9770: 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74  vailable in anot
9780: 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  her text encodin
9790: 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a  g, then that is.
97a0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  ** returned inst
97b0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ead..**.** If no
97c0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
97d0: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
97e0: 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61  tions sequence a
97f0: 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  re available, or
9800: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f  .** another erro
9810: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
9820: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
9830: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
9840: 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
9850: 70 50 61 72 73 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53  pParse..*/.CollS
9860: 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  eq *sqlite3Locat
9870: 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  eCollSeq(Parse *
9880: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
9890: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e  ar *zName, int n
98a0: 4e 61 6d 65 29 7b 0a 20 20 75 38 20 65 6e 63 20  Name){.  u8 enc 
98b0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e  = pParse->db->en
98c0: 63 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79  c;.  u8 initbusy
98d0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69   = pParse->db->i
98e0: 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c  nit.busy;.  Coll
98f0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
9900: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
9910: 70 50 61 72 73 65 2d 3e 64 62 2c 20 65 6e 63 2c  pParse->db, enc,
9920: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 69   zName, nName, i
9930: 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20  nitbusy);.  if( 
9940: 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61 6d 65 20  nName<0 ) nName 
9950: 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
9960: 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79  .  if( !initbusy
9970: 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21   && (!pColl || !
9980: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a  pColl->xCmp) ){.
9990: 20 20 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74      /* No collat
99a0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ion sequence of 
99b0: 74 68 69 73 20 74 79 70 65 20 66 6f 72 20 74 68  this type for th
99c0: 69 73 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 72  is encoding is r
99d0: 65 67 69 73 74 65 72 65 64 2e 0a 20 20 20 20 2a  egistered..    *
99e0: 2a 20 43 61 6c 6c 20 74 68 65 20 63 6f 6c 6c 61  * Call the colla
99f0: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 74 6f 20  tion factory to 
9a00: 73 65 65 20 69 66 20 69 74 20 63 61 6e 20 73 75  see if it can su
9a10: 70 70 6c 79 20 75 73 20 77 69 74 68 20 6f 6e 65  pply us with one
9a20: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 6c  ..    */.    cal
9a30: 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 70 50 61 72  lCollNeeded(pPar
9a40: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  se->db, zName, n
9a50: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  Name);.    pColl
9a60: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
9a70: 6c 6c 53 65 71 28 70 50 61 72 73 65 2d 3e 64 62  llSeq(pParse->db
9a80: 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  , enc, zName, nN
9a90: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ame, 0);.    if(
9aa0: 20 70 43 6f 6c 6c 20 26 26 20 21 70 43 6f 6c 6c   pColl && !pColl
9ab0: 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 20 20  ->xCmp ){.      
9ac0: 2f 2a 20 54 68 65 72 65 20 6d 61 79 20 62 65 20  /* There may be 
9ad0: 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  a version of the
9ae0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
9af0: 6e 63 65 20 74 68 61 74 20 72 65 71 75 69 72 65  nce that require
9b00: 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73  s.      ** trans
9b10: 6c 61 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 65  lation between e
9b20: 6e 63 6f 64 69 6e 67 73 2e 20 53 65 61 72 63 68  ncodings. Search
9b30: 20 66 6f 72 20 69 74 20 77 69 74 68 20 73 79 6e   for it with syn
9b40: 74 68 43 6f 6c 6c 53 65 71 28 29 2e 0a 20 20 20  thCollSeq()..   
9b50: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
9b60: 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 70 50 61  synthCollSeq(pPa
9b70: 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 0a 20  rse, pColl) ){. 
9b80: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
9b90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9ba0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 68   }..  /* If noth
9bb0: 69 6e 67 20 68 61 73 20 62 65 65 6e 20 66 6f 75  ing has been fou
9bc0: 6e 64 2c 20 77 72 69 74 65 20 74 68 65 20 65 72  nd, write the er
9bd0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f  ror message into
9be0: 20 70 50 61 72 73 65 20 2a 2f 0a 20 20 69 66 28   pParse */.  if(
9bf0: 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21   !initbusy && (!
9c00: 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d  pColl || !pColl-
9c10: 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 69 66  >xCmp) ){.    if
9c20: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
9c30: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
9c40: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9c50: 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c  e, "no such coll
9c60: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20  ation sequence: 
9c70: 25 2e 2a 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e  %.*s", nName, zN
9c80: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
9c90: 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  pColl = 0;.  }. 
9ca0: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
9cb0: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
9cc0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
9cd0: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73   increment the s
9ce0: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a  chema cookie..**
9cf0: 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63  .** The schema c
9d00: 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f  ookie is used to
9d10: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20   determine when 
9d20: 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74  the schema for t
9d30: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
9d40: 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65  hanges.  After e
9d50: 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ach schema chang
9d60: 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61  e, the cookie va
9d70: 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  lue.** changes. 
9d80: 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   When a process 
9d90: 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20  first reads the 
9da0: 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64  schema it record
9db0: 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e  s the.** cookie.
9dc0: 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68    Thereafter, wh
9dd0: 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74  enever it goes t
9de0: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
9df0: 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65  abase,.** it che
9e00: 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  cks the cookie t
9e10: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
9e20: 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63  schema has not c
9e30: 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20  hanged.** since 
9e40: 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64  it was last read
9e50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61  ..**.** This pla
9e60: 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  n is not complet
9e70: 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66  ely bullet-proof
9e80: 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  .  It is possibl
9e90: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68  e for.** the sch
9ea0: 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75  ema to change mu
9eb0: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64  ltiple times and
9ec0: 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20   for the cookie 
9ed0: 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63  to be.** set bac
9ee0: 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65  k to prior value
9ef0: 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68  .  But schema ch
9f00: 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71  anges are infreq
9f10: 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20  uent.** and the 
9f20: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68  probability of h
9f30: 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20  itting the same 
9f40: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20  cookie value is 
9f50: 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65  only.** 1 chance
9f60: 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65   in 2^32.  So we
9f70: 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e  're safe enough.
9f80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9f90: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c  ChangeCookie(sql
9fa0: 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
9fb0: 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73  v, int iDb){.  s
9fc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9fd0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64  v, OP_Integer, d
9fe0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65  b->aDb[iDb].sche
9ff0: 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 30 29 3b  ma_cookie+1, 0);
a000: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
a010: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
a020: 6b 69 65 2c 20 69 44 62 2c 20 30 29 3b 0a 7d 0a  kie, iDb, 0);.}.
a030: 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74  ./*.** Measure t
a040: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
a050: 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74  racters needed t
a060: 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76  o output the giv
a070: 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72  en.** identifier
a080: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65  .  The number re
a090: 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20  turned includes 
a0a0: 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a  any quotes used.
a0b0: 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  ** but does not 
a0c0: 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c  include the null
a0d0: 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a   terminator..**.
a0e0: 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20  ** The estimate 
a0f0: 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e  is conservative.
a100: 20 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61    It might be la
a110: 72 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69  rger that what i
a120: 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64  s.** really need
a130: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
a140: 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f  t identLength(co
a150: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
a160: 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30  int n;.  for(n=0
a170: 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b  ; *z; n++, z++){
a180: 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27  .    if( *z=='"'
a190: 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20   ){ n++; }.  }. 
a1a0: 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d   return n + 2;.}
a1b0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  ../*.** Write an
a1c0: 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f   identifier onto
a1d0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a1e0: 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41  given string.  A
a1f0: 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72  dd.** quote char
a200: 61 63 74 65 72 73 20 61 73 20 6e 65 65 64 65 64  acters as needed
a210: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a220: 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a   identPut(char *
a230: 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68  z, int *pIdx, ch
a240: 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74  ar *zSignedIdent
a250: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
a260: 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e  ar *zIdent = (un
a270: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69  signed char*)zSi
a280: 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74  gnedIdent;.  int
a290: 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65   i, j, needQuote
a2a0: 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20  ;.  i = *pIdx;. 
a2b0: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
a2c0: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  [j]; j++){.    i
a2d0: 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65  f( !isalnum(zIde
a2e0: 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74  nt[j]) && zIdent
a2f0: 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b  [j]!='_' ) break
a300: 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74  ;.  }.  needQuot
a310: 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d  e =  zIdent[j]!=
a320: 30 20 7c 7c 20 69 73 64 69 67 69 74 28 7a 49 64  0 || isdigit(zId
a330: 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20  ent[0]).        
a340: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
a350: 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28  ite3KeywordCode(
a360: 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49  zIdent, j)!=TK_I
a370: 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f  D;.  if( needQuo
a380: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  te ) z[i++] = '"
a390: 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  ';.  for(j=0; zI
a3a0: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
a3b0: 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65     z[i++] = zIde
a3c0: 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a  nt[j];.    if( z
a3d0: 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20  Ident[j]=='"' ) 
a3e0: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
a3f0: 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  }.  if( needQuot
a400: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
a410: 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20  ;.  z[i] = 0;.  
a420: 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a  *pIdx = i;.}../*
a430: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43  .** Generate a C
a440: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
a450: 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74  ement appropriat
a460: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
a470: 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72  ** table.  Memor
a480: 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65  y to hold the te
a490: 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  xt of the statem
a4a0: 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ent is obtained.
a4b0: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ** from sqliteMa
a4c0: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
a4d0: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
a4e0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
a4f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
a500: 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d   *createTableStm
a510: 74 28 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  t(Table *p){.  i
a520: 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68  nt i, k, n;.  ch
a530: 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61  ar *zStmt;.  cha
a540: 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c  r *zSep, *zSep2,
a550: 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f   *zEnd, *z;.  Co
a560: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20  lumn *pCol;.  n 
a570: 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20  = 0;.  for(pCol 
a580: 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  = p->aCol, i=0; 
a590: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
a5a0: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b  pCol++){.    n +
a5b0: 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43  = identLength(pC
a5c0: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
a5d0: 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b  z = pCol->zType;
a5e0: 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20  .    if( z ){.  
a5f0: 20 20 20 20 6e 20 2b 3d 20 28 73 74 72 6c 65 6e      n += (strlen
a600: 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a  (z) + 1);.    }.
a610: 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74    }.  n += ident
a620: 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29  Length(p->zName)
a630: 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 0a  ;.  if( n<50 ){.
a640: 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20      zSep = "";. 
a650: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a     zSep2 = ",";.
a660: 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a      zEnd = ")";.
a670: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65    }else{.    zSe
a680: 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20  p = "\n  ";.    
a690: 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b  zSep2 = ",\n  ";
a6a0: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29  .    zEnd = "\n)
a6b0: 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35  ";.  }.  n += 35
a6c0: 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20   + 6*p->nCol;.  
a6d0: 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61  zStmt = sqliteMa
a6e0: 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a 20 20  llocRaw( n );.  
a6f0: 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72  if( zStmt==0 ) r
a700: 65 74 75 72 6e 20 30 3b 0a 20 20 73 74 72 63 70  eturn 0;.  strcp
a710: 79 28 7a 53 74 6d 74 2c 20 70 2d 3e 69 44 62 3d  y(zStmt, p->iDb=
a720: 3d 31 20 3f 20 22 43 52 45 41 54 45 20 54 45 4d  =1 ? "CREATE TEM
a730: 50 20 54 41 42 4c 45 20 22 20 3a 20 22 43 52 45  P TABLE " : "CRE
a740: 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20  ATE TABLE ");.  
a750: 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74  k = strlen(zStmt
a760: 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53  );.  identPut(zS
a770: 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d  tmt, &k, p->zNam
a780: 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d  e);.  zStmt[k++]
a790: 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43   = '(';.  for(pC
a7a0: 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b  ol=p->aCol, i=0;
a7b0: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c   i<p->nCol; i++,
a7c0: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74   pCol++){.    st
a7d0: 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20  rcpy(&zStmt[k], 
a7e0: 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20  zSep);.    k += 
a7f0: 73 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d  strlen(&zStmt[k]
a800: 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53  );.    zSep = zS
a810: 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75  ep2;.    identPu
a820: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f  t(zStmt, &k, pCo
a830: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  l->zName);.    i
a840: 66 28 20 28 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54  f( (z = pCol->zT
a850: 79 70 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ype)!=0 ){.     
a860: 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20   zStmt[k++] = ' 
a870: 27 3b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28  ';.      strcpy(
a880: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 29 3b 0a 20  &zStmt[k], z);. 
a890: 20 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e       k += strlen
a8a0: 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (z);.    }.  }. 
a8b0: 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b   strcpy(&zStmt[k
a8c0: 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75  ], zEnd);.  retu
a8d0: 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a  rn zStmt;.}../*.
a8e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a8f0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70  is called to rep
a900: 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29  ort the final ")
a910: 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65  " that terminate
a920: 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41  s.** a CREATE TA
a930: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
a940: 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73  *.** The table s
a950: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f 74  tructure that ot
a960: 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  her action routi
a970: 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62 75  nes have been bu
a980: 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64  ilding.** is add
a990: 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e  ed to the intern
a9a0: 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20  al hash tables, 
a9b0: 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f  assuming no erro
a9c0: 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72  rs have.** occur
a9d0: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e  red..**.** An en
a9e0: 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c  try for the tabl
a9f0: 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65  e is made in the
aa00: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e   master table on
aa10: 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a   disk, unless.**
aa20: 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
aa30: 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62  rary table or db
aa40: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20  ->init.busy==1. 
aa50: 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62   When db->init.b
aa60: 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61  usy==1.** it mea
aa70: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
aa80: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
aa90: 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73  ter table becaus
aaa0: 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e  e we just.** con
aab0: 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64 61  nected to the da
aac0: 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75 73  tabase or becaus
aad0: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
aae0: 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a  ter table has.**
aaf0: 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65   recently change
ab00: 73 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20  s, so the entry 
ab10: 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 61  for this table a
ab20: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e  lready exists in
ab30: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  .** the sqlite_m
ab40: 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65  aster table.  We
ab50: 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20   do not want to 
ab60: 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e  create it again.
ab70: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53  .**.** If the pS
ab80: 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69  elect argument i
ab90: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d  s not NULL, it m
aba0: 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 72  eans that this r
abb0: 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61  outine.** was ca
abc0: 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
abd0: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
abe0: 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45   from a .** "CRE
abf0: 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53  ATE TABLE ... AS
ac00: 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61   SELECT ..." sta
ac10: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c  tement.  The col
ac20: 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  umn names of.** 
ac30: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69  the new table wi
ac40: 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65 73  ll match the res
ac50: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
ac60: 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ELECT..*/.void s
ac70: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 50  qlite3EndTable(P
ac80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
ac90: 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c 65 63  ken *pEnd, Selec
aca0: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
acb0: 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74  able *p;.  sqlit
acc0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
acd0: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e  >db;..  if( (pEn
ace0: 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d  d==0 && pSelect=
acf0: 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  =0) || pParse->n
ad00: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
ad10: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
ad20: 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61  eturn;.  p = pPa
ad30: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
ad40: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
ad50: 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
ad60: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c  !db->init.busy |
ad70: 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20  | !pSelect );.. 
ad80: 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69   /* If the db->i
ad90: 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74  nit.busy is 1 it
ada0: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
adb0: 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66  ading the SQL of
adc0: 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69  f the.  ** "sqli
add0: 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73  te_master" or "s
ade0: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
adf0: 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  r" table on the 
ae00: 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f  disk..  ** So do
ae10: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
ae20: 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45  e disk again.  E
ae30: 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20  xtract the root 
ae40: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
ae50: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66   for the table f
ae60: 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74  rom the db->init
ae70: 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20  .newTnum field. 
ae80: 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65   (The page numbe
ae90: 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61  r.  ** should ha
aea0: 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72  ve been put ther
aeb0: 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f  e by the sqliteO
aec0: 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a  penCb routine.).
aed0: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
aee0: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
aef0: 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  p->tnum = db->in
af00: 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a  it.newTnum;.  }.
af10: 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69  .  /* If not ini
af20: 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20  tializing, then 
af30: 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20  create a record 
af40: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
af50: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51  e.  ** in the SQ
af60: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
af70: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
af80: 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20 6e  e.  The record n
af90: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
afa0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e 74  he new table ent
afb0: 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  ry should alread
afc0: 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61 63  y be on the stac
afd0: 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  k..  **.  ** If 
afe0: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52  this is a TEMPOR
aff0: 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65  ARY table, write
b000: 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20   the entry into 
b010: 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20  the auxiliary.  
b020: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
b030: 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  of into the main
b040: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
b050: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
b060: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
b070: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
b080: 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   *v;.    char *z
b090: 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65  Type;    /* "vie
b0a0: 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f  w" or "table" */
b0b0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
b0c0: 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f  2;   /* "VIEW" o
b0d0: 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20  r "TABLE" */.   
b0e0: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20   char *zStmt;   
b0f0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
b100: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20  CREATE TABLE or 
b110: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
b120: 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20  ement */..    v 
b130: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
b140: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
b150: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
b160: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
b170: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
b180: 73 65 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20  se, 0, 0);..    
b190: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f  /* Create the ro
b1a0: 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e  otpage for the n
b1b0: 65 77 20 74 61 62 6c 65 20 61 6e 64 20 70 75 73  ew table and pus
b1c0: 68 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 73 74  h it onto the st
b1d0: 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 41 20 76 69  ack..    ** A vi
b1e0: 65 77 20 68 61 73 20 6e 6f 20 72 6f 6f 74 70 61  ew has no rootpa
b1f0: 67 65 2c 20 73 6f 20 6a 75 73 74 20 70 75 73 68  ge, so just push
b200: 20 61 20 7a 65 72 6f 20 6f 6e 74 6f 20 74 68 65   a zero onto the
b210: 20 73 74 61 63 6b 20 66 6f 72 0a 20 20 20 20 2a   stack for.    *
b220: 2a 20 76 69 65 77 73 2e 20 20 49 6e 69 74 69 61  * views.  Initia
b230: 6c 69 7a 65 20 7a 54 79 70 65 20 61 74 20 74 68  lize zType at th
b240: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20  e same time..   
b250: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
b260: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
b270: 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20     /* A regular 
b280: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 2f  table */.      /
b290: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  * sqlite3VdbeAdd
b2a0: 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54  Op(v, OP_CreateT
b2b0: 61 62 6c 65 2c 20 70 2d 3e 69 44 62 2c 20 30 29  able, p->iDb, 0)
b2c0: 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65  ; */.      zType
b2d0: 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20   = "table";.    
b2e0: 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c    zType2 = "TABL
b2f0: 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  E";.#ifndef SQLI
b300: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20  TE_OMIT_VIEW.   
b310: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
b320: 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 2f   A view */.    /
b330: 2a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  *  sqlite3VdbeAd
b340: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
b350: 72 2c 20 30 2c 20 30 29 3b 20 2a 2f 0a 20 20 20  r, 0, 0); */.   
b360: 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77     zType = "view
b370: 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20  ";.      zType2 
b380: 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66  = "VIEW";.#endif
b390: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
b3a0: 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41  f this is a CREA
b3b0: 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53  TE TABLE xx AS S
b3c0: 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75  ELECT ..., execu
b3d0: 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  te the SELECT.  
b3e0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
b3f0: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e  o populate the n
b400: 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f  ew table. The ro
b410: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66  ot-page number f
b420: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65  or the.    ** ne
b430: 77 20 74 61 62 6c 65 20 69 73 20 6f 6e 20 74 68  w table is on th
b440: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 76 64 62  e top of the vdb
b450: 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a  e stack..    **.
b460: 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20      ** Once the 
b470: 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20  SELECT has been 
b480: 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33  coded by sqlite3
b490: 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20  Select(), it is 
b4a0: 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74  in a.    ** suit
b4b0: 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75  able state to qu
b4c0: 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ery for the colu
b4d0: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70  mn names and typ
b4e0: 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20  es to be used.  
b4f0: 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20    ** by the new 
b500: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
b510: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
b520: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53  .      Table *pS
b530: 65 6c 54 61 62 3b 0a 20 20 20 20 20 20 73 71 6c  elTab;.      sql
b540: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b550: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
b560: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b570: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
b580: 65 67 65 72 2c 20 70 2d 3e 69 44 62 2c 20 30 29  eger, p->iDb, 0)
b590: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b5a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
b5b0: 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 29 3b  penWrite, 1, 0);
b5c0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
b5d0: 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  Tab = 2;.      s
b5e0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
b5f0: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 53 52  rse, pSelect, SR
b600: 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30  T_Table, 1, 0, 0
b610: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
b620: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b630: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20  v, OP_Close, 1, 
b640: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  0);.      if( pP
b650: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
b660: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
b670: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
b680: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
b690: 73 65 2c 20 30 2c 20 70 53 65 6c 65 63 74 29 3b  se, 0, pSelect);
b6a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
b6b0: 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  lTab==0 ) return
b6c0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
b6d0: 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ( p->aCol==0 );.
b6e0: 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20          p->nCol 
b6f0: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
b700: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c  .        p->aCol
b710: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
b720: 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61  ;.        pSelTa
b730: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
b740: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43       pSelTab->aC
b750: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
b760: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
b770: 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a  le(0, pSelTab);.
b780: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
b790: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
b7a0: 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
b7b0: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74  of the CREATE st
b7c0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
b7d0: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
b7e0: 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61      zStmt = crea
b7f0: 74 65 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a  teTableStmt(p);.
b800: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b810: 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e   n = Addr(pEnd->
b820: 7a 29 20 2d 20 41 64 64 72 28 70 50 61 72 73 65  z) - Addr(pParse
b830: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20  ->sNameToken.z) 
b840: 2b 20 31 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74  + 1;.      zStmt
b850: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
b860: 66 28 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a  f("CREATE %s %.*
b870: 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70  s", zType2, n, p
b880: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
b890: 6e 2e 7a 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n.z);.    }..   
b8a0: 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74   /* A slot for t
b8b0: 68 65 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c  he record has al
b8c0: 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
b8d0: 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20  ated in the .   
b8e0: 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45   ** SQLITE_MASTE
b8f0: 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73  R table.  We jus
b900: 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65  t need to update
b910: 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20   that slot with 
b920: 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69  all.    ** the i
b930: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65  nformation we've
b940: 20 63 6f 6c 6c 65 63 74 65 64 2e 20 20 54 68 65   collected.  The
b950: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 70   rowid for the p
b960: 72 65 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  reallocated.    
b970: 2a 2a 20 73 6c 6f 74 20 69 73 20 74 68 65 20 32  ** slot is the 2
b980: 6e 64 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73  nd item on the s
b990: 74 61 63 6b 2e 20 20 54 68 65 20 74 6f 70 20 6f  tack.  The top o
b9a0: 66 20 74 68 65 20 73 74 61 63 6b 20 69 73 20 74  f the stack is t
b9b0: 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70  he.    ** root p
b9c0: 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  age for the new 
b9d0: 74 61 62 6c 65 20 28 6f 72 20 61 20 30 20 69 66  table (or a 0 if
b9e0: 20 74 68 69 73 20 69 73 20 61 20 76 69 65 77 29   this is a view)
b9f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
ba00: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
ba10: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55  pParse,.      "U
ba20: 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20  PDATE %Q.%s ".  
ba30: 20 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65         "SET type
ba40: 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20  ='%s', name=%Q, 
ba50: 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f  tbl_name=%Q, roo
ba60: 74 70 61 67 65 3d 23 30 2c 20 73 71 6c 3d 25 51  tpage=#0, sql=%Q
ba70: 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45   ".       "WHERE
ba80: 20 72 6f 77 69 64 3d 23 31 22 2c 0a 20 20 20 20   rowid=#1",.    
ba90: 20 20 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62    db->aDb[p->iDb
baa0: 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
bab0: 54 41 42 4c 45 28 70 2d 3e 69 44 62 29 2c 0a 20  TABLE(p->iDb),. 
bac0: 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20       zType,.    
bad0: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
bae0: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
baf0: 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20    zStmt.    );. 
bb00: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 53     sqliteFree(zS
bb10: 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tmt);.    sqlite
bb20: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  3ChangeCookie(db
bb30: 2c 20 76 2c 20 70 2d 3e 69 44 62 29 3b 0a 0a 23  , v, p->iDb);..#
bb40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
bb50: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
bb60: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
bb70: 20 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20   see if we need 
bb80: 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c  to create an sql
bb90: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
bba0: 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65  le for.    ** ke
bbb0: 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61  eping track of a
bbc0: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79  utoincrement key
bbd0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
bbe0: 28 20 70 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a  ( p->autoInc ){.
bbf0: 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20        Db *pDb = 
bc00: 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d  &db->aDb[p->iDb]
bc10: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
bc20: 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20  >pSeqTab==0 ){. 
bc30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65         sqlite3Ne
bc40: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
bc50: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45  ,.          "CRE
bc60: 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c  ATE TABLE %Q.sql
bc70: 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d  ite_sequence(nam
bc80: 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20  e,seq)",.       
bc90: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20     pDb->zName.  
bca0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
bcb0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
bcc0: 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76     /* Reparse ev
bcd0: 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61  erything to upda
bce0: 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  te our internal 
bcf0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
bd00: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
bd10: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73  beOp3(v, OP_Pars
bd20: 65 53 63 68 65 6d 61 2c 20 70 2d 3e 69 44 62 2c  eSchema, p->iDb,
bd30: 20 30 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0,.        sqli
bd40: 74 65 33 4d 50 72 69 6e 74 66 28 22 74 62 6c 5f  te3MPrintf("tbl_
bd50: 6e 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e  name='%q'",p->zN
bd60: 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43  ame), P3_DYNAMIC
bd70: 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64  );.  }...  /* Ad
bd80: 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74  d the table to t
bd90: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
bda0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
bdb0: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
bdc0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
bdd0: 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d  .busy && pParse-
bde0: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
bdf0: 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20  Table *pOld;.   
be00: 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20 0a 20   FKey *pFKey; . 
be10: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
be20: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20  ->aDb[p->iDb];. 
be30: 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65     pOld = sqlite
be40: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
be50: 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e  ->tblHash, p->zN
be60: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a  ame, strlen(p->z
be70: 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20  Name)+1, p);.   
be80: 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20   if( pOld ){.   
be90: 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f     assert( p==pO
bea0: 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ld );  /* Malloc
beb0: 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
bec0: 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73  d inside HashIns
bed0: 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 72  ert() */.      r
bee0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 23 69 66  eturn;.    }.#if
bef0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bf00: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
bf10: 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70 46   for(pFKey=p->pF
bf20: 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65  Key; pFKey; pFKe
bf30: 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72  y=pFKey->pNextFr
bf40: 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  om){.      int n
bf50: 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b 65  To = strlen(pFKe
bf60: 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20  y->zTo) + 1;.   
bf70: 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54     pFKey->pNextT
bf80: 6f 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  o = sqlite3HashF
bf90: 69 6e 64 28 26 70 44 62 2d 3e 61 46 4b 65 79 2c  ind(&pDb->aFKey,
bfa0: 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f   pFKey->zTo, nTo
bfb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bfc0: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
bfd0: 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a  >aFKey, pFKey->z
bfe0: 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b  To, nTo, pFKey);
bff0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
c000: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
c010: 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  ble = 0;.    db-
c020: 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64  >nTable++;.    d
c030: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
c040: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
c050: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
c060: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
c070: 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  W./*.** The pars
c080: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
c090: 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74  utine in order t
c0a0: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56  o create a new V
c0b0: 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  IEW.*/.void sqli
c0c0: 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20  te3CreateView(. 
c0d0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c0e0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
c0f0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
c100: 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20  Token *pBegin,  
c110: 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
c120: 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
c130: 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ns the statement
c140: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
c150: 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me1,     /* The 
c160: 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
c170: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
c180: 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
c190: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
c1a0: 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
c1b0: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
c1c0: 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
c1d0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
c1e0: 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73     /* A SELECT s
c1f0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69  tatement that wi
c200: 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
c210: 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  w view */.  int 
c220: 69 73 54 65 6d 70 20 20 20 20 20 20 20 20 20 2f  isTemp         /
c230: 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d  * TRUE for a TEM
c240: 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 29  PORARY view */.)
c250: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
c260: 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75  int n;.  const u
c270: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b  nsigned char *z;
c280: 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20  .  Token sEnd;. 
c290: 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20   DbFixer sFix;. 
c2a0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 0a   Token *pName;..
c2b0: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
c2c0: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65 67  ble(pParse, pBeg
c2d0: 69 6e 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  in, pName1, pNam
c2e0: 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 29 3b 0a  e2, isTemp, 1);.
c2f0: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
c300: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
c310: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
c320: 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
c330: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
c340: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74  Select);.    ret
c350: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
c360: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
c370: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
c380: 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
c390: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 49   if( sqlite3FixI
c3a0: 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73  nit(&sFix, pPars
c3b0: 65 2c 20 70 2d 3e 69 44 62 2c 20 22 76 69 65 77  e, p->iDb, "view
c3c0: 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 26 26  ", pName).    &&
c3d0: 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63   sqlite3FixSelec
c3e0: 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74  t(&sFix, pSelect
c3f0: 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ).  ){.    sqlit
c400: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
c410: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74  Select);.    ret
c420: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  urn;.  }..  /* M
c430: 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
c440: 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20  e entire SELECT 
c450: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
c460: 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
c470: 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  .  ** This will 
c480: 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78  force all the Ex
c490: 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65  pr.token.z value
c4a0: 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61  s to be dynamica
c4b0: 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  lly.  ** allocat
c4c0: 65 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70  ed rather than p
c4d0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75  oint to the inpu
c4e0: 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68  t string - which
c4f0: 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a   means that.  **
c500: 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69   they will persi
c510: 73 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72  st after the cur
c520: 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65  rent sqlite3_exe
c530: 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  c() call returns
c540: 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c  ..  */.  p->pSel
c550: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
c560: 65 63 74 44 75 70 28 70 53 65 6c 65 63 74 29 3b  ectDup(pSelect);
c570: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
c580: 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b  Delete(pSelect);
c590: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
c5a0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
c5b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 69 65 77  .    sqlite3View
c5c0: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
c5d0: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a  Parse, p);.  }..
c5e0: 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
c5f0: 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54  end of the CREAT
c600: 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
c610: 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69  .  Make sEnd poi
c620: 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65  nt to.  ** the e
c630: 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20  nd..  */.  sEnd 
c640: 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54  = pParse->sLastT
c650: 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64  oken;.  if( sEnd
c660: 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e 64  .z[0]!=0 && sEnd
c670: 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20  .z[0]!=';' ){.  
c680: 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64    sEnd.z += sEnd
c690: 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e  .n;.  }.  sEnd.n
c6a0: 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 73 45 6e 64   = 0;.  n = sEnd
c6b0: 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a  .z - pBegin->z;.
c6c0: 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73    z = (const uns
c6d0: 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 65 67  igned char*)pBeg
c6e0: 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
c6f0: 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d  n>0 && (z[n-1]==
c700: 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a  ';' || isspace(z
c710: 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20  [n-1])) ){ n--; 
c720: 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b  }.  sEnd.z = &z[
c730: 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d  n-1];.  sEnd.n =
c740: 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71   1;..  /* Use sq
c750: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
c760: 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20  to add the view 
c770: 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  to the SQLITE_MA
c780: 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20  STER table */.  
c790: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
c7a0: 70 50 61 72 73 65 2c 20 26 73 45 6e 64 2c 20 30  pParse, &sEnd, 0
c7b0: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23  );.  return;.}.#
c7c0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
c7d0: 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69  OMIT_VIEW */..#i
c7e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c7f0: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65  T_VIEW./*.** The
c800: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
c810: 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c   pTable is reall
c820: 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20  y a VIEW.  Fill 
c830: 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  in the names of.
c840: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  ** the columns o
c850: 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68  f the view in th
c860: 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75  e pTable structu
c870: 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  re.  Return the 
c880: 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72  number.** of err
c890: 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  ors.  If an erro
c8a0: 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20  r is seen leave 
c8b0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
c8c0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
c8d0: 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
c8e0: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
c8f0: 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61  Names(Parse *pPa
c900: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
c910: 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53  le){.  Table *pS
c920: 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61  elTab;   /* A fa
c930: 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68  ke table from wh
c940: 69 63 68 20 77 65 20 67 65 74 20 74 68 65 20 72  ich we get the r
c950: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53  esult set */.  S
c960: 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20  elect *pSel;    
c970: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20   /* Copy of the 
c980: 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c  SELECT that impl
c990: 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 20  ements the view 
c9a0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  */.  int nErr = 
c9b0: 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  0;     /* Number
c9c0: 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75   of errors encou
c9d0: 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ntered */.  int 
c9e0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
c9f0: 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c   Temporarily hol
ca00: 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ds the number of
ca10: 20 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65   cursors assigne
ca20: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
ca30: 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20  pTable );..  /* 
ca40: 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20  A positive nCol 
ca50: 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e  means the column
ca60: 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73  s names for this
ca70: 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61   view are.  ** a
ca80: 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20  lready known..  
ca90: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
caa0: 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e  >nCol>0 ) return
cab0: 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61   0;..  /* A nega
cac0: 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73  tive nCol is a s
cad0: 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65  pecial marker me
cae0: 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72  aning that we ar
caf0: 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a  e currently.  **
cb00: 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75   trying to compu
cb10: 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  te the column na
cb20: 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65  mes.  If we ente
cb30: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
cb40: 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74  ith.  ** a negat
cb50: 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61  ive nCol, it mea
cb60: 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76  ns two or more v
cb70: 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70  iews form a loop
cb80: 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a  , like this:.  *
cb90: 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  *.  **     CREAT
cba0: 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45  E VIEW one AS SE
cbb0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b  LECT * FROM two;
cbc0: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
cbd0: 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c   VIEW two AS SEL
cbe0: 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a  ECT * FROM one;.
cbf0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
cc00: 6c 79 2c 20 74 68 69 73 20 65 72 72 6f 72 20 69  ly, this error i
cc10: 73 20 63 61 75 67 68 74 20 70 72 65 76 69 6f 75  s caught previou
cc20: 73 6c 79 20 61 6e 64 20 73 6f 20 74 68 65 20 66  sly and so the f
cc30: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20 20  ollowing test.  
cc40: 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  ** should always
cc50: 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20 77   fail.  But we w
cc60: 69 6c 6c 20 6c 65 61 76 65 20 69 74 20 69 6e 20  ill leave it in 
cc70: 70 6c 61 63 65 20 6a 75 73 74 20 74 6f 20 62 65  place just to be
cc80: 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   safe..  */.  if
cc90: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30  ( pTable->nCol<0
cca0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
ccb0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
ccc0: 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63  "view %s is circ
ccd0: 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c  ularly defined",
cce0: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
ccf0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
cd00: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67   }..  /* If we g
cd10: 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
cd20: 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f  means we need to
cd30: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62   compute the tab
cd40: 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e  le names..  ** N
cd50: 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c  ote that the cal
cd60: 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75  l to sqlite3Resu
cd70: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
cd80: 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a  will expand any.
cd90: 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74    ** "*" element
cda0: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73  s in the results
cdb0: 20 73 65 74 20 6f 66 20 74 68 65 20 76 69 65 77   set of the view
cdc0: 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e   and will assign
cdd0: 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f   cursors.  ** to
cde0: 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66   the elements of
cdf0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
ce00: 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74  .  But we do not
ce10: 20 77 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e   want these chan
ce20: 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70  ges.  ** to be p
ce30: 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68  ermanent.  So th
ce40: 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  e computation is
ce50: 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20   done on a copy 
ce60: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  of the SELECT.  
ce70: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  ** statement tha
ce80: 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69  t defines the vi
ce90: 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ew..  */.  asser
cea0: 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  t( pTable->pSele
ceb0: 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73  ct );.  pSel = s
cec0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
ced0: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29  pTable->pSelect)
cee0: 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  n = pParse->
cef0: 6e 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 53  nTab;.  sqlite3S
cf00: 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
cf10: 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ors(pParse, pSel
cf20: 2d 3e 70 53 72 63 29 3b 0a 20 20 70 54 61 62 6c  ->pSrc);.  pTabl
cf30: 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20  e->nCol = -1;.  
cf40: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
cf50: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
cf60: 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53  ct(pParse, 0, pS
cf70: 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  el);.  pParse->n
cf80: 54 61 62 20 3d 20 6e 3b 0a 20 20 69 66 28 20 70  Tab = n;.  if( p
cf90: 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 61 73  SelTab ){.    as
cfa0: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43  sert( pTable->aC
cfb0: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  ol==0 );.    pTa
cfc0: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c  ble->nCol = pSel
cfd0: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70  Tab->nCol;.    p
cfe0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53  Table->aCol = pS
cff0: 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
d000: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
d010: 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d   0;.    pSelTab-
d020: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73  >aCol = 0;.    s
d030: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
d040: 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20  e(0, pSelTab);. 
d050: 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79     DbSetProperty
d060: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
d070: 62 6c 65 2d 3e 69 44 62 2c 20 44 42 5f 55 6e 72  ble->iDb, DB_Unr
d080: 65 73 65 74 56 69 65 77 73 29 3b 0a 20 20 7d 65  esetViews);.  }e
d090: 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d  lse{.    pTable-
d0a0: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 6e  >nCol = 0;.    n
d0b0: 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c  Err++;.  }.  sql
d0c0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
d0d0: 28 70 53 65 6c 29 3b 0a 20 20 72 65 74 75 72 6e  (pSel);.  return
d0e0: 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69   nErr;  .}.#endi
d0f0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
d100: 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65  _VIEW */..#ifnde
d110: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
d120: 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  EW./*.** Clear t
d130: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
d140: 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20  from every VIEW 
d150: 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e  in database idx.
d160: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d170: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
d180: 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
d190: 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68  int idx){.  Hash
d1a0: 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21  Elem *i;.  if( !
d1b0: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
d1c0: 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
d1d0: 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e  tViews) ) return
d1e0: 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
d1f0: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
d200: 44 62 5b 69 64 78 5d 2e 74 62 6c 48 61 73 68 29  Db[idx].tblHash)
d210: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
d220: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54  hNext(i)){.    T
d230: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
d240: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
d250: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
d260: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73  elect ){.      s
d270: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
d280: 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20  Names(pTab);.   
d290: 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72   }.  }.  DbClear
d2a0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
d2b0: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
d2c0: 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  s);.}.#else.# de
d2d0: 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52  fine sqliteViewR
d2e0: 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e  esetAll(A,B).#en
d2f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
d300: 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_VIEW */../*.*
d310: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d320: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
d330: 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20   VDBE to adjust 
d340: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
d350: 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53  ema.** used by S
d360: 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62  QLite when the b
d370: 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73  tree layer moves
d380: 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61   a table root pa
d390: 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d  ge. The.** root-
d3a0: 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
d3b0: 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61  or index in data
d3c0: 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61  base iDb has cha
d3d0: 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a  nged from iFrom.
d3e0: 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2f 0a 23 69  ** to iTo..*/.#i
d3f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d400: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69  T_AUTOVACUUM.voi
d410: 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67  d sqlite3RootPag
d420: 65 4d 6f 76 65 64 28 44 62 20 2a 70 44 62 2c 20  eMoved(Db *pDb, 
d430: 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
d440: 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  To){.  HashElem 
d450: 2a 70 45 6c 65 6d 3b 0a 20 20 0a 20 20 66 6f 72  *pElem;.  .  for
d460: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
d470: 68 46 69 72 73 74 28 26 70 44 62 2d 3e 74 62 6c  hFirst(&pDb->tbl
d480: 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
d490: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
d4a0: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
d4b0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
d4c0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
d4d0: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  em);.    if( pTa
d4e0: 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  b->tnum==iFrom )
d4f0: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e  {.      pTab->tn
d500: 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 20 20  um = iTo;.      
d510: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
d520: 7d 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  }.  for(pElem=sq
d530: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
d540: 44 62 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 45  Db->idxHash); pE
d550: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
d560: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
d570: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
d580: 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  dx = sqliteHashD
d590: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
d5a0: 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d  if( pIdx->tnum==
d5b0: 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
d5c0: 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Idx->tnum = iTo;
d5d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
d5e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
d5f0: 74 28 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  t(0);.}.#endif..
d600: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65  /*.** Write code
d610: 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61   to erase the ta
d620: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
d630: 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64  ge iTable from d
d640: 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20  atabase iDb..** 
d650: 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20  Also write code 
d660: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71  to modify the sq
d670: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
d680: 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  e and internal s
d690: 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f  chema.** if a ro
d6a0: 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68  ot-page of anoth
d6b0: 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
d6c0: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c  d by the btree-l
d6d0: 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65  ayer whilst.** e
d6e0: 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74  rasing iTable (t
d6f0: 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
d700: 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
d710: 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
d720: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65   .static void de
d730: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61  stroyRootPage(Pa
d740: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
d750: 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62   iTable, int iDb
d760: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
d770: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
d780: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
d790: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d7a0: 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c  Destroy, iTable,
d7b0: 20 69 44 62 29 3b 0a 23 69 66 6e 64 65 66 20 53   iDb);.#ifndef S
d7c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
d7d0: 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65  ACUUM.  /* OP_De
d7e0: 73 74 72 6f 79 20 70 75 73 68 65 73 20 61 6e 20  stroy pushes an 
d7f0: 69 6e 74 65 67 65 72 20 6f 6e 74 6f 20 74 68 65  integer onto the
d800: 20 73 74 61 63 6b 2e 20 49 66 20 74 68 69 73 20   stack. If this 
d810: 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20  integer.  ** is 
d820: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
d830: 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  t is the root pa
d840: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74  ge number of a t
d850: 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20  able moved to.  
d860: 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62  ** location iTab
d870: 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  le. The followin
d880: 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20  g code modifies 
d890: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
d8a0: 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20  r table to.  ** 
d8b0: 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20  reflect this..  
d8c0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 30 22  **.  ** The "#0"
d8d0: 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61   in the SQL is a
d8e0: 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e   special constan
d8f0: 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61  t that means wha
d900: 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a  tever value.  **
d910: 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f   is on the top o
d920: 66 20 74 68 65 20 73 74 61 63 6b 2e 20 20 53 65  f the stack.  Se
d930: 65 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65  e sqlite3Registe
d940: 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  rExpr()..  */.  
d950: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
d960: 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
d970: 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53   "UPDATE %Q.%s S
d980: 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57  ET rootpage=%d W
d990: 48 45 52 45 20 23 30 20 41 4e 44 20 72 6f 6f 74  HERE #0 AND root
d9a0: 70 61 67 65 3d 23 30 22 2c 0a 20 20 20 20 20 70  page=#0",.     p
d9b0: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
d9c0: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
d9d0: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54  A_TABLE(iDb), iT
d9e0: 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  able);.#endif.}.
d9f0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42  ./*.** Write VDB
da00: 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  E code to erase 
da10: 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61  table pTab and a
da20: 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e  ll associated in
da30: 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a  dices on disk..*
da40: 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65  * Code to update
da50: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
da60: 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  er tables and in
da70: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65  ternal schema de
da80: 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20  finitions.** in 
da90: 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65  case a root-page
daa0: 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e   belonging to an
dab0: 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d  other table is m
dac0: 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65  oved by the btre
dad0: 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c  e layer.** is al
dae0: 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63  so added (this c
daf0: 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
db00: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
db10: 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74  tabase)..*/.stat
db20: 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54  ic void destroyT
db30: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
db40: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  se, Table *pTab)
db50: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
db60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
db70: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
db80: 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
db90: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74  (pParse, pTab->t
dba0: 6e 75 6d 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b  num, pTab->iDb);
dbb0: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
dbc0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
dbd0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
dbe0: 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  ){.    destroyRo
dbf0: 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
dc00: 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 49 64 78 2d  Idx->tnum, pIdx-
dc10: 3e 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  >iDb);.  }.#else
dc20: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
dc30: 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74  abase may be aut
dc40: 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65  o-vacuum capable
dc50: 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54   (if SQLITE_OMIT
dc60: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a  _AUTOVACUUM.  **
dc70: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29   is not defined)
dc80: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70  , then it is imp
dc90: 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f  ortant to call O
dca0: 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65  P_Destroy on the
dcb0: 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  .  ** table and 
dcc0: 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73  index root-pages
dcd0: 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74   in order, start
dce0: 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d  ing with the num
dcf0: 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c  erically .  ** l
dd00: 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
dd10: 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75   number. This gu
dd20: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f  arantees that no
dd30: 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70  ne of the root-p
dd40: 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  ages.  ** to be 
dd50: 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c  destroyed is rel
dd60: 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72  ocated by an ear
dd70: 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e  lier OP_Destroy.
dd80: 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a   i.e. if the.  *
dd90: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65  * following were
dda0: 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a   coded:.  **.  *
ddb0: 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30  * OP_Destroy 4 0
ddc0: 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f  .  ** ....  ** O
ddd0: 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20  P_Destroy 5 0.  
dde0: 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74  **.  ** and root
ddf0: 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64   page 5 happened
de00: 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65   to be the large
de10: 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  st root-page num
de20: 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ber in the.  ** 
de30: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72  database, then r
de40: 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64  oot page 5 would
de50: 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67   be moved to pag
de60: 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a  e 4 by the .  **
de70: 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30   "OP_Destroy 4 0
de80: 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75  " opcode. The su
de90: 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73  bsequent "OP_Des
dea0: 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20  troy 5 0" would 
deb0: 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d  hit.  ** a free-
dec0: 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  list page..  */.
ded0: 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61    int iTab = pTa
dee0: 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69  b->tnum;.  int i
def0: 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a  Destroyed = 0;..
df00: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
df10: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
df20: 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20     int iLargest 
df30: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44  = 0;..    if( iD
df40: 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69  estroyed==0 || i
df50: 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29  Tab<iDestroyed )
df60: 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74  {.      iLargest
df70: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20   = iTab;.    }. 
df80: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
df90: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
dfa0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
dfb0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64  ){.      int iId
dfc0: 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a  x = pIdx->tnum;.
dfd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
dfe0: 64 78 2d 3e 69 44 62 3d 3d 70 54 61 62 2d 3e 69  dx->iDb==pTab->i
dff0: 44 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Db );.      if( 
e000: 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c  (iDestroyed==0 |
e010: 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79  | (iIdx<iDestroy
e020: 65 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61  ed)) && iIdx>iLa
e030: 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  rgest ){.       
e040: 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78   iLargest = iIdx
e050: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e060: 20 20 20 20 69 66 28 20 69 4c 61 72 67 65 73 74      if( iLargest
e070: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
e080: 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
e090: 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65  e(pParse, iLarge
e0a0: 73 74 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a  st, pTab->iDb);.
e0b0: 20 20 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d      iDestroyed =
e0c0: 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 7d 0a 23   iLargest;.  }.#
e0d0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
e0e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
e0f0: 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20  alled to do the 
e100: 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54  work of a DROP T
e110: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
e120: 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  ** pName is the 
e130: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
e140: 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e  e to be dropped.
e150: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
e160: 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
e170: 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
e180: 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56   *pName, int isV
e190: 69 65 77 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  iew){.  Table *p
e1a0: 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  Tab;.  Vdbe *v;.
e1b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
e1c0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
e1d0: 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50  t iDb;..  if( pP
e1e0: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
e1f0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
e200: 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  led ) goto exit_
e210: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 61 73  drop_table;.  as
e220: 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
e230: 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20 3d  c==1 );.  pTab =
e240: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
e250: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ble(pParse, pNam
e260: 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  e->a[0].zName, p
e270: 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
e280: 62 61 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 54  base);..  if( pT
e290: 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  ab==0 ) goto exi
e2a0: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
e2b0: 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b  iDb = pTab->iDb;
e2c0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
e2d0: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
e2e0: 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
e2f0: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
e300: 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
e310: 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73  t code;.    cons
e320: 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
e330: 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 54 61 62  CHEMA_TABLE(pTab
e340: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73  ->iDb);.    cons
e350: 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
e360: 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d  ->aDb[pTab->iDb]
e370: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
e380: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
e390: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
e3a0: 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c  DELETE, zTab, 0,
e3b0: 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f   zDb)){.      go
e3c0: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
e3d0: 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  le;.    }.    if
e3e0: 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20  ( isView ){.    
e3f0: 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a    if( iDb==1 ){.
e400: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
e410: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
e420: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  VIEW;.      }els
e430: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
e440: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49  = SQLITE_DROP_VI
e450: 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EW;.      }.    
e460: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
e470: 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
e480: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
e490: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
e4a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e4b0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
e4c0: 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b  LITE_DROP_TABLE;
e4d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e4e0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
e4f0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
e500: 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  code, pTab->zNam
e510: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
e520: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
e530: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
e540: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
e550: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
e560: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
e570: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20  pTab->zName, 0, 
e580: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
e590: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
e5a0: 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  le;.    }.  }.#e
e5b0: 6e 64 69 66 0a 20 20 69 66 28 20 70 54 61 62 2d  ndif.  if( pTab-
e5c0: 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 70 54 61  >readOnly || pTa
e5d0: 62 3d 3d 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  b==db->aDb[iDb].
e5e0: 70 53 65 71 54 61 62 20 29 7b 0a 20 20 20 20 73  pSeqTab ){.    s
e5f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e600: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
e610: 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70   may not be drop
e620: 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ped", pTab->zNam
e630: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
e640: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
e650: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
e660: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a  E_OMIT_VIEW.  /*
e670: 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42   Ensure DROP TAB
e680: 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f  LE is not used o
e690: 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52  n a view, and DR
e6a0: 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75  OP VIEW is not u
e6b0: 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61  sed.  ** on a ta
e6c0: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
e6d0: 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
e6e0: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
e6f0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
e700: 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
e710: 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c  ROP TABLE to del
e720: 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70  ete table %s", p
e730: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
e740: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
e750: 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  table;.  }.  if(
e760: 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62   !isView && pTab
e770: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
e780: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
e790: 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
e7a0: 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74  OP VIEW to delet
e7b0: 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62  e view %s", pTab
e7c0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
e7d0: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
e7e0: 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
e7f0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
e800: 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
e810: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
e820: 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a  master table.  *
e830: 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  * on disk..  */.
e840: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
e850: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
e860: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72 69  if( v ){.    Tri
e870: 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a  gger *pTrigger;.
e880: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 70 54      int iDb = pT
e890: 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20 44 62 20  ab->iDb;.    Db 
e8a0: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
e8b0: 69 44 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb];.    sqlite
e8c0: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
e8d0: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
e8e0: 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72  iDb);..    /* Dr
e8f0: 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20  op all triggers 
e900: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
e910: 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
e920: 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20  dropped. Code.  
e930: 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65    ** is generate
e940: 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72  d to remove entr
e950: 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  ies from sqlite_
e960: 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20  master and/or.  
e970: 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70    ** sqlite_temp
e980: 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75 69  _master if requi
e990: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
e9a0: 70 54 72 69 67 67 65 72 20 3d 20 70 54 61 62 2d  pTrigger = pTab-
e9b0: 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 77  >pTrigger;.    w
e9c0: 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29  hile( pTrigger )
e9d0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
e9e0: 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d 69  pTrigger->iDb==i
e9f0: 44 62 20 7c 7c 20 70 54 72 69 67 67 65 72 2d 3e  Db || pTrigger->
ea00: 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  iDb==1 );.      
ea10: 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67  sqlite3DropTrigg
ea20: 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54  erPtr(pParse, pT
ea30: 72 69 67 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  rigger, 1);.    
ea40: 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72    pTrigger = pTr
ea50: 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  igger->pNext;.  
ea60: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
ea70: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
ea80: 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65  REMENT.    /* Re
ea90: 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73  move any entries
eaa0: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73   of the sqlite_s
eab0: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73  equence table as
eac0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20  sociated with.  
ead0: 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62    ** the table b
eae0: 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68  eing dropped. Th
eaf0: 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72  is is done befor
eb00: 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64  e the table is d
eb10: 72 6f 70 70 65 64 0a 20 20 20 20 2a 2a 20 61 74  ropped.    ** at
eb20: 20 74 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c   the btree level
eb30: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 71  , in case the sq
eb40: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
eb50: 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 20  ble needs to.   
eb60: 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65   ** move as a re
eb70: 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70  sult of the drop
eb80: 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20   (can happen in 
eb90: 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
eba0: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
ebb0: 28 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20  ( pTab->autoInc 
ebc0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ebd0: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
ebe0: 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c  se,.        "DEL
ebf0: 45 54 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69  ETE FROM %s.sqli
ec00: 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52  te_sequence WHER
ec10: 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20  E name=%Q",.    
ec20: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20      pDb->zName, 
ec30: 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pTab->zName.    
ec40: 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69    );.    }.#endi
ec50: 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61  f..    /* Drop a
ec60: 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ll SQLITE_MASTER
ec70: 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
ec80: 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65   entries that re
ec90: 66 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  fer to the.    *
eca0: 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f  * table. The pro
ecb0: 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20  gram name loops 
ecc0: 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74  through the mast
ecd0: 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c  er table and del
ece0: 65 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72  etes.    ** ever
ecf0: 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72  y row that refer
ed00: 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20  s to a table of 
ed10: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
ed20: 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20   the one being. 
ed30: 20 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54     ** dropped. T
ed40: 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64  riggers are hand
ed50: 6c 65 64 20 73 65 70 65 72 61 74 65 6c 79 20 62  led seperately b
ed60: 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72  ecause a trigger
ed70: 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63   can be.    ** c
ed80: 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65  reated in the te
ed90: 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74  mp database that
eda0: 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
edb0: 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20  le in another.  
edc0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
edd0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
ede0: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
edf0: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 44  rse, .        "D
ee00: 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
ee10: 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d   WHERE tbl_name=
ee20: 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72  %Q and type!='tr
ee30: 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 20  igger'",.       
ee40: 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48   pDb->zName, SCH
ee50: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
ee60: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
ee70: 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b    if( !isView ){
ee80: 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 54 61  .      destroyTa
ee90: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
eea0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
eeb0: 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   Remove the tabl
eec0: 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c  e entry from SQL
eed0: 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73  ite's internal s
eee0: 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79  chema and modify
eef0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68 65  .    ** the sche
ef00: 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20 20 2a  ma cookie..    *
ef10: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
ef20: 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 54  eOp3(v, OP_DropT
ef30: 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 70 54  able, iDb, 0, pT
ef40: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
ef50: 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
ef60: 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44  Cookie(db, v, iD
ef70: 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  b);.  }.  sqlite
ef80: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c  ViewResetAll(db,
ef90: 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f   iDb);..exit_dro
efa0: 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74  p_table:.  sqlit
efb0: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
efc0: 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
efd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
efe0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
eff0: 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20  e a new foreign 
f000: 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  key on the table
f010: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
f020: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
f030: 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65  .  pFromCol dete
f040: 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c  rmines which col
f050: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63  umns.** in the c
f060: 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69  urrent table poi
f070: 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67  nt to the foreig
f080: 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d  n key.  If pFrom
f090: 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63  Col==0 then.** c
f0a0: 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74  onnect the key t
f0b0: 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  o the last colum
f0c0: 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f  n inserted.  pTo
f0d0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a   is the name of.
f0e0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66  ** the table ref
f0f0: 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f  erred to.  pToCo
f100: 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74  l is a list of t
f110: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68  ables in the oth
f120: 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20  er.** pTo table 
f130: 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e  that the foreign
f140: 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20   key points to. 
f150: 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20   flags contains 
f160: 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  all.** informati
f170: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  on about the con
f180: 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
f190: 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63   algorithms spec
f1a0: 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ified.** in the 
f1b0: 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50  ON DELETE, ON UP
f1c0: 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45  DATE and ON INSE
f1d0: 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  RT clauses..**.*
f1e0: 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74  * An FKey struct
f1f0: 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61  ure is created a
f200: 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
f210: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a  table currently.
f220: 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ** under constru
f230: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61  ction in the pPa
f240: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66  rse->pNewTable f
f250: 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46  ield.  The new F
f260: 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69  Key.** is not li
f270: 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46  nked into db->aF
f280: 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  Key at this poin
f290: 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  t - that does no
f2a0: 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69  t happen.** unti
f2b0: 6c 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  l sqlite3EndTabl
f2c0: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  e()..**.** The f
f2d0: 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65  oreign key is se
f2e0: 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20  t for IMMEDIATE 
f2f0: 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73  processing.  A s
f300: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a  ubsequent call.*
f310: 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65  * to sqlite3Defe
f320: 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69  rForeignKey() mi
f330: 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20  ght change this 
f340: 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a  to DEFERRED..*/.
f350: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
f360: 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20  teForeignKey(.  
f370: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
f380: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
f390: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
f3a0: 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c  rList *pFromCol,
f3b0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
f3c0: 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20  this table that 
f3d0: 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74  point to other t
f3e0: 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  able */.  Token 
f3f0: 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  *pTo,          /
f400: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74  * Name of the ot
f410: 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45  her table */.  E
f420: 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c  xprList *pToCol,
f430: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69      /* Columns i
f440: 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  n the other tabl
f450: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
f460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
f470: 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
f480: 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a  on algorithms. *
f490: 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
f4a0: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
f4b0: 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b  _KEY.  FKey *pFK
f4c0: 65 79 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20  ey = 0;.  Table 
f4d0: 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  *p = pParse->pNe
f4e0: 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42  wTable;.  int nB
f4f0: 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  yte;.  int i;.  
f500: 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72  int nCol;.  char
f510: 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *z;..  assert( 
f520: 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  pTo!=0 );.  if( 
f530: 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
f540: 6e 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65  nErr ) goto fk_e
f550: 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43  nd;.  if( pFromC
f560: 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ol==0 ){.    int
f570: 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d   iCol = p->nCol-
f580: 31 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  1;.    if( iCol<
f590: 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  0 ) goto fk_end;
f5a0: 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  .    if( pToCol 
f5b0: 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
f5c0: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=1 ){.      sql
f5d0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
f5e0: 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65  rse, "foreign ke
f5f0: 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20  y on %s".       
f600: 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72    " should refer
f610: 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f  ence only one co
f620: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54  lumn of table %T
f630: 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61  ",.         p->a
f640: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c  Col[iCol].zName,
f650: 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74   pTo);.      got
f660: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  o fk_end;.    }.
f670: 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20      nCol = 1;.  
f680: 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c  }else if( pToCol
f690: 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
f6a0: 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78  r!=pFromCol->nEx
f6b0: 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
f6c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
f6d0: 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65  ,.        "numbe
f6e0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
f6f0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73  foreign key does
f700: 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e   not match the n
f710: 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20  umber of ".     
f720: 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74     "columns in t
f730: 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
f740: 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ble");.    goto 
f750: 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b  fk_end;.  }else{
f760: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f  .    nCol = pFro
f770: 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  mCol->nExpr;.  }
f780: 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
f790: 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c  f(*pFKey) + nCol
f7a0: 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61  *sizeof(pFKey->a
f7b0: 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e  Col[0]) + pTo->n
f7c0: 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43   + 1;.  if( pToC
f7d0: 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
f7e0: 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78  0; i<pToCol->nEx
f7f0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
f800: 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28  nByte += strlen(
f810: 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
f820: 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  me) + 1;.    }. 
f830: 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c   }.  pFKey = sql
f840: 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  iteMalloc( nByte
f850: 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
f860: 3d 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  =0 ) goto fk_end
f870: 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d  ;.  pFKey->pFrom
f880: 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70   = p;.  pFKey->p
f890: 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46  NextFrom = p->pF
f8a0: 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72  Key;.  z = (char
f8b0: 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70  *)&pFKey[1];.  p
f8c0: 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74  FKey->aCol = (st
f8d0: 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b  ruct sColMap*)z;
f8e0: 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73  .  z += sizeof(s
f8f0: 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e  truct sColMap)*n
f900: 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54  Col;.  pFKey->zT
f910: 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28  o = z;.  memcpy(
f920: 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e  z, pTo->z, pTo->
f930: 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20  n);.  z[pTo->n] 
f940: 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d  = 0;.  z += pTo-
f950: 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70  >n+1;.  pFKey->p
f960: 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46  NextTo = 0;.  pF
f970: 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  Key->nCol = nCol
f980: 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
f990: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79  ==0 ){.    pFKey
f9a0: 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20  ->aCol[0].iFrom 
f9b0: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d  = p->nCol-1;.  }
f9c0: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
f9d0: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
f9e0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
f9f0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
fa00: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
fa10: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
fa20: 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c  3StrICmp(p->aCol
fa30: 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d  [j].zName, pFrom
fa40: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
fa50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
fa60: 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
fa70: 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20  iFrom = j;.     
fa80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fa90: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
faa0: 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43      if( j>=p->nC
fab0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ol ){.        sq
fac0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
fad0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
fae0: 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e   "unknown column
faf0: 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69   \"%s\" in forei
fb00: 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
fb10: 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  n", .          p
fb20: 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
fb30: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
fb40: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20  to fk_end;.     
fb50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
fb60: 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
fb70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
fb80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
fb90: 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 6f  t n = strlen(pTo
fba0: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
fbb0: 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61  ;.      pFKey->a
fbc0: 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b  Col[i].zCol = z;
fbd0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c  .      memcpy(z,
fbe0: 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e   pToCol->a[i].zN
fbf0: 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a  ame, n);.      z
fc00: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a  [n] = 0;.      z
fc10: 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20   += n+1;.    }. 
fc20: 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65   }.  pFKey->isDe
fc30: 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46  ferred = 0;.  pF
fc40: 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20  Key->deleteConf 
fc50: 3d 20 66 6c 61 67 73 20 26 20 30 78 66 66 3b 0a  = flags & 0xff;.
fc60: 20 20 70 46 4b 65 79 2d 3e 75 70 64 61 74 65 43    pFKey->updateC
fc70: 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20  onf = (flags >> 
fc80: 38 20 29 20 26 20 30 78 66 66 3b 0a 20 20 70 46  8 ) & 0xff;.  pF
fc90: 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20  Key->insertConf 
fca0: 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31 36 20 29  = (flags >> 16 )
fcb0: 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c   & 0xff;..  /* L
fcc0: 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20  ink the foreign 
fcd0: 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65  key to the table
fce0: 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65   as the last ste
fcf0: 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b  p..  */.  p->pFK
fd00: 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46  ey = pFKey;.  pF
fd10: 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64  Key = 0;..fk_end
fd20: 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  :.  sqliteFree(p
fd30: 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  FKey);.#endif /*
fd40: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
fd50: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
fd60: 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  Y) */.  sqlite3E
fd70: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 46  xprListDelete(pF
fd80: 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  romCol);.  sqlit
fd90: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
fda0: 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  (pToCol);.}../*.
fdb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
fdc0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
fdd0: 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  n INITIALLY IMME
fde0: 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c  DIATE or INITIAL
fdf0: 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63  LY DEFERRED.** c
fe00: 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73  lause is seen as
fe10: 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69   part of a forei
fe20: 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
fe30: 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72  n.  The isDeferr
fe40: 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  ed.** parameter 
fe50: 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c  is 1 for INITIAL
fe60: 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20  LY DEFERRED and 
fe70: 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  0 for INITIALLY 
fe80: 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68  IMMEDIATE..** Th
fe90: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68  e behavior of th
fea0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
feb0: 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20  created foreign 
fec0: 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a  key is adjusted.
fed0: 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  ** accordingly..
fee0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
fef0: 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50  eferForeignKey(P
ff00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
ff10: 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23  t isDeferred){.#
ff20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ff30: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
ff40: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
ff50: 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69  FKey *pFKey;.  i
ff60: 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73  f( (pTab = pPars
ff70: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
ff80: 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61   || (pFKey = pTa
ff90: 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72  b->pFKey)==0 ) r
ffa0: 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e  eturn;.  pFKey->
ffb0: 69 73 44 65 66 65 72 72 65 64 20 3d 20 69 73 44  isDeferred = isD
ffc0: 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a  eferred;.#endif.
ffd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
ffe0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
fff0: 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c   erase and refil
10000 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20  l index *pIdx.  
10010 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20  This is.** used 
10020 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  to initialize a 
10030 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e  newly created in
10040 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70  dex or to recomp
10050 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ute the.** conte
10060 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69  nt of an index i
10070 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20  n response to a 
10080 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e  REINDEX command.
10090 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f  .**.** if memRoo
100a0 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67  tPage is not neg
100b0 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20  ative, it means 
100c0 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69  that the index i
100d0 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74  s newly.** creat
100e0 65 64 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20  ed.  The memory 
100f0 63 65 6c 6c 20 73 70 65 63 69 66 69 65 64 20 62  cell specified b
10100 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f  y memRootPage co
10110 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f  ntains the.** ro
10120 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
10130 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66  f the index.  If
10140 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20   memRootPage is 
10150 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a  negative, then.*
10160 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65  * the index alre
10170 61 64 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d  ady exists and m
10180 75 73 74 20 62 65 20 63 6c 65 61 72 65 64 20 62  ust be cleared b
10190 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69  efore being refi
101a0 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20  lled and.** the 
101b0 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
101c0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   of the index is
101d0 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64   taken from pInd
101e0 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61  ex->tnum..*/.sta
101f0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
10200 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73  RefillIndex(Pars
10210 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
10220 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65   *pIndex, int me
10230 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61  mRootPage){.  Ta
10240 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
10250 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20  ex->pTable;  /* 
10260 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  The table that i
10270 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  s indexed */.  i
10280 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65  nt iTab = pParse
10290 2d 3e 6e 54 61 62 3b 20 20 20 20 20 20 20 2f 2a  ->nTab;       /*
102a0 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
102b0 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20  ed for pTab */. 
102c0 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72   int iIdx = pPar
102d0 73 65 2d 3e 6e 54 61 62 2b 31 3b 20 20 20 20 20  se->nTab+1;     
102e0 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20  /* Btree cursor 
102f0 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20  used for pIndex 
10300 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20  */.  int addr1; 
10310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10320 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
10330 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f  f top of loop */
10340 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20  .  int tnum;    
10350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10360 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
10370 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62  f index */.  Vdb
10380 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
10390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
103a0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
103b0 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  o this virtual m
103c0 61 63 68 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  achine */.  int 
103d0 69 73 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20  isUnique;       
103e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
103f0 75 65 20 66 6f 72 20 61 20 75 6e 69 71 75 65 20  ue for a unique 
10400 69 6e 64 65 78 20 2a 2f 0a 0a 23 69 66 6e 64 65  index */..#ifnde
10410 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
10420 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66  THORIZATION.  if
10430 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
10440 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
10450 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65  E_REINDEX, pInde
10460 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20  x->zName, 0,.   
10470 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61     pParse->db->a
10480 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e  Db[pIndex->iDb].
10490 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72  zName ) ){.    r
104a0 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
104b0 66 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61  f..  /* Ensure a
104c0 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ll the required 
104d0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
104e0 63 65 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  ces are availabl
104f0 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 72 6f 75  e. This.  ** rou
10500 74 69 6e 65 20 77 69 6c 6c 20 69 6e 76 6f 6b 65  tine will invoke
10510 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e   the collation-n
10520 65 65 64 65 64 20 63 61 6c 6c 62 61 63 6b 20 69  eeded callback i
10530 66 20 6e 65 63 65 73 73 61 72 79 20 28 61 6e 64  f necessary (and
10540 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 68 61 73  .  ** if one has
10550 20 62 65 65 6e 20 72 65 67 69 73 74 65 72 65 64   been registered
10560 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  )..  */.  if( sq
10570 6c 69 74 65 33 43 68 65 63 6b 49 6e 64 65 78 43  lite3CheckIndexC
10580 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
10590 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 72 65  Index) ){.    re
105a0 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d  turn;.  }..  v =
105b0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
105c0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
105d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
105e0 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  if( memRootPage>
105f0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
10600 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10610 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 52 6f 6f  _MemLoad, memRoo
10620 74 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 74  tPage, 0);.    t
10630 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  num = 0;.  }else
10640 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e  {.    tnum = pIn
10650 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 73  dex->tnum;.    s
10660 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10670 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75  v, OP_Clear, tnu
10680 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b  m, pIndex->iDb);
10690 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
106a0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
106b0 74 65 67 65 72 2c 20 70 49 6e 64 65 78 2d 3e 69  teger, pIndex->i
106c0 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  Db, 0);.  sqlite
106d0 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f  3VdbeOp3(v, OP_O
106e0 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20  penWrite, iIdx, 
106f0 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  tnum,.          
10700 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
10710 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  )&pIndex->keyInf
10720 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P3_KEYINFO);.
10730 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10740 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
10750 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b  , pTab->iDb, 0);
10760 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
10770 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  dOp(v, OP_OpenRe
10780 61 64 2c 20 69 54 61 62 2c 20 70 54 61 62 2d 3e  ad, iTab, pTab->
10790 74 6e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  tnum);.  sqlite3
107a0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
107b0 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69  SetNumColumns, i
107c0 54 61 62 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29  Tab, pTab->nCol)
107d0 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
107e0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
107f0 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
10800 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65   0);.  sqlite3Ge
10810 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 76  nerateIndexKey(v
10820 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62 29 3b  , pIndex, iTab);
10830 0a 20 20 69 73 55 6e 69 71 75 65 20 3d 20 70 49  .  isUnique = pI
10840 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
10850 45 5f 4e 6f 6e 65 3b 0a 20 20 73 71 6c 69 74 65  E_None;.  sqlite
10860 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10870 5f 49 64 78 50 75 74 2c 20 69 49 64 78 2c 20 69  _IdxPut, iIdx, i
10880 73 55 6e 69 71 75 65 29 3b 0a 20 20 69 66 28 20  sUnique);.  if( 
10890 69 73 55 6e 69 71 75 65 20 29 7b 0a 20 20 20 20  isUnique ){.    
108a0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
108b0 65 50 33 28 76 2c 20 2d 31 2c 20 22 69 6e 64 65  eP3(v, -1, "inde
108c0 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  xed columns are 
108d0 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33 5f  not unique", P3_
108e0 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 20 20 73  STATIC);.  }.  s
108f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10900 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62  v, OP_Next, iTab
10910 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20 20 73 71  , addr1+1);.  sq
10920 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
10930 32 28 76 2c 20 61 64 64 72 31 2c 20 73 71 6c 69  2(v, addr1, sqli
10940 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
10950 64 72 28 76 29 29 3b 0a 20 20 73 71 6c 69 74 65  dr(v));.  sqlite
10960 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10970 5f 43 6c 6f 73 65 2c 20 69 54 61 62 2c 20 30 29  _Close, iTab, 0)
10980 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
10990 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
109a0 2c 20 69 49 64 78 2c 20 30 29 3b 0a 7d 0a 0a 2f  , iIdx, 0);.}../
109b0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
109c0 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53  w index for an S
109d0 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65  QL table.  pName
109e0 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20  1.pName2 is the 
109f0 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
10a00 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69  x .** and pTblLi
10a10 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  st is the name o
10a20 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  f the table that
10a30 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
10a40 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a  d.  Both will .*
10a50 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20  * be NULL for a 
10a60 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61  primary key or a
10a70 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  n index that is 
10a80 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73  created to satis
10a90 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63  fy a.** UNIQUE c
10aa0 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70  onstraint.  If p
10ab0 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78  Table and pIndex
10ac0 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70   are NULL, use p
10ad0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
10ae0 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65  .** as the table
10af0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
10b00 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
10b10 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68  le is a table th
10b20 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  at is.** current
10b30 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
10b40 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45  cted by a CREATE
10b50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
10b60 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73  ..**.** pList is
10b70 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   a list of colum
10b80 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
10b90 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65  .  pList will be
10ba0 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a   NULL if this.**
10bb0 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65   is a primary ke
10bc0 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73  y or unique-cons
10bd0 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f  traint on the mo
10be0 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e  st recent column
10bf0 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65   added.** to the
10c00 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
10c10 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
10c20 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73  ion.  .*/.void s
10c30 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
10c40 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
10c50 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69  se,     /* All i
10c60 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
10c70 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20   this parse */. 
10c80 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
10c90 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72      /* First par
10ca0 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e  t of index name.
10cb0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
10cc0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
10cd0 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70       /* Second p
10ce0 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
10cf0 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
10d00 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62  /.  SrcList *pTb
10d10 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20  lName, /* Table 
10d20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50  to index. Use pP
10d30 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
10d40 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69  if 0 */.  ExprLi
10d50 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
10d60 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  A list of column
10d70 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
10d80 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
10d90 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62  ,       /* OE_Ab
10da0 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  ort, OE_Ignore, 
10db0 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f  OE_Replace, or O
10dc0 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65  E_None */.  Toke
10dd0 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f  n *pStart,     /
10de0 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
10df0 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 61  en that begins a
10e00 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
10e10 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
10e20 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 20 20  en *pEnd        
10e30 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20  /* The ")" that 
10e40 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54  closes the CREAT
10e50 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
10e60 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  t */.){.  Table 
10e70 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20  *pTab = 0;   /* 
10e80 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
10e90 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
10ea0 70 49 6e 64 65 78 20 3d 20 30 3b 20 2f 2a 20 54  pIndex = 0; /* T
10eb0 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
10ec0 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
10ed0 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *zName = 0;.  i
10ee0 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e  nt i, j;.  Token
10ef0 20 6e 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46   nullId;    /* F
10f00 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e  ake token for an
10f10 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a   empty ID list *
10f20 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  /.  DbFixer sFix
10f30 3b 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69  ;    /* For assi
10f40 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e  gning database n
10f50 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a  ames to pTable *
10f60 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 3b 20  /.  int isTemp; 
10f70 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
10f80 20 61 20 74 65 6d 70 6f 72 61 72 79 20 69 6e 64   a temporary ind
10f90 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ex */.  sqlite3 
10fa0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
10fb0 3b 0a 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  ;..  int iDb;   
10fc0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
10fd0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
10fe0 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72  that is being wr
10ff0 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  itten */.  Token
11000 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20   *pName = 0; /* 
11010 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
11020 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f   of the index to
11030 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66   create */..  if
11040 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
11050 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
11060 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65  _failed ) goto e
11070 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
11080 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  ;..  /*.  ** Fin
11090 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  d the table that
110a0 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
110b0 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79  d.  Return early
110c0 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   if not found.. 
110d0 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61   */.  if( pTblNa
110e0 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a  me!=0 ){..    /*
110f0 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72   Use the two-par
11100 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20  t index name to 
11110 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61  determine the da
11120 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74  tabase .    ** t
11130 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  o search for the
11140 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68   table. 'Fix' th
11150 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  e table name to 
11160 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62  this db.    ** b
11170 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70  efore looking up
11180 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
11190 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
111a0 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20  Name1 && pName2 
111b0 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  );.    iDb = sql
111c0 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
111d0 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
111e0 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
111f0 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29  .    if( iDb<0 )
11200 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
11210 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a  e_index;..    /*
11220 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   If the index na
11230 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69  me was unqualifi
11240 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65  ed, check if the
11250 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
11260 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c  * is a temp tabl
11270 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68  e. If so, set th
11280 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e  e database to 1.
11290 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 61 62  .    */.    pTab
112a0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
112b0 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  tLookup(pParse, 
112c0 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 69  pTblName);.    i
112d0 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61  f( pName2 && pNa
112e0 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61  me2->n==0 && pTa
112f0 62 20 26 26 20 70 54 61 62 2d 3e 69 44 62 3d 3d  b && pTab->iDb==
11300 31 20 29 7b 0a 20 20 20 20 20 20 69 44 62 20 3d  1 ){.      iDb =
11310 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   1;.    }..    i
11320 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
11330 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
11340 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70   iDb, "index", p
11350 4e 61 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20  Name) &&.       
11360 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
11370 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61  st(&sFix, pTblNa
11380 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  me).    ){.     
11390 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
113a0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
113b0 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
113c0 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
113d0 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61  rse, pTblName->a
113e0 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  [0].zName, .    
113f0 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b      pTblName->a[
11400 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
11410 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67     if( !pTab ) g
11420 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
11430 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72  index;.    asser
11440 74 28 20 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44  t( iDb==pTab->iD
11450 62 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  b );.  }else{.  
11460 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d    assert( pName=
11470 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d  =0 );.    pTab =
11480 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
11490 62 6c 65 3b 0a 20 20 20 20 69 44 62 20 3d 20 70  ble;.    iDb = p
114a0 54 61 62 2d 3e 69 44 62 3b 0a 20 20 7d 0a 0a 20  Tab->iDb;.  }.. 
114b0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20   if( pTab==0 || 
114c0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
114d0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
114e0 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61  index;.  if( pTa
114f0 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  b->readOnly ){. 
11500 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11510 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
11520 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
11530 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e  indexed", pTab->
11540 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
11550 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
11560 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  ex;.  }.#ifndef 
11570 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
11580 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
11590 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
115a0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
115b0 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e  se, "views may n
115c0 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
115d0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
115e0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
115f0 0a 23 65 6e 64 69 66 0a 20 20 69 73 54 65 6d 70  .#endif.  isTemp
11600 20 3d 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 3b   = pTab->iDb==1;
11610 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
11620 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
11630 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75   index.  Make su
11640 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  re there is not 
11650 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a  already another.
11660 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
11670 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ble with the sam
11680 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20  e name.  .  **. 
11690 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20   ** Exception:  
116a0 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  If we are readin
116b0 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70  g the names of p
116c0 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73  ermanent indices
116d0 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73   from the.  ** s
116e0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
116f0 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65  le (because some
11700 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
11710 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d  hanged the schem
11720 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20  a) and.  ** one 
11730 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  of the index nam
11740 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68  es collides with
11750 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74   the name of a t
11760 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
11770 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68  r.  ** index, th
11780 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  en we will conti
11790 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74  nue to process t
117a0 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  his index..  **.
117b0 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30    ** If pName==0
117c0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
117d0 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69  e are.  ** deali
117e0 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72  ng with a primar
117f0 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20  y key or UNIQUE 
11800 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20  constraint.  We 
11810 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f  have to invent o
11820 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65  ur.  ** own name
11830 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  ..  */.  if( pNa
11840 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
11850 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
11860 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
11870 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
11880 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
11890 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
118a0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
118b0 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e  ndex;.    if( zN
118c0 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
118d0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
118e0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
118f0 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
11900 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
11910 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
11920 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
11930 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
11940 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
11950 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
11960 20 49 6e 64 65 78 20 2a 70 49 53 61 6d 65 4e 61   Index *pISameNa
11970 6d 65 3b 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65  me;    /* Anothe
11980 72 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65  r index with the
11990 20 73 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   same name */.  
119a0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 53 61 6d      Table *pTSam
119b0 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74  eName;    /* A t
119c0 61 62 6c 65 20 77 69 74 68 20 73 61 6d 65 20 6e  able with same n
119d0 61 6d 65 20 61 73 20 74 68 65 20 69 6e 64 65 78  ame as the index
119e0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 53 51   */.      if( SQ
119f0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
11a00 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
11a10 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  e) ) goto exit_c
11a20 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
11a30 20 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e 61     if( (pISameNa
11a40 6d 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  me = sqlite3Find
11a50 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
11a60 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
11a70 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ame))!=0 ){.    
11a80 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11a90 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
11aa0 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78  ex %s already ex
11ab0 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ists", zName);. 
11ac0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
11ad0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
11ae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11af0 20 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73   (pTSameName = s
11b00 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
11b10 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d  db, zName, 0))!=
11b20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
11b30 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11b40 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
11b50 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e  lready a table n
11b60 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29  amed %s", zName)
11b70 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
11b80 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
11b90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11ba0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
11bb0 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20  r zBuf[30];.    
11bc0 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78  int n;.    Index
11bd0 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72   *pLoop;.    for
11be0 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e  (pLoop=pTab->pIn
11bf0 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b  dex, n=1; pLoop;
11c00 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e   pLoop=pLoop->pN
11c10 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  ext, n++){}.    
11c20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 5f 25  sprintf(zBuf,"_%
11c30 64 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65  d",n);.    zName
11c40 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
11c50 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d  3SetString(&zNam
11c60 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69  e, "sqlite_autoi
11c70 6e 64 65 78 5f 22 2c 20 70 54 61 62 2d 3e 7a 4e  ndex_", pTab->zN
11c80 61 6d 65 2c 20 7a 42 75 66 2c 20 28 63 68 61 72  ame, zBuf, (char
11c90 2a 29 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  *)0);.    if( zN
11ca0 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
11cb0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
11cc0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
11cd0 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69   for authorizati
11ce0 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  on to create an 
11cf0 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e  index..  */.#ifn
11d00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11d10 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
11d20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
11d30 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
11d40 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65  pTab->iDb].zName
11d50 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
11d60 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
11d70 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
11d80 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
11d90 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
11da0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
11db0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
11dc0 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53  .    }.    i = S
11dd0 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44  QLITE_CREATE_IND
11de0 45 58 3b 0a 20 20 20 20 69 66 28 20 69 73 54 65  EX;.    if( isTe
11df0 6d 70 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f  mp ) i = SQLITE_
11e00 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
11e10 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
11e20 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
11e30 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54  se, i, zName, pT
11e40 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  ab->zName, zDb) 
11e50 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
11e60 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
11e70 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
11e80 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74  f..  /* If pList
11e90 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ==0, it means th
11ea0 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
11eb0 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20  alled to make a 
11ec0 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79  primary.  ** key
11ed0 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74   out of the last
11ee0 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f   column added to
11ef0 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72   the table under
11f00 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20   construction.. 
11f10 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20   ** So create a 
11f20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d  fake list to sim
11f30 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f  ulate this..  */
11f40 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
11f50 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20  ){.    nullId.z 
11f60 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61  = pTab->aCol[pTa
11f70 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65  b->nCol-1].zName
11f80 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d  ;.    nullId.n =
11f90 20 73 74 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a   strlen(nullId.z
11fa0 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  );.    pList = s
11fb0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
11fc0 70 65 6e 64 28 30 2c 20 30 2c 20 26 6e 75 6c 6c  pend(0, 0, &null
11fd0 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  Id);.    if( pLi
11fe0 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  st==0 ) goto exi
11ff0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12000 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20    }..  /* .  ** 
12010 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  Allocate the ind
12020 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20  ex structure. . 
12030 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20 3d 20 73   */.  pIndex = s
12040 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
12050 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 73 74 72  eof(Index) + str
12060 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b  len(zName) + 1 +
12070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12080 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66           (sizeof
12090 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 43  (int) + sizeof(C
120a0 6f 6c 6c 53 65 71 2a 29 29 2a 70 4c 69 73 74 2d  ollSeq*))*pList-
120b0 3e 6e 45 78 70 72 20 29 3b 0a 20 20 69 66 28 20  >nExpr );.  if( 
120c0 70 49 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f  pIndex==0 ) goto
120d0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
120e0 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69  ex;.  pIndex->ai
120f0 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26  Column = (int*)&
12100 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
12110 61 43 6f 6c 6c 5b 70 4c 69 73 74 2d 3e 6e 45 78  aColl[pList->nEx
12120 70 72 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a  pr];.  pIndex->z
12130 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
12140 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
12150 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20  pList->nExpr];. 
12160 20 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d 3e   strcpy(pIndex->
12170 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  zName, zName);. 
12180 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20   pIndex->pTable 
12190 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78  = pTab;.  pIndex
121a0 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73  ->nColumn = pLis
121b0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64  t->nExpr;.  pInd
121c0 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e  ex->onError = on
121d0 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d  Error;.  pIndex-
121e0 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61  >autoIndex = pNa
121f0 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d  me==0;.  pIndex-
12200 3e 69 44 62 20 3d 20 69 44 62 3b 0a 0a 20 20 2f  >iDb = iDb;..  /
12210 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73  * Scan the names
12220 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
12230 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
12240 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20  be indexed and. 
12250 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c   ** load the col
12260 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f  umn indices into
12270 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63   the Index struc
12280 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e  ture.  Report an
12290 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61   error.  ** if a
122a0 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74  ny column is not
122b0 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66   found..  */.  f
122c0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
122d0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
122e0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
122f0 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
12300 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
12310 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61  StrICmp(pList->a
12320 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  [i].zName, pTab-
12330 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d  >aCol[j].zName)=
12340 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
12350 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61  }.    if( j>=pTa
12360 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
12370 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12380 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
12390 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e  %s has no column
123a0 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20   named %s",.    
123b0 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
123c0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
123d0 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
123e0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
123f0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
12400 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
12410 20 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c   = j;.    if( pL
12420 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  ist->a[i].pExpr 
12430 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
12440 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
12450 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20  pr->pColl );.   
12460 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e     pIndex->keyIn
12470 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 4c  fo.aColl[i] = pL
12480 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d  ist->a[i].pExpr-
12490 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73  >pColl;.    }els
124a0 65 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  e{.      pIndex-
124b0 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69  >keyInfo.aColl[i
124c0 5d 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  ] = pTab->aCol[j
124d0 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ].pColl;.    }. 
124e0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65     assert( pInde
124f0 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
12500 5b 69 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 21  [i] );.    if( !
12510 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
12520 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
12530 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50  3CheckCollSeq(pP
12540 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 6b 65  arse, pIndex->ke
12550 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20  yInfo.aColl[i]) 
12560 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
12570 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
12580 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
12590 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66    pIndex->keyInf
125a0 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 4c 69 73 74  o.nField = pList
125b0 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20  ->nExpr;..  if( 
125c0 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e  pTab==pParse->pN
125d0 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f  ewTable ){.    /
125e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
125f0 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74  as been called t
12600 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f  o create an auto
12610 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20 61  matic index as a
12620 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f  .    ** result o
12630 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  f a PRIMARY KEY 
12640 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65  or UNIQUE clause
12650 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66   on a column def
12660 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20  inition, or.    
12670 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  ** a PRIMARY KEY
12680 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
12690 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  e following the 
126a0 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
126b0 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20  ns..    ** i.e. 
126c0 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  one of:.    **. 
126d0 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42     ** CREATE TAB
126e0 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b  LE t(x PRIMARY K
126f0 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43  EY, y);.    ** C
12700 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c  REATE TABLE t(x,
12710 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29   y, UNIQUE(x, y)
12720 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
12730 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68 65   Either way, che
12740 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
12750 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68   table already h
12760 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78  as such an index
12770 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20  . If.    ** so, 
12780 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65  don't bother cre
12790 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20  ating this one. 
127a0 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65  This only applie
127b0 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f  s to.    ** auto
127c0 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65  matically create
127d0 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73  d indices. Users
127e0 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20   can do as they 
127f0 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a  wish with.    **
12800 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65   explicit indice
12810 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e  s..    */.    In
12820 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66  dex *pIdx;.    f
12830 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
12840 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
12850 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
12860 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
12870 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
12880 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
12890 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
128a0 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65  ( pIdx->autoInde
128b0 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  x );.      asser
128c0 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  t( pIndex->onErr
128d0 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a  or!=OE_None );..
128e0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
128f0 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d  nColumn!=pIndex-
12900 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  >nColumn ) conti
12910 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  nue;.      for(k
12920 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; k<pIdx->nCol
12930 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  umn; k++){.     
12940 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
12950 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78  olumn[k]!=pIndex
12960 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20  ->aiColumn[k] ) 
12970 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69  break;.        i
12980 66 28 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f  f( pIdx->keyInfo
12990 2e 61 43 6f 6c 6c 5b 6b 5d 21 3d 70 49 6e 64 65  .aColl[k]!=pInde
129a0 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
129b0 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  [k] ) break;.   
129c0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b     }.      if( k
129d0 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  ==pIdx->nColumn 
129e0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
129f0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49  Idx->onError!=pI
12a00 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b  ndex->onError ){
12a10 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
12a20 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72  is constraint cr
12a30 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69  eates the same i
12a40 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f  ndex as a previo
12a50 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  us.          ** 
12a60 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69  constraint speci
12a70 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69  fied somewhere i
12a80 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
12a90 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  LE statement..  
12aa0 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76          ** Howev
12ab0 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49  er the ON CONFLI
12ac0 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64  CT clauses are d
12ad0 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74  ifferent. If bot
12ae0 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  h this .        
12af0 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
12b00 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73  and the previous
12b10 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73   equivalent cons
12b20 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c  traint have expl
12b30 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a  icit.          *
12b40 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  * ON CONFLICT cl
12b50 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e  auses this is an
12b60 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73   error. Otherwis
12b70 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  e, use the.     
12b80 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74       ** explicit
12b90 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68  ly specified beh
12ba0 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65 20 69  aviour for the i
12bb0 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20  ndex..          
12bc0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
12bd0 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72   !(pIdx->onError
12be0 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20  ==OE_Default || 
12bf0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d  pIndex->onError=
12c00 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a  =OE_Default) ){.
12c10 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
12c20 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12c30 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
12c40 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e       "conflictin
12c50 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  g ON CONFLICT cl
12c60 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22  auses specified"
12c70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
12c80 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
12c90 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
12ca0 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  E_Default ){.   
12cb0 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f           pIdx->o
12cc0 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d  nError = pIndex-
12cd0 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  >onError;.      
12ce0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
12cf0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
12d00 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12d10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12d20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  }..  /* Link the
12d30 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63   new Index struc
12d40 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c  ture to its tabl
12d50 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68  e and to the oth
12d60 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  er.  ** in-memor
12d70 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  y database struc
12d80 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69  tures. .  */.  i
12d90 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
12da0 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
12db0 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
12dc0 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
12dd0 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62  >aDb[pIndex->iDb
12de0 5d 2e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20  ].idxHash, .    
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e00 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
12e10 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65  me, strlen(pInde
12e20 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e  x->zName)+1, pIn
12e30 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20  dex);.    if( p 
12e40 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
12e50 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f   p==pIndex );  /
12e60 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
12e70 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  ve failed */.   
12e80 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
12e90 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
12ea0 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
12eb0 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
12ec0 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20  hanges;.    if( 
12ed0 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  pTblName!=0 ){. 
12ee0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75       pIndex->tnu
12ef0 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
12f00 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tnum;.    }.  }.
12f10 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d  .  /* If the db-
12f20 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20  >init.busy is 0 
12f30 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65 20  then create the 
12f40 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20  index on disk.  
12f50 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76  This.  ** involv
12f60 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 69  es writing the i
12f70 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61  ndex into the ma
12f80 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66  ster table and f
12f90 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20  illing in the.  
12fa0 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74 68  ** index with th
12fb0 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
12fc0 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20  contents..  **. 
12fd0 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74   ** The db->init
12fe0 2e 62 75 73 79 20 69 73 20 30 20 77 68 65 6e 20  .busy is 0 when 
12ff0 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20 65  the user first e
13000 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20 49  nters a CREATE I
13010 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61  NDEX .  ** comma
13020 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75  nd.  db->init.bu
13030 73 79 20 69 73 20 31 20 77 68 65 6e 20 61 20 64  sy is 1 when a d
13040 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
13050 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41  d and .  ** CREA
13060 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
13070 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75 74  nts are read out
13080 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74   of the master t
13090 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74  able.  In.  ** t
130a0 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 74  he latter case t
130b0 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  he index already
130c0 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c   exists on disk,
130d0 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20 20   which is why.  
130e0 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  ** we don't want
130f0 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e   to recreate it.
13100 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54  .  **.  ** If pT
13110 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61  blName==0 it mea
13120 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  ns this index is
13130 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 20   generated as a 
13140 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a  primary key.  **
13150 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
13160 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54  raint of a CREAT
13170 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
13180 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61  t.  Since the ta
13190 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73  ble.  ** has jus
131a0 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  t been created, 
131b0 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  it contains no d
131c0 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ata and the inde
131d0 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  x initialization
131e0 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62  .  ** step can b
131f0 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  e skipped..  */.
13200 20 20 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 69    else if( db->i
13210 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20  nit.busy==0 ){. 
13220 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
13230 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20  char *zStmt;.   
13240 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72   int iMem = pPar
13250 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 0a 20 20 20  se->nMem++;..   
13260 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
13270 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
13280 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
13290 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
132a0 65 78 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  ex;..    /* Crea
132b0 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20  te the rootpage 
132c0 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20  for the index.  
132d0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
132e0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
132f0 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
13300 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
13310 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13320 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62  CreateIndex, iDb
13330 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
13340 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13350 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c  _MemStore, iMem,
13360 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74   0);..    /* Gat
13370 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  her the complete
13380 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
13390 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
133a0 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20  ent into.    ** 
133b0 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62  the zStmt variab
133c0 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  le.    */.    if
133d0 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64  ( pStart && pEnd
133e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e   ){.      /* A n
133f0 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68 20  amed index with 
13400 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45 41  an explicit CREA
13410 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
13420 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d  nt */.      zStm
13430 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
13440 74 66 28 22 43 52 45 41 54 45 25 73 20 49 4e 44  tf("CREATE%s IND
13450 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20  EX %.*s",.      
13460 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f    onError==OE_No
13470 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51  ne ? "" : " UNIQ
13480 55 45 22 2c 0a 20 20 20 20 20 20 20 20 41 64 64  UE",.        Add
13490 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64  r(pEnd->z) - Add
134a0 72 28 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 31 2c  r(pName->z) + 1,
134b0 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e  .        pName->
134c0 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  z);.    }else{. 
134d0 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d       /* An autom
134e0 61 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74  atic index creat
134f0 65 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20  ed by a PRIMARY 
13500 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  KEY or UNIQUE co
13510 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
13520 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c    /* zStmt = sql
13530 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b  ite3MPrintf("");
13540 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   */.      zStmt 
13550 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
13560 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20  /* Add an entry 
13570 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  in sqlite_master
13580 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a   for this index.
13590 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
135a0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
135b0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22  arse, .        "
135c0 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25  INSERT INTO %Q.%
135d0 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27  s VALUES('index'
135e0 2c 25 51 2c 25 51 2c 23 30 2c 25 51 29 3b 22 2c  ,%Q,%Q,#0,%Q);",
135f0 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  .        db->aDb
13600 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
13610 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a  EMA_TABLE(iDb),.
13620 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
13630 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70  zName,.        p
13640 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
13650 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b      zStmt.    );
13660 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13670 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
13680 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   1, 0);.    sqli
13690 74 65 46 72 65 65 28 7a 53 74 6d 74 29 3b 0a 0a  teFree(zStmt);..
136a0 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20      /* Fill the 
136b0 69 6e 64 65 78 20 77 69 74 68 20 64 61 74 61 20  index with data 
136c0 61 6e 64 20 72 65 70 61 72 73 65 20 74 68 65 20  and reparse the 
136d0 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20  schema. Code an 
136e0 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a 2a  OP_Expire.    **
136f0 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61   to invalidate a
13700 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20  ll pre-compiled 
13710 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20  statements..    
13720 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e  */.    if( pTblN
13730 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ame ){.      sql
13740 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
13750 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
13760 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  iMem);.      sql
13770 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
13780 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20  (db, v, iDb);.  
13790 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
137a0 70 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63  p3(v, OP_ParseSc
137b0 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 0a 20 20  hema, iDb, 0,.  
137c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
137d0 72 69 6e 74 66 28 22 6e 61 6d 65 3d 27 25 71 27  rintf("name='%q'
137e0 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ", pIndex->zName
137f0 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a  ), P3_DYNAMIC);.
13800 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13810 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 45 78 70  eAddOp(v, OP_Exp
13820 69 72 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ire, 0, 0);.    
13830 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  }.  }..  /* When
13840 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78   adding an index
13850 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
13860 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61  indices for a ta
13870 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  ble, make.  ** s
13880 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ure all indices 
13890 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61  labeled OE_Repla
138a0 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c  ce come after al
138b0 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a  l those labeled.
138c0 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20    ** OE_Ignore. 
138d0 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
138e0 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ry for the corre
138f0 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
13900 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20  UPDATE.  ** and 
13910 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69  INSERT..  */.  i
13920 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
13930 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20   || pTblName==0 
13940 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72  ){.    if( onErr
13950 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c  or!=OE_Replace |
13960 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d  | pTab->pIndex==
13970 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54  0.         || pT
13980 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ab->pIndex->onEr
13990 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29  ror==OE_Replace)
139a0 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
139b0 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49  pNext = pTab->pI
139c0 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62  ndex;.      pTab
139d0 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
139e0 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  x;.    }else{.  
139f0 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65      Index *pOthe
13a00 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  r = pTab->pIndex
13a10 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
13a20 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20  Other->pNext && 
13a30 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f  pOther->pNext->o
13a40 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
13a50 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  ce ){.        pO
13a60 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70  ther = pOther->p
13a70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
13a80 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
13a90 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  t = pOther->pNex
13aa0 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d  t;.      pOther-
13ab0 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b  >pNext = pIndex;
13ac0 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
13ad0 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  x = 0;.  }..  /*
13ae0 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65   Clean up before
13af0 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74   exiting */.exit
13b00 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20  _create_index:. 
13b10 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
13b20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70 49 6e     freeIndex(pIn
13b30 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  dex);.  }.  sqli
13b40 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
13b50 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  e(pList);.  sqli
13b60 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
13b70 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71  (pTblName);.  sq
13b80 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
13b90 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
13ba0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13bb0 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78   will drop an ex
13bc0 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64  isting named ind
13bd0 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ex.  This routin
13be0 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  e.** implements 
13bf0 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73  the DROP INDEX s
13c00 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
13c10 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64  d sqlite3DropInd
13c20 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
13c30 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
13c40 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
13c50 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ex;.  Vdbe *v;. 
13c60 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13c70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
13c80 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
13c90 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
13ca0 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  _failed ) return
13cb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  ;.  assert( pNam
13cc0 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
13cd0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
13ce0 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
13cf0 28 70 50 61 72 73 65 29 20 29 20 72 65 74 75 72  (pParse) ) retur
13d00 6e 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  n;.  pIndex = sq
13d10 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
13d20 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  b, pName->a[0].z
13d30 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
13d40 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
13d50 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
13d60 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
13d70 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
13d80 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22   such index: %S"
13d90 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , pName, 0);.   
13da0 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
13db0 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f  hema = 1;.    go
13dc0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
13dd0 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  ex;.  }.  if( pI
13de0 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20  ndex->autoIndex 
13df0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
13e00 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
13e10 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
13e20 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20   with UNIQUE ". 
13e30 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59       "or PRIMARY
13e40 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
13e50 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  cannot be droppe
13e60 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f  d", 0);.    goto
13e70 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
13e80 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
13e90 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
13ea0 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
13eb0 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  int code = SQLIT
13ec0 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20  E_DROP_INDEX;.  
13ed0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
13ee0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a  pIndex->pTable;.
13ef0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
13f00 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49  zDb = db->aDb[pI
13f10 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65  ndex->iDb].zName
13f20 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
13f30 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
13f40 54 41 42 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44  TABLE(pIndex->iD
13f50 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  b);.    if( sqli
13f60 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
13f70 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
13f80 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
13f90 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
13fa0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
13fb0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
13fc0 49 6e 64 65 78 2d 3e 69 44 62 20 29 20 63 6f 64  Index->iDb ) cod
13fd0 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
13fe0 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
13ff0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
14000 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
14010 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  e, pIndex->zName
14020 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
14030 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
14040 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
14050 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
14060 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
14070 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
14080 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  e the index and 
14090 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
140a0 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73  table */.  v = s
140b0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
140c0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
140d0 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20  {.    int iDb = 
140e0 70 49 6e 64 65 78 2d 3e 69 44 62 3b 0a 20 20 20  pIndex->iDb;.   
140f0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
14100 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
14110 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
14120 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65  %Q.%s WHERE name
14130 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 64 62 2d  =%Q",.       db-
14140 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
14150 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
14160 62 29 2c 0a 20 20 20 20 20 20 20 70 49 6e 64 65  b),.       pInde
14170 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  x->zName.    );.
14180 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
14190 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69  eCookie(db, v, i
141a0 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79  Db);.    destroy
141b0 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
141c0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69   pIndex->tnum, i
141d0 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
141e0 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72  VdbeOp3(v, OP_Dr
141f0 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c  opIndex, iDb, 0,
14200 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
14210 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72  0);.  }..exit_dr
14220 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69  op_index:.  sqli
14230 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
14240 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pName);.}../*.*
14250 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65  * Append a new e
14260 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69  lement to the gi
14270 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65  ven IdList.  Cre
14280 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74  ate a new IdList
14290 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a   if.** need be..
142a0 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69  **.** A new IdLi
142b0 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
142c0 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f  or NULL if mallo
142d0 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64  c() fails..*/.Id
142e0 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
142f0 69 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74  istAppend(IdList
14300 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
14310 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70  pToken){.  if( p
14320 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
14330 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  List = sqliteMal
14340 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69  loc( sizeof(IdLi
14350 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
14360 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
14370 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
14380 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  Alloc = 0;.  }. 
14390 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3e   if( pList->nId>
143a0 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29  =pList->nAlloc )
143b0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
143c0 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20  ist_item *a;.   
143d0 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
143e0 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32   pList->nAlloc*2
143f0 20 2b 20 35 3b 0a 20 20 20 20 61 20 3d 20 73 71   + 5;.    a = sq
14400 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73  liteRealloc(pLis
14410 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c  t->a, pList->nAl
14420 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  loc*sizeof(pList
14430 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  ->a[0]) );.    i
14440 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( a==0 ){.     
14450 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
14460 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
14470 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
14480 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20   }.    pList->a 
14490 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  = a;.  }.  memse
144a0 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  t(&pList->a[pLis
144b0 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65  t->nId], 0, size
144c0 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
144d0 3b 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69  ;.  pList->a[pLi
144e0 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 20 3d  st->nId].zName =
144f0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
14500 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20  Token(pToken);. 
14510 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20   pList->nId++;. 
14520 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
14530 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
14540 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20   new table name 
14550 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63  to the given Src
14560 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20  List.  Create a 
14570 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a  new SrcList if.*
14580 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65  * need be.  A ne
14590 77 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74  w entry is creat
145a0 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ed in the SrcLis
145b0 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e  t even if pToken
145c0 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
145d0 41 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 73  A new SrcList is
145e0 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
145f0 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66  LL if malloc() f
14600 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ails..**.** If p
14610 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  Database is not 
14620 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  null, it means t
14630 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61  hat the table ha
14640 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a  s an optional.**
14650 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70   database name p
14660 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69  refix.  Like thi
14670 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61  s:  "database.ta
14680 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61  ble".  The pData
14690 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  base.** points t
146a0 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  o the table name
146b0 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20   and the pTable 
146c0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61  points to the da
146d0 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20  tabase name..** 
146e0 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  The SrcList.a[].
146f0 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66  zName field is f
14700 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74  illed with the t
14710 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20  able name which 
14720 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72  might.** come fr
14730 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44  om pTable (if pD
14740 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29  atabase is NULL)
14750 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61   or from pDataba
14760 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74  se.  .** SrcList
14770 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69  .a[].zDatabase i
14780 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
14790 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
147a0 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20  from pTable,.** 
147b0 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20  or with NULL if 
147c0 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73  no database is s
147d0 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
147e0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
147f0 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69  if call like thi
14800 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
14810 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
14820 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a  ppend(A,B,0);.**
14830 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20  .** Then B is a 
14840 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
14850 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
14860 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e   is unspecified.
14870 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c    If called.** l
14880 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
14890 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
148a0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42  rcListAppend(A,B
148b0 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,C);.**.** Then 
148c0 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  C is the table n
148d0 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65  ame and B is the
148e0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a   database name..
148f0 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
14900 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
14910 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c  (SrcList *pList,
14920 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
14930 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65  Token *pDatabase
14940 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  ){.  struct SrcL
14950 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
14960 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
14970 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
14980 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
14990 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a  eof(SrcList) );.
149a0 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
149b0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
149c0 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
149d0 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   1;.  }.  if( pL
149e0 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73 74  ist->nSrc>=pList
149f0 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
14a00 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
14a10 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
14a20 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65 77 20   *= 2;.    pNew 
14a30 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
14a40 70 4c 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pList,.         
14a50 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c        sizeof(*pL
14a60 69 73 74 29 20 2b 20 28 70 4c 69 73 74 2d 3e 6e  ist) + (pList->n
14a70 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28  Alloc-1)*sizeof(
14a80 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a  pList->a[0]) );.
14a90 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
14aa0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14ab0 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  SrcListDelete(pL
14ac0 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ist);.      retu
14ad0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
14ae0 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pList = pNew;.  
14af0 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69  }.  pItem = &pLi
14b00 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
14b10 63 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74  c];.  memset(pIt
14b20 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c  em, 0, sizeof(pL
14b30 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69  ist->a[0]));.  i
14b40 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
14b50 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20  pDatabase->z==0 
14b60 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  ){.    pDatabase
14b70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
14b80 70 44 61 74 61 62 61 73 65 20 26 26 20 70 54 61  pDatabase && pTa
14b90 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e  ble ){.    Token
14ba0 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62   *pTemp = pDatab
14bb0 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61  ase;.    pDataba
14bc0 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20  se = pTable;.   
14bd0 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b   pTable = pTemp;
14be0 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e  .  }.  pItem->zN
14bf0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
14c00 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c  eFromToken(pTabl
14c10 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61  e);.  pItem->zDa
14c20 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
14c30 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44  NameFromToken(pD
14c40 61 74 61 62 61 73 65 29 3b 0a 20 20 70 49 74 65  atabase);.  pIte
14c50 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  m->iCursor = -1;
14c60 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b  .  pList->nSrc++
14c70 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
14c80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67  ;.}../*.** Assig
14c90 6e 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c  n cursors to all
14ca0 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63   tables in a Src
14cb0 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  List.*/.void sql
14cc0 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
14cd0 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a  nCursors(Parse *
14ce0 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
14cf0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
14d00 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
14d10 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
14d20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
14d30 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69  =pList->a; i<pLi
14d40 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
14d50 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Item++){.    if(
14d60 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e   pItem->iCursor>
14d70 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
14d80 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  pItem->iCursor =
14d90 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
14da0 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
14db0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
14dc0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
14dd0 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
14de0 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  rse, pItem->pSel
14df0 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20  ect->pSrc);.    
14e00 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
14e10 64 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74  dd an alias to t
14e20 68 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69  he last identifi
14e30 65 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  er on the given 
14e40 69 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e  identifier list.
14e50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14e60 53 72 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28  SrcListAddAlias(
14e70 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  SrcList *pList, 
14e80 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
14e90 20 20 69 66 28 20 70 4c 69 73 74 20 26 26 20 70    if( pList && p
14ea0 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a  List->nSrc>0 ){.
14eb0 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69      pList->a[pLi
14ec0 73 74 2d 3e 6e 53 72 63 2d 31 5d 2e 7a 41 6c 69  st->nSrc-1].zAli
14ed0 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  as = sqlite3Name
14ee0 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e  FromToken(pToken
14ef0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
14f00 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74  Delete an IdList
14f10 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14f20 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64  3IdListDelete(Id
14f30 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
14f40 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
14f50 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
14f60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
14f70 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
14f80 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
14f90 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
14fa0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
14fb0 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  ee(pList->a);.  
14fc0 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
14fd0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
14fe0 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  rn the index in 
14ff0 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65  pList of the ide
15000 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49  ntifier named zI
15010 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  d.  Return -1.**
15020 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
15030 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c  /.int sqlite3IdL
15040 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20  istIndex(IdList 
15050 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68  *pList, const ch
15060 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
15070 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
15080 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ==0 ) return -1;
15090 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
150a0 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
150b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
150c0 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
150d0 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  i].zName, zName)
150e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
150f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
15100 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
15110 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69   an entire SrcLi
15120 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c  st including all
15130 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
15140 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
15150 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
15160 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
15170 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
15180 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
15190 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
151a0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
151b0 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
151c0 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
151d0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
151e0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
151f0 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e  liteFree(pItem->
15200 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
15210 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d  sqliteFree(pItem
15220 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
15230 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e  liteFree(pItem->
15240 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28  zAlias);.    if(
15250 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 26 26 20   pItem->pTab && 
15260 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 69 73 54  pItem->pTab->isT
15270 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20  ransient ){.    
15280 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
15290 61 62 6c 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70  able(0, pItem->p
152a0 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Tab);.    }.    
152b0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
152c0 65 74 65 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65  ete(pItem->pSele
152d0 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ct);.    sqlite3
152e0 45 78 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d  ExprDelete(pItem
152f0 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ->pOn);.    sqli
15300 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
15310 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a  pItem->pUsing);.
15320 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
15330 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pList);.}../*.*
15340 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61  * Begin a transa
15350 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
15360 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61  lite3BeginTransa
15370 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
15380 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a  rse, int type){.
15390 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
153a0 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
153b0 69 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  i;..  if( pParse
153c0 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
153d0 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
153e0 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
153f0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
15400 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
15410 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
15420 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
15430 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
15440 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
15450 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
15460 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29  , "BEGIN", 0, 0)
15470 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20   ) return;..  v 
15480 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
15490 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
154a0 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  !v ) return;.  i
154b0 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45  f( type!=TK_DEFE
154c0 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28  RRED ){.    for(
154d0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
154e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
154f0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
15500 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
15510 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43  i, (type==TK_EXC
15520 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20  LUSIVE)+1);.    
15530 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
15540 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
15550 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29  utoCommit, 0, 0)
15560 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
15570 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  t a transaction.
15580 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
15590 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e  ommitTransaction
155a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
155b0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
155c0 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66    Vdbe *v;..  if
155d0 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
155e0 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
155f0 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  0 || db->aDb[0].
15600 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
15610 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
15620 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
15630 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
15640 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
15650 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
15660 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
15670 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49  NSACTION, "COMMI
15680 54 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75  T", 0, 0) ) retu
15690 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  rn;..  v = sqlit
156a0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
156b0 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
156c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
156d0 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  Op(v, OP_AutoCom
156e0 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  mit, 1, 0);.  }.
156f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
15700 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  k a transaction.
15710 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
15720 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69  ollbackTransacti
15730 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
15740 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
15750 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
15760 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
15770 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
15780 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
15790 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
157a0 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
157b0 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
157c0 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
157d0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
157e0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
157f0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
15800 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c  RANSACTION, "ROL
15810 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20  LBACK", 0, 0) ) 
15820 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
15830 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
15840 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
15850 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
15860 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74  eAddOp(v, OP_Aut
15870 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a  oCommit, 1, 1);.
15880 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
15890 65 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20  e sure the TEMP 
158a0 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
158b0 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66   and available f
158c0 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a  or use.  Return.
158d0 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
158e0 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20   errors.  Leave 
158f0 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
15900 65 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  es in the pParse
15910 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
15920 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
15930 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
15940 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
15950 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
15960 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
15970 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  if( db->aDb[1].p
15980 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65  Bt==0 && !pParse
15990 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
159a0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
159b0 33 42 74 72 65 65 46 61 63 74 6f 72 79 28 64 62  3BtreeFactory(db
159c0 2c 20 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45  , 0, 0, MAX_PAGE
159d0 53 2c 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  S, &db->aDb[1].p
159e0 42 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Bt);.    if( rc!
159f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15a00 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
15a10 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
15a20 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  ble to open a te
15a30 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
15a40 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65   ".        "file
15a50 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d   for storing tem
15a60 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b  porary tables");
15a70 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
15a80 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  c = rc;.      re
15a90 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
15aa0 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
15ab0 26 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  & !db->autoCommi
15ac0 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
15ad0 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
15ae0 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31  nTrans(db->aDb[1
15af0 5d 2e 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20  ].pBt, 1);.     
15b00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15b10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
15b20 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15b30 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
15b40 20 67 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63   get a write loc
15b50 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20 20 20 20  k on ".         
15b60 20 22 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20   "the temporary 
15b70 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 29 3b  database file");
15b80 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
15b90 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
15ba0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
15bb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
15bc0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
15bd0 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
15be0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
15bf0 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
15c00 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61  a cookie and sta
15c10 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61  rt.** a read-tra
15c20 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c  nsaction for all
15c30 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
15c40 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  files..**.** It 
15c50 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  is important tha
15c60 74 20 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f  t all schema coo
15c70 6b 69 65 73 20 62 65 20 76 65 72 69 66 69 65 64  kies be verified
15c80 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64   and all.** read
15c90 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65   transactions be
15ca0 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
15cb0 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61  anything else ha
15cc0 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ppens in.** the 
15cd0 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42  VDBE program.  B
15ce0 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ut this routine 
15cf0 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66  can be called af
15d00 74 65 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a  ter much other.*
15d10 2a 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20  * code has been 
15d20 67 65 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68  generated.  So h
15d30 65 72 65 20 69 73 20 77 68 61 74 20 77 65 20 64  ere is what we d
15d40 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  o:.**.** The fir
15d50 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
15d60 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
15d70 77 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f  we code an OP_Go
15d80 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  to that.** will 
15d90 6a 75 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75  jump to a subrou
15da0 74 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20  tine at the end 
15db0 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20  of the program. 
15dc0 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f   Then we.** reco
15dd0 72 64 20 65 76 65 72 79 20 64 61 74 61 62 61 73  rd every databas
15de0 65 20 74 68 61 74 20 6e 65 65 64 73 20 69 74 73  e that needs its
15df0 20 73 63 68 65 6d 61 20 76 65 72 69 66 69 65 64   schema verified
15e00 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73   in the.** pPars
15e10 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69  e->cookieMask fi
15e20 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74  eld.  Later, aft
15e30 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64  er all other cod
15e40 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65  e has been.** ge
15e50 6e 65 72 61 74 65 64 2c 20 74 68 65 20 73 75 62  nerated, the sub
15e60 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65  routine that doe
15e70 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72  s the cookie ver
15e80 69 66 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a  ifications and.*
15e90 2a 20 73 74 61 72 74 73 20 74 68 65 20 74 72 61  * starts the tra
15ea0 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62  nsactions will b
15eb0 65 20 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20  e coded and the 
15ec0 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65  OP_Goto P2 value
15ed0 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65  .** will be made
15ee0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
15ef0 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
15f00 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66  he generation of
15f10 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76   the.** cookie v
15f20 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72  erification subr
15f30 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70  outine code happ
15f40 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69  ens in sqlite3Fi
15f50 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a  nishCoding()..**
15f60 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65  .** If iDb<0 the
15f70 6e 20 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f  n code the OP_Go
15f80 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20  to only - don't 
15f90 73 65 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69  set flag to veri
15fa0 66 79 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61  fy the.** schema
15fb0 20 6f 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65   on any database
15fc0 73 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  s.  This can be 
15fd0 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e  used to position
15fe0 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20   the OP_Goto.** 
15ff0 65 61 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64  early in the cod
16000 65 2c 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f  e, before we kno
16010 77 20 69 66 20 61 6e 79 20 64 61 74 61 62 61 73  w if any databas
16020 65 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65  e tables will be
16030 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   used..*/.void s
16040 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
16050 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
16060 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
16070 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
16080 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
16090 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  mask;..  v = sql
160a0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
160b0 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
160c0 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
160d0 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
160e0 69 66 20 74 68 65 72 65 20 77 61 73 20 61 20 70  if there was a p
160f0 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20  rior error */.  
16100 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
16110 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
16120 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a  ookieGoto==0 ){.
16130 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
16140 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33  ieGoto = sqlite3
16150 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
16160 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20  Goto, 0, 0)+1;. 
16170 20 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20   }.  if( iDb>=0 
16180 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
16190 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
161a0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
161b0 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c  b[iDb].pBt!=0 ||
161c0 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61   iDb==1 );.    a
161d0 73 73 65 72 74 28 20 69 44 62 3c 33 32 20 29 3b  ssert( iDb<32 );
161e0 0a 20 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69  .    mask = 1<<i
161f0 44 62 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61  Db;.    if( (pPa
16200 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
16210 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
16220 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
16230 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  ieMask |= mask;.
16240 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f        pParse->co
16250 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d  okieValue[iDb] =
16260 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63   db->aDb[iDb].sc
16270 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20  hema_cookie;.   
16280 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b     if( iDb==1 ){
16290 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
162a0 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
162b0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
162c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
162d0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
162e0 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65  BE code that pre
162f0 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20  pares for doing 
16300 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61  an operation tha
16310 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67  t.** might chang
16320 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  e the database..
16330 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
16340 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20  ne starts a new 
16350 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77  transaction if w
16360 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64  e are not alread
16370 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72  y within.** a tr
16380 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77  ansaction.  If w
16390 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69  e are already wi
163a0 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
163b0 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b  on, then a check
163c0 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20  point.** is set 
163d0 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d  if the setStatem
163e0 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  ent parameter is
163f0 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70   true.  A checkp
16400 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  oint should.** b
16410 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74  e set for operat
16420 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20  ions that might 
16430 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63  fail (due to a c
16440 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20  onstraint) part 
16450 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68  of.** the way th
16460 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20  rough and which 
16470 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64  will need to und
16480 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69  o some writes wi
16490 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a  thout having to.
164a0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** rollback the 
164b0 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  whole transactio
164c0 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f  n.  For operatio
164d0 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e  ns where all con
164e0 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20  straints.** can 
164f0 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72  be checked befor
16500 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72  e any changes ar
16510 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  e made to the da
16520 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65  tabase, it is ne
16530 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79  ver.** necessary
16540 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65   to undo a write
16550 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f   and the checkpo
16560 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  int should not b
16570 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  e set..**.** Onl
16580 79 20 64 61 74 61 62 61 73 65 20 69 44 62 20 61  y database iDb a
16590 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  nd the temp data
165a0 62 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72  base are made wr
165b0 69 74 61 62 6c 65 20 62 79 20 74 68 69 73 20 63  itable by this c
165c0 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d  all..** If iDb==
165d0 30 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69 6e  0, then the main
165e0 20 61 6e 64 20 74 65 6d 70 20 64 61 74 61 62 61   and temp databa
165f0 73 65 73 20 61 72 65 20 6d 61 64 65 20 77 72 69  ses are made wri
16600 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69  table.   If.** i
16610 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20  Db==1 then only 
16620 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
16630 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62  e is made writab
16640 6c 65 2e 20 20 49 66 20 69 44 62 3e 31 20 74 68  le.  If iDb>1 th
16650 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66  en the.** specif
16660 69 65 64 20 61 75 78 69 6c 69 61 72 79 20 64 61  ied auxiliary da
16670 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 74  tabase and the t
16680 65 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65  emp database are
16690 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 0a   made writable..
166a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
166b0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
166c0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
166d0 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65  , int setStateme
166e0 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  nt, int iDb){.  
166f0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
16700 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
16710 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
16720 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
16730 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
16740 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
16750 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61   pParse->writeMa
16760 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20  sk |= 1<<iDb;.  
16770 69 66 28 20 73 65 74 53 74 61 74 65 6d 65 6e 74  if( setStatement
16780 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74   && pParse->nest
16790 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ed==0 ){.    sql
167a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
167b0 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 2c 20 69   OP_Statement, i
167c0 44 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  Db, 0);.  }.  if
167d0 28 20 69 44 62 21 3d 31 20 26 26 20 70 50 61 72  ( iDb!=1 && pPar
167e0 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  se->db->aDb[1].p
167f0 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  Bt!=0 ){.    sql
16800 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
16810 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
16820 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 29  setStatement, 1)
16830 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
16840 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
16850 31 36 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75 72 6e  16./* .** Return
16860 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 73   the transient s
16870 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a  qlite3_value obj
16880 65 63 74 20 75 73 65 64 20 66 6f 72 20 65 6e 63  ect used for enc
16890 6f 64 69 6e 67 20 63 6f 6e 76 65 72 73 69 6f 6e  oding conversion
168a0 73 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 20  s.** during SQL 
168b0 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  compilation..*/.
168c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
168d0 71 6c 69 74 65 33 47 65 74 54 72 61 6e 73 69 65  qlite3GetTransie
168e0 6e 74 56 61 6c 75 65 28 73 71 6c 69 74 65 33 20  ntValue(sqlite3 
168f0 2a 64 62 29 7b 0a 20 20 69 66 28 20 21 64 62 2d  *db){.  if( !db-
16900 3e 70 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 64  >pValue ){.    d
16910 62 2d 3e 70 56 61 6c 75 65 20 3d 20 73 71 6c 69  b->pValue = sqli
16920 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a 20  te3ValueNew();. 
16930 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e   }.  return db->
16940 70 56 61 6c 75 65 3b 0a 7d 0a 23 65 6e 64 69 66  pValue;.}.#endif
16950 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
16960 20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75   see if pIndex u
16970 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  ses the collatin
16980 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
16990 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
169a0 65 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64  e if it does and
169b0 20 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65   false if it doe
169c0 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  s not..*/.#ifnde
169d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
169e0 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74  INDEX.static int
169f0 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
16a00 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 20  CollSeq *pColl, 
16a10 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a  Index *pIndex){.
16a20 20 20 69 6e 74 20 6e 20 3d 20 70 49 6e 64 65 78    int n = pIndex
16a30 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64  ->keyInfo.nField
16a40 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 70 70  ;.  CollSeq **pp
16a50 20 3d 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e   = pIndex->keyIn
16a60 66 6f 2e 61 43 6f 6c 6c 3b 0a 20 20 77 68 69 6c  fo.aColl;.  whil
16a70 65 28 20 6e 2d 2d 20 29 7b 0a 20 20 20 20 69 66  e( n-- ){.    if
16a80 28 20 2a 70 70 3d 3d 70 43 6f 6c 6c 20 29 20 72  ( *pp==pColl ) r
16a90 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 70 70 2b  eturn 1;.    pp+
16aa0 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
16ab0 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
16ac0 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c  ** Recompute all
16ad0 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62   indices of pTab
16ae0 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63 6f   that use the co
16af0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
16b00 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43   pColl..** If pC
16b10 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
16b20 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
16b30 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69  s of pTab..*/.#i
16b40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16b50 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 72  T_REINDEX.void r
16b60 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73  eindexTable(Pars
16b70 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
16b80 20 2a 70 54 61 62 2c 20 43 6f 6c 6c 53 65 71 20   *pTab, CollSeq 
16b90 2a 70 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78  *pColl){.  Index
16ba0 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
16bb0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
16bc0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
16bd0 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f  th pTab */..  fo
16be0 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70  r(pIndex=pTab->p
16bf0 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
16c00 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e  Index=pIndex->pN
16c10 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43  ext){.    if( pC
16c20 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74  oll==0 || collat
16c30 69 6f 6e 4d 61 74 63 68 28 70 43 6f 6c 6c 2c 70  ionMatch(pColl,p
16c40 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20  Index) ){.      
16c50 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
16c60 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
16c70 65 2c 20 30 2c 20 70 54 61 62 2d 3e 69 44 62 29  e, 0, pTab->iDb)
16c80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
16c90 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
16ca0 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
16cb0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
16cc0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70  if../*.** Recomp
16cd0 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
16ce0 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  of all tables in
16cf0 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77   all databases w
16d00 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69  here the.** indi
16d10 63 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  ces use the coll
16d20 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
16d30 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d  Coll.  If pColl=
16d40 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
16d50 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73  e.** all indices
16d60 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a   everywhere..*/.
16d70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16d80 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64  MIT_REINDEX.void
16d90 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
16da0 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
16db0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29   CollSeq *pColl)
16dc0 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  {.  Db *pDb;    
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16de0 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61  /* A single data
16df0 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  base */.  int iD
16e00 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
16e10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
16e20 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
16e30 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
16e40 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
16e50 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
16e60 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
16e70 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b  /.  HashElem *k;
16e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e90 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
16ea0 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44  ver tables in pD
16eb0 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  b */.  Table *pT
16ec0 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
16ed0 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e     /* A table in
16ee0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
16ef0 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70  ..  for(iDb=0, p
16f00 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c  Db=db->aDb; iDb<
16f10 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20  db->nDb; iDb++, 
16f20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  pDb++){.    if( 
16f30 70 44 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  pDb==0 ) continu
16f40 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 73  e;.      for(k=s
16f50 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
16f60 70 44 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20  pDb->tblHash);  
16f70 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e  k; k=sqliteHashN
16f80 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70  ext(k)){.      p
16f90 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71  Tab = (Table*)sq
16fa0 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b  liteHashData(k);
16fb0 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61  .      reindexTa
16fc0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
16fd0 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  , pColl);.    }.
16fe0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
16ff0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
17000 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45  e for the REINDE
17010 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
17020 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
17030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17040 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a             -- 1.
17050 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
17060 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20  X  <collation>  
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
17080 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  2.**        REIN
17090 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
170a0 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d  .?<tablename>  -
170b0 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 3.**        RE
170c0 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
170d0 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20  e>.?<indexname> 
170e0 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d   -- 4.**.** Form
170f0 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e   1 causes all in
17100 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74  dices in all att
17110 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
17120 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a  to be rebuilt..*
17130 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64  * Form 2 rebuild
17140 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
17150 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74   all databases t
17160 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65  hat use the name
17170 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66  d.** collating f
17180 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20  unction.  Forms 
17190 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20  3 and 4 rebuild 
171a0 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
171b0 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65  or all.** indice
171c0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
171d0 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  h the named tabl
171e0 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
171f0 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
17200 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  X.void sqlite3Re
17210 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  index(Parse *pPa
17220 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
17230 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  e1, Token *pName
17240 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  2){.  CollSeq *p
17250 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
17260 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
17270 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65  equence to be re
17280 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c  indexed, or NULL
17290 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
172a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172b0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74    /* Name of a t
172c0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f  able or index */
172d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
172e0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Db;            /
172f0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
17300 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c  tabase */.  Tabl
17310 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
17320 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
17330 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
17340 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  se */.  Index *p
17350 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
17360 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
17370 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
17380 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44  pTab */.  int iD
17390 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
173a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
173b0 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
173c0 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
173d0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
173e0 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
173f0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
17400 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e  /.  Token *pObjN
17410 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
17420 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
17430 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f  able or index to
17440 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f   be reindexed */
17450 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
17460 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
17470 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
17480 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
17490 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
174a0 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
174b0 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
174c0 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  ULL. */.  if( SQ
174d0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
174e0 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
174f0 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
17500 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61  ;.  }..  if( pNa
17510 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 31  me1==0 || pName1
17520 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ->z==0 ){.    re
17530 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
17540 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72  Parse, 0);.    r
17550 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  eturn;.  }else i
17560 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c 20  f( pName2==0 || 
17570 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a  pName2->z==0 ){.
17580 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
17590 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
175a0 62 2c 20 64 62 2d 3e 65 6e 63 2c 20 70 4e 61 6d  b, db->enc, pNam
175b0 65 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d 3e 6e  e1->z, pName1->n
175c0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , 0);.    if( pC
175d0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69  oll ){.      rei
175e0 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50  ndexDatabases(pP
175f0 61 72 73 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  arse, pColl);.  
17600 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
17610 7d 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  }.  }.  iDb = sq
17620 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
17630 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
17640 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61   pName2, &pObjNa
17650 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
17660 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d   ) return;.  z =
17670 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
17680 54 6f 6b 65 6e 28 70 4f 62 6a 4e 61 6d 65 29 3b  Token(pObjName);
17690 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  zDb = db->aDb
176a0 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70  [iDb].zName;.  p
176b0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
176c0 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44  dTable(db, z, zD
176d0 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29  b);.  if( pTab )
176e0 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61 62  {.    reindexTab
176f0 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
17700 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46   0);.    sqliteF
17710 72 65 65 28 7a 29 3b 0a 20 20 20 20 72 65 74 75  ree(z);.    retu
17720 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  rn;.  }.  pIndex
17730 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
17740 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  dex(db, z, zDb);
17750 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29  .  sqliteFree(z)
17760 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
17770 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
17780 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
17790 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
177a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66  ;.    sqlite3Ref
177b0 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
177c0 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
177d0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
177e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
177f0 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
17800 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20  to identify the 
17810 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69  object to be rei
17820 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64  ndexed");.}.#end
17830 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
17840 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42  TE_OMIT_ALTERTAB
17850 4c 45 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  LE./*.** Generat
17860 65 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d  e code to implem
17870 65 6e 74 20 74 68 65 20 22 41 4c 54 45 52 20 54  ent the "ALTER T
17880 41 42 4c 45 20 78 78 78 20 52 45 4e 41 4d 45 20  ABLE xxx RENAME 
17890 54 4f 20 79 79 79 22 20 0a 2a 2a 20 63 6f 6d 6d  TO yyy" .** comm
178a0 61 6e 64 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  and. .*/.void sq
178b0 6c 69 74 65 33 41 6c 74 65 72 52 65 6e 61 6d 65  lite3AlterRename
178c0 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
178d0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
178e0 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
178f0 74 65 78 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69  text. */.  SrcLi
17900 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
17910 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
17920 65 20 74 6f 20 72 65 6e 61 6d 65 2e 20 2a 2f 0a  e to rename. */.
17930 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 20    Token *pName  
17940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17950 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d  he new table nam
17960 65 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  e. */.){.  int i
17970 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
17980 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
17990 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
179a0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68  he table */.  ch
179b0 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20  ar *zDb;        
179c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
179d0 6f 66 20 64 61 74 61 62 61 73 65 20 69 44 62 20  of database iDb 
179e0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
179f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
17a00 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 72 65  * Table being re
17a10 6e 61 6d 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  named */.  char 
17a20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  *zName = 0;     
17a30 20 20 20 20 20 2f 2a 20 4e 55 4c 4c 2d 74 65 72       /* NULL-ter
17a40 6d 69 6e 61 74 65 64 20 76 65 72 73 69 6f 6e 20  minated version 
17a50 6f 66 20 70 4e 61 6d 65 20 2a 2f 20 0a 20 20 63  of pName */ .  c
17a60 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b  har *zWhere = 0;
17a70 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
17a80 65 20 63 6c 61 75 73 65 20 6f 66 20 73 63 68 65  e clause of sche
17a90 6d 61 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 72  ma elements to r
17aa0 65 70 61 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69  eparse */.  sqli
17ab0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
17ac0 2d 3e 64 62 3b 20 2f 2a 20 44 61 74 61 62 61 73  ->db; /* Databas
17ad0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
17ae0 20 20 56 64 62 65 20 2a 76 3b 0a 23 69 66 6e 64    Vdbe *v;.#ifnd
17af0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
17b00 52 49 47 47 45 52 0a 20 20 63 68 61 72 20 2a 7a  RIGGER.  char *z
17b10 54 65 6d 70 54 72 69 67 20 3d 20 30 3b 20 20 20  TempTrig = 0;   
17b20 20 20 20 2f 2a 20 57 68 65 72 65 20 63 6c 61 75     /* Where clau
17b30 73 65 20 74 6f 20 6c 6f 63 61 74 65 20 74 65 6d  se to locate tem
17b40 70 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 23 65  p triggers */.#e
17b50 6e 64 69 66 0a 20 20 0a 20 20 61 73 73 65 72 74  ndif.  .  assert
17b60 28 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 31 20  ( pSrc->nSrc==1 
17b70 29 3b 0a 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  );..  pTab = sql
17b80 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
17b90 70 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 61 5b  pParse, pSrc->a[
17ba0 30 5d 2e 7a 4e 61 6d 65 2c 20 70 53 72 63 2d 3e  0].zName, pSrc->
17bb0 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
17bc0 0a 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67  .  if( !pTab ) g
17bd0 6f 74 6f 20 65 78 69 74 5f 61 6c 74 65 72 5f 74  oto exit_alter_t
17be0 61 62 6c 65 3b 0a 20 20 69 44 62 20 3d 20 70 54  able;.  iDb = pT
17bf0 61 62 2d 3e 69 44 62 3b 0a 20 20 7a 44 62 20 3d  ab->iDb;.  zDb =
17c00 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
17c10 61 6d 65 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 61  ame;..  /* Get a
17c20 20 4e 55 4c 4c 20 74 65 72 6d 69 6e 61 74 65 64   NULL terminated
17c30 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
17c40 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  new table name. 
17c50 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  */.  zName = sql
17c60 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
17c70 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  n(pName);.  if( 
17c80 21 7a 4e 61 6d 65 20 29 20 67 6f 74 6f 20 65 78  !zName ) goto ex
17c90 69 74 5f 61 6c 74 65 72 5f 74 61 62 6c 65 3b 0a  it_alter_table;.
17ca0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
17cb0 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
17cc0 78 20 6e 61 6d 65 64 20 27 7a 4e 61 6d 65 27 20  x named 'zName' 
17cd0 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
17ce0 20 65 78 69 73 74 0a 20 20 2a 2a 20 69 6e 20 64   exist.  ** in d
17cf0 61 74 61 62 61 73 65 20 69 44 62 2e 20 49 66 20  atabase iDb. If 
17d00 73 6f 2c 20 74 68 69 73 20 69 73 20 61 6e 20 65  so, this is an e
17d10 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rror..  */.  if(
17d20 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
17d30 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  e(db, zName, zDb
17d40 29 20 7c 7c 20 73 71 6c 69 74 65 33 46 69 6e 64  ) || sqlite3Find
17d50 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
17d60 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 73 71 6c   zDb) ){.    sql
17d70 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17d80 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 74  rse, .        "t
17d90 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
17da0 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 6f 72  another table or
17db0 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 69 73   index with this
17dc0 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d   name: %s", zNam
17dd0 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
17de0 74 5f 61 6c 74 65 72 5f 74 61 62 6c 65 3b 0a 20  t_alter_table;. 
17df0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
17e00 72 65 20 69 74 20 69 73 20 6e 6f 74 20 61 20 73  re it is not a s
17e10 79 73 74 65 6d 20 74 61 62 6c 65 20 62 65 69 6e  ystem table bein
17e20 67 20 61 6c 74 65 72 65 64 2c 20 6f 72 20 61 20  g altered, or a 
17e30 72 65 73 65 72 76 65 64 20 6e 61 6d 65 0a 20 20  reserved name.  
17e40 2a 2a 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  ** that the tabl
17e50 65 20 69 73 20 62 65 69 6e 67 20 72 65 6e 61 6d  e is being renam
17e60 65 64 20 74 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  ed to..  */.  if
17e70 28 20 73 74 72 6c 65 6e 28 70 54 61 62 2d 3e 7a  ( strlen(pTab->z
17e80 4e 61 6d 65 29 3e 36 20 26 26 20 30 3d 3d 73 71  Name)>6 && 0==sq
17e90 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54  lite3StrNICmp(pT
17ea0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ab->zName, "sqli
17eb0 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20  te_", 7) ){.    
17ec0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
17ed0 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
17ee0 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 74  s may not be alt
17ef0 65 72 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  ered", pTab->zNa
17f00 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
17f10 69 74 5f 61 6c 74 65 72 5f 74 61 62 6c 65 3b 0a  it_alter_table;.
17f20 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54 45    }.  if( SQLITE
17f30 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63  _OK!=sqlite3Chec
17f40 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72  kObjectName(pPar
17f50 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  se, zName) ){.  
17f60 20 20 67 6f 74 6f 20 65 78 69 74 5f 61 6c 74 65    goto exit_alte
17f70 72 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69  r_table;.  }..#i
17f80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17f90 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
17fa0 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    /* Invoke the 
17fb0 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61  authorization ca
17fc0 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 69 66 28  llback. */.  if(
17fd0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
17fe0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
17ff0 5f 41 4c 54 45 52 5f 54 41 42 4c 45 2c 20 7a 44  _ALTER_TABLE, zD
18000 62 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  b, pTab->zName, 
18010 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  0) ){.    goto e
18020 78 69 74 5f 61 6c 74 65 72 5f 74 61 62 6c 65 3b  xit_alter_table;
18030 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
18040 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61  * Begin a transa
18050 63 74 69 6f 6e 20 61 6e 64 20 63 6f 64 65 20 74  ction and code t
18060 68 65 20 56 65 72 69 66 79 43 6f 6f 6b 69 65 20  he VerifyCookie 
18070 66 6f 72 20 64 61 74 61 62 61 73 65 20 69 44 62  for database iDb
18080 2e 20 0a 20 20 2a 2a 20 54 68 65 6e 20 6d 6f 64  . .  ** Then mod
18090 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
180a0 6f 6f 6b 69 65 20 28 73 69 6e 63 65 20 74 68 65  ookie (since the
180b0 20 41 4c 54 45 52 20 54 41 42 4c 45 20 6d 6f 64   ALTER TABLE mod
180c0 69 66 69 65 73 20 74 68 65 0a 20 20 2a 2a 20 73  ifies the.  ** s
180d0 63 68 65 6d 61 29 2e 0a 20 20 2a 2f 0a 20 20 76  chema)..  */.  v
180e0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
180f0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
18100 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74   v==0 ){.    got
18110 6f 20 65 78 69 74 5f 61 6c 74 65 72 5f 74 61 62  o exit_alter_tab
18120 6c 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  le;.  }.  sqlite
18130 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
18140 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
18150 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  iDb);.  sqlite3C
18160 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20  hangeCookie(db, 
18170 76 2c 20 69 44 62 29 3b 0a 0a 20 20 2f 2a 20 4d  v, iDb);..  /* M
18180 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74 65  odify the sqlite
18190 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f  _master table to
181a0 20 75 73 65 20 74 68 65 20 6e 65 77 20 74 61 62   use the new tab
181b0 6c 65 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 73 71  le name. */.  sq
181c0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
181d0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22  (pParse,.      "
181e0 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54  UPDATE %Q.%s SET
181f0 20 22 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   ".#ifdef SQLITE
18200 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
18210 20 20 20 20 20 20 20 20 22 73 71 6c 20 3d 20 73          "sql = s
18220 71 6c 69 74 65 5f 61 6c 74 65 72 5f 74 61 62 6c  qlite_alter_tabl
18230 65 28 73 71 6c 2c 20 25 51 29 2c 20 22 0a 23 65  e(sql, %Q), ".#e
18240 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 22 73  lse.          "s
18250 71 6c 20 3d 20 43 41 53 45 20 22 0a 20 20 20 20  ql = CASE ".    
18260 20 20 20 20 20 20 20 20 22 57 48 45 4e 20 74 79          "WHEN ty
18270 70 65 20 3d 20 27 74 72 69 67 67 65 72 27 20 54  pe = 'trigger' T
18280 48 45 4e 20 73 71 6c 69 74 65 5f 61 6c 74 65 72  HEN sqlite_alter
18290 5f 74 72 69 67 67 65 72 28 73 71 6c 2c 20 25 51  _trigger(sql, %Q
182a0 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  )".            "
182b0 45 4c 53 45 20 73 71 6c 69 74 65 5f 61 6c 74 65  ELSE sqlite_alte
182c0 72 5f 74 61 62 6c 65 28 73 71 6c 2c 20 25 51 29  r_table(sql, %Q)
182d0 20 45 4e 44 2c 20 22 0a 23 65 6e 64 69 66 0a 20   END, ".#endif. 
182e0 20 20 20 20 20 20 20 20 20 22 74 62 6c 5f 6e 61           "tbl_na
182f0 6d 65 20 3d 20 25 51 2c 20 22 0a 20 20 20 20 20  me = %Q, ".     
18300 20 20 20 20 20 22 6e 61 6d 65 20 3d 20 43 41 53       "name = CAS
18310 45 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  E ".            
18320 22 57 48 45 4e 20 74 79 70 65 3d 27 74 61 62 6c  "WHEN type='tabl
18330 65 27 20 54 48 45 4e 20 25 51 20 22 0a 20 20 20  e' THEN %Q ".   
18340 20 20 20 20 20 20 20 20 20 22 57 48 45 4e 20 6e           "WHEN n
18350 61 6d 65 20 4c 49 4b 45 20 27 73 71 6c 69 74 65  ame LIKE 'sqlite
18360 5f 61 75 74 6f 69 6e 64 65 78 25 25 27 20 41 4e  _autoindex%%' AN
18370 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20 54  D type='index' T
18380 48 45 4e 20 22 0a 20 20 20 20 20 20 20 20 20 20  HEN ".          
18390 20 20 20 20 22 27 73 71 6c 69 74 65 5f 61 75 74      "'sqlite_aut
183a0 6f 69 6e 64 65 78 5f 27 20 7c 7c 20 25 51 20 7c  oindex_' || %Q |
183b0 7c 20 73 75 62 73 74 72 28 6e 61 6d 65 2c 20 25  | substr(name, %
183c0 64 2b 31 38 2c 31 30 29 20 22 0a 20 20 20 20 20  d+18,10) ".     
183d0 20 20 20 20 20 20 20 22 45 4c 53 45 20 6e 61 6d         "ELSE nam
183e0 65 20 45 4e 44 20 22 0a 20 20 20 20 20 20 22 57  e END ".      "W
183f0 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  HERE tbl_name=%Q
18400 20 41 4e 44 20 22 0a 20 20 20 20 20 20 20 20 20   AND ".         
18410 20 22 28 74 79 70 65 3d 27 74 61 62 6c 65 27 20   "(type='table' 
18420 4f 52 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20  OR type='index' 
18430 4f 52 20 74 79 70 65 3d 27 74 72 69 67 67 65 72  OR type='trigger
18440 27 29 3b 22 2c 20 0a 20 20 20 20 20 20 7a 44 62  ');", .      zDb
18450 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
18460 44 62 29 2c 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  Db), zName, zNam
18470 65 2c 20 7a 4e 61 6d 65 2c 20 0a 23 69 66 6e 64  e, zName, .#ifnd
18480 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
18490 52 49 47 47 45 52 0a 7a 4e 61 6d 65 2c 0a 23 65  RIGGER.zName,.#e
184a0 6e 64 69 66 0a 20 20 20 20 20 20 7a 4e 61 6d 65  ndif.      zName
184b0 2c 20 73 74 72 6c 65 6e 28 70 54 61 62 2d 3e 7a  , strlen(pTab->z
184c0 4e 61 6d 65 29 2c 20 70 54 61 62 2d 3e 7a 4e 61  Name), pTab->zNa
184d0 6d 65 0a 20 20 29 3b 0a 0a 23 69 66 6e 64 65 66  me.  );..#ifndef
184e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
184f0 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20  OINCREMENT.  /* 
18500 49 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  If the sqlite_se
18510 71 75 65 6e 63 65 20 74 61 62 6c 65 20 65 78 69  quence table exi
18520 73 74 73 20 69 6e 20 74 68 69 73 20 64 61 74 61  sts in this data
18530 62 61 73 65 2c 20 74 68 65 6e 20 75 70 64 61 74  base, then updat
18540 65 20 0a 20 20 2a 2a 20 69 74 20 77 69 74 68 20  e .  ** it with 
18550 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  the new table na
18560 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  me..  */.  if( s
18570 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
18580 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75  db, "sqlite_sequ
18590 65 6e 63 65 22 2c 20 7a 44 62 29 20 29 7b 0a 20  ence", zDb) ){. 
185a0 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
185b0 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
185c0 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51        "UPDATE %Q
185d0 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  .sqlite_sequence
185e0 20 73 65 74 20 6e 61 6d 65 20 3d 20 25 51 20 57   set name = %Q W
185f0 48 45 52 45 20 6e 61 6d 65 20 3d 20 25 51 22 2c  HERE name = %Q",
18600 0a 20 20 20 20 20 20 20 20 7a 44 62 2c 20 7a 4e  .        zDb, zN
18610 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
18620 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
18630 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18640 49 54 5f 54 52 49 47 47 45 52 0a 20 20 2f 2a 20  IT_TRIGGER.  /* 
18650 49 66 20 74 68 65 72 65 20 61 72 65 20 54 45 4d  If there are TEM
18660 50 20 74 72 69 67 67 65 72 73 20 6f 6e 20 74 68  P triggers on th
18670 69 73 20 74 61 62 6c 65 2c 20 6d 6f 64 69 66 79  is table, modify
18680 20 74 68 65 20 73 71 6c 69 74 65 5f 74 65 6d 70   the sqlite_temp
18690 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62  _master.  ** tab
186a0 6c 65 2e 20 44 6f 6e 27 74 20 64 6f 20 74 68 69  le. Don't do thi
186b0 73 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 62  s if the table b
186c0 65 69 6e 67 20 41 4c 54 45 52 65 64 20 69 73 20  eing ALTERed is 
186d0 69 74 73 65 6c 66 20 6c 6f 63 61 74 65 64 20 69  itself located i
186e0 6e 0a 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 20  n.  ** the temp 
186f0 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
18700 20 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20   if( iDb!=1 ){. 
18710 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69     Trigger *pTri
18720 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 6d 70  g;.    char *tmp
18730 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 20 70   = 0;.    for( p
18740 54 72 69 67 3d 70 54 61 62 2d 3e 70 54 72 69 67  Trig=pTab->pTrig
18750 67 65 72 3b 20 70 54 72 69 67 3b 20 70 54 72 69  ger; pTrig; pTri
18760 67 3d 70 54 72 69 67 2d 3e 70 4e 65 78 74 20 29  g=pTrig->pNext )
18770 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 72 69  {.      if( pTri
18780 67 2d 3e 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  g->iDb==1 ){.   
18790 20 20 20 20 20 69 66 28 20 21 7a 54 65 6d 70 54       if( !zTempT
187a0 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rig ){.         
187b0 20 7a 54 65 6d 70 54 72 69 67 20 3d 20 0a 20 20   zTempTrig = .  
187c0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
187d0 74 65 33 4d 50 72 69 6e 74 66 28 22 74 79 70 65  te3MPrintf("type
187e0 20 3d 20 27 74 72 69 67 67 65 72 27 20 41 4e 44   = 'trigger' AND
187f0 20 28 6e 61 6d 65 3d 25 51 22 2c 20 70 54 72 69   (name=%Q", pTri
18800 67 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  g->name);.      
18810 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18820 20 20 20 74 6d 70 20 3d 20 7a 54 65 6d 70 54 72     tmp = zTempTr
18830 69 67 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  ig;.          zT
18840 65 6d 70 54 72 69 67 20 3d 20 73 71 6c 69 74 65  empTrig = sqlite
18850 33 4d 50 72 69 6e 74 66 28 22 25 73 20 4f 52 20  3MPrintf("%s OR 
18860 6e 61 6d 65 3d 25 51 22 2c 20 7a 54 65 6d 70 54  name=%Q", zTempT
18870 72 69 67 2c 20 70 54 72 69 67 2d 3e 6e 61 6d 65  rig, pTrig->name
18880 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
18890 69 74 65 46 72 65 65 28 74 6d 70 29 3b 0a 20 20  iteFree(tmp);.  
188a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
188b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 54      }.    if( zT
188c0 65 6d 70 54 72 69 67 20 29 7b 0a 20 20 20 20 20  empTrig ){.     
188d0 20 74 6d 70 20 3d 20 7a 54 65 6d 70 54 72 69 67   tmp = zTempTrig
188e0 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 54 72 69  ;.      zTempTri
188f0 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
18900 74 66 28 22 25 73 29 22 2c 20 7a 54 65 6d 70 54  tf("%s)", zTempT
18910 72 69 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rig);.      sqli
18920 74 65 46 72 65 65 28 74 6d 70 29 3b 0a 20 20 20  teFree(tmp);.   
18930 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
18940 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
18950 20 20 20 20 20 20 20 20 20 22 55 50 44 41 54 45           "UPDATE
18960 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
18970 74 65 72 20 53 45 54 20 22 0a 20 20 20 20 20 20  ter SET ".      
18980 20 20 20 20 20 20 20 20 22 73 71 6c 20 3d 20 73          "sql = s
18990 71 6c 69 74 65 5f 61 6c 74 65 72 5f 74 72 69 67  qlite_alter_trig
189a0 67 65 72 28 73 71 6c 2c 20 25 51 29 2c 20 22 0a  ger(sql, %Q), ".
189b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74                "t
189c0 62 6c 5f 6e 61 6d 65 20 3d 20 25 51 20 22 0a 20  bl_name = %Q ". 
189d0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 57 48               "WH
189e0 45 52 45 20 25 73 3b 22 2c 20 7a 4e 61 6d 65 2c  ERE %s;", zName,
189f0 20 7a 4e 61 6d 65 2c 20 7a 54 65 6d 70 54 72 69   zName, zTempTri
18a00 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  g);.    }.  }.#e
18a10 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20  ndif..  /* Drop 
18a20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  the elements of 
18a30 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 63  the in-memory sc
18a40 68 65 6d 61 20 74 68 61 74 20 72 65 66 65 72 65  hema that refere
18a50 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 0a 20  d to the table. 
18a60 20 2a 2a 20 72 65 6e 61 6d 65 64 20 61 6e 64 20   ** renamed and 
18a70 6c 6f 61 64 20 74 68 65 20 6e 65 77 20 76 65 72  load the new ver
18a80 73 69 6f 6e 73 20 66 72 6f 6d 20 74 68 65 20 64  sions from the d
18a90 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
18aa0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
18ab0 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
18ac0 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
18ad0 45 52 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a  ER.    Trigger *
18ae0 70 54 72 69 67 3b 0a 20 20 20 20 66 6f 72 28 20  pTrig;.    for( 
18af0 70 54 72 69 67 3d 70 54 61 62 2d 3e 70 54 72 69  pTrig=pTab->pTri
18b00 67 67 65 72 3b 20 70 54 72 69 67 3b 20 70 54 72  gger; pTrig; pTr
18b10 69 67 3d 70 54 72 69 67 2d 3e 70 4e 65 78 74 20  ig=pTrig->pNext 
18b20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
18b30 20 70 54 72 69 67 2d 3e 69 44 62 3d 3d 69 44 62   pTrig->iDb==iDb
18b40 20 7c 7c 20 70 54 72 69 67 2d 3e 69 44 62 3d 3d   || pTrig->iDb==
18b50 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
18b60 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
18b70 44 72 6f 70 54 72 69 67 67 65 72 2c 20 70 54 72  DropTrigger, pTr
18b80 69 67 2d 3e 69 44 62 2c 20 30 2c 20 70 54 72 69  ig->iDb, 0, pTri
18b90 67 2d 3e 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  g->name, 0);.   
18ba0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71   }.#endif.    sq
18bb0 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
18bc0 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44  OP_DropTable, iD
18bd0 62 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  b, 0, pTab->zNam
18be0 65 2c 20 30 29 3b 0a 20 20 20 20 7a 57 68 65 72  e, 0);.    zWher
18bf0 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
18c00 74 66 28 22 74 62 6c 5f 6e 61 6d 65 3d 25 51 22  tf("tbl_name=%Q"
18c10 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  , zName);.    sq
18c20 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
18c30 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20  OP_ParseSchema, 
18c40 69 44 62 2c 20 30 2c 20 7a 57 68 65 72 65 2c 20  iDb, 0, zWhere, 
18c50 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 23 69 66  P3_DYNAMIC);.#if
18c60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18c70 5f 54 52 49 47 47 45 52 0a 20 20 20 20 69 66 28  _TRIGGER.    if(
18c80 20 7a 54 65 6d 70 54 72 69 67 20 29 7b 0a 20 20   zTempTrig ){.  
18c90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
18ca0 70 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63  p3(v, OP_ParseSc
18cb0 68 65 6d 61 2c 20 31 2c 20 30 2c 20 7a 54 65 6d  hema, 1, 0, zTem
18cc0 70 54 72 69 67 2c 20 50 33 5f 44 59 4e 41 4d 49  pTrig, P3_DYNAMI
18cd0 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  C);.    }.  }els
18ce0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  e{.    sqliteFre
18cf0 65 28 7a 54 65 6d 70 54 72 69 67 29 3b 0a 23 65  e(zTempTrig);.#e
18d00 6e 64 69 66 0a 20 20 7d 0a 0a 65 78 69 74 5f 61  ndif.  }..exit_a
18d10 6c 74 65 72 5f 74 61 62 6c 65 3a 0a 20 20 73 71  lter_table:.  sq
18d20 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
18d30 74 65 28 70 53 72 63 29 3b 0a 20 20 73 71 6c 69  te(pSrc);.  sqli
18d40 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 7d  teFree(zName);.}
18d50 0a 23 65 6e 64 69 66 0a                          .#endif.