/ Hex Artifact Content
Login

Artifact 7db7f593093caeb223c849a0fd7ca428dcda631e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 0a 2a 2a    ROLLBACK.**.**
02d0: 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20   $Id: build.c,v 
02e0: 31 2e 33 31 31 20 32 30 30 35 2f 30 32 2f 31 35  1.311 2005/02/15
02f0: 20 32 30 3a 34 37 3a 35 37 20 64 72 68 20 45 78   20:47:57 drh Ex
0300: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0310: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0320: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
0330: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
0340: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
0350: 68 65 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74  hen a new SQL st
0360: 61 74 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e  atement is begin
0370: 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61  ning to.** be pa
0380: 72 73 65 64 2e 20 20 49 6e 69 74 69 61 6c 69 7a  rsed.  Initializ
0390: 65 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  e the pParse str
03a0: 75 63 74 75 72 65 20 61 73 20 6e 65 65 64 65 64  ucture as needed
03b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
03c0: 33 42 65 67 69 6e 50 61 72 73 65 28 50 61 72 73  3BeginParse(Pars
03d0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65  e *pParse, int e
03e0: 78 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 70  xplainFlag){.  p
03f0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d  Parse->explain =
0400: 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a 20 20   explainFlag;.  
0410: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
0420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
0430: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
0440: 64 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65  d after a single
0450: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68   SQL statement h
0460: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65  as been.** parse
0470: 64 20 61 6e 64 20 61 20 56 44 42 45 20 70 72 6f  d and a VDBE pro
0480: 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20  gram to execute 
0490: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20 68  that statement h
04a0: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65 70 61  as been.** prepa
04b0: 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  red.  This routi
04c0: 6e 65 20 70 75 74 73 20 74 68 65 20 66 69 6e 69  ne puts the fini
04d0: 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20 6f 6e  shing touches on
04e0: 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f   the.** VDBE pro
04f0: 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74 73 20  gram and resets 
0500: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
0510: 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e 65 78  ture for the nex
0520: 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a  t.** parse..**.*
0530: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61  * Note that if a
0540: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
0550: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
0560: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e  e case that.** n
0570: 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20  o VDBE code was 
0580: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f  generated..*/.vo
0590: 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  id sqlite3Finish
05a0: 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a 70 50  Coding(Parse *pP
05b0: 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
05c0: 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
05d0: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ..  if( sqlite3_
05e0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
05f0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
0600: 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20 72  arse->nested ) r
0610: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50  eturn;.  if( !pP
0620: 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20  arse->pVdbe ){. 
0630: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72     if( pParse->r
0640: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
0650: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
0660: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
0670: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
0680: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
0690: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  n;.  }..  /* Beg
06a0: 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67  in by generating
06b0: 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f   some terminatio
06c0: 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e  n code at the en
06d0: 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64  d of the.  ** vd
06e0: 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a  be program.  */.
06f0: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
0700: 62 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  b;.  v = sqlite3
0710: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
0720: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
0730: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0740: 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 30 2c 20  (v, OP_Halt, 0, 
0750: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  0);..    /* The 
0760: 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63 6f 6e 74  cookie mask cont
0770: 61 69 6e 73 20 6f 6e 65 20 62 69 74 20 66 6f 72  ains one bit for
0780: 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
0790: 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a  ile open..    **
07a0: 20 28 42 69 74 20 30 20 69 73 20 66 6f 72 20 6d   (Bit 0 is for m
07b0: 61 69 6e 2c 20 62 69 74 20 31 20 69 73 20 66 6f  ain, bit 1 is fo
07c0: 72 20 74 65 6d 70 2c 20 61 6e 64 20 73 6f 20 66  r temp, and so f
07d0: 6f 72 74 68 2e 29 20 20 42 69 74 73 20 61 72 65  orth.)  Bits are
07e0: 0a 20 20 20 20 2a 2a 20 73 65 74 20 66 6f 72 20  .    ** set for 
07f0: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 74 68  each database th
0800: 61 74 20 69 73 20 75 73 65 64 2e 20 20 47 65 6e  at is used.  Gen
0810: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 74  erate code to st
0820: 61 72 74 20 61 0a 20 20 20 20 2a 2a 20 74 72 61  art a.    ** tra
0830: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65 61 63 68  nsaction on each
0840: 20 75 73 65 64 20 64 61 74 61 62 61 73 65 20 61   used database a
0850: 6e 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 65  nd to verify the
0860: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 20   schema cookie. 
0870: 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68 20 75 73     ** on each us
0880: 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  ed database..   
0890: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72   */.    if( pPar
08a0: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3e 30  se->cookieGoto>0
08b0: 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20 6d 61   ){.      u32 ma
08c0: 73 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 44  sk;.      int iD
08d0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
08e0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
08f0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
0900: 74 6f 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62  to-1, sqlite3Vdb
0910: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
0920: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d  ;.      for(iDb=
0930: 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64  0, mask=1; iDb<d
0940: 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31  b->nDb; mask<<=1
0950: 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20  , iDb++){.      
0960: 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50    if( (mask & pP
0970: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
0980: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
0990: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
09a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
09b0: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62  Transaction, iDb
09c0: 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65  , (mask & pParse
09d0: 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29  ->writeMask)!=0)
09e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
09f0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
0a00: 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69  _VerifyCookie, i
0a10: 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  Db, pParse->cook
0a20: 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b 0a 20  ieValue[iDb]);. 
0a30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
0a40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
0a50: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61   OP_Goto, 0, pPa
0a60: 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29  rse->cookieGoto)
0a70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
0a80: 41 64 64 20 61 20 4e 6f 2d 6f 70 20 74 68 61 74  Add a No-op that
0a90: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f   contains the co
0aa0: 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
0ab0: 68 65 20 63 6f 6d 70 69 6c 65 64 20 53 51 4c 0a  he compiled SQL.
0ac0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
0ad0: 20 61 73 20 69 74 73 20 50 33 20 61 72 67 75 6d   as its P3 argum
0ae0: 65 6e 74 2e 20 20 54 68 69 73 20 64 6f 65 73 20  ent.  This does 
0af0: 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 66  not change the f
0b00: 75 6e 63 74 69 6f 6e 61 6c 69 74 79 0a 20 20 20  unctionality.   
0b10: 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 6f 67 72   ** of the progr
0b20: 61 6d 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  am. .    **.    
0b30: 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20  ** This is used 
0b40: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c  to implement sql
0b50: 69 74 65 33 5f 74 72 61 63 65 28 29 2e 0a 20 20  ite3_trace()..  
0b60: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
0b70: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  VdbeOp3(v, OP_No
0b80: 6f 70 2c 20 30 2c 20 30 2c 20 70 50 61 72 73 65  op, 0, 0, pParse
0b90: 2d 3e 7a 53 71 6c 2c 20 70 50 61 72 73 65 2d 3e  ->zSql, pParse->
0ba0: 7a 54 61 69 6c 2d 70 50 61 72 73 65 2d 3e 7a 53  zTail-pParse->zS
0bb0: 71 6c 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  ql);.  }...  /* 
0bc0: 47 65 74 20 74 68 65 20 56 44 42 45 20 70 72 6f  Get the VDBE pro
0bd0: 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65  gram ready for e
0be0: 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20  xecution.  */.  
0bf0: 69 66 28 20 76 20 26 26 20 70 50 61 72 73 65 2d  if( v && pParse-
0c00: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
0c10: 46 49 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64  FILE *trace = (d
0c20: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
0c30: 45 5f 56 64 62 65 54 72 61 63 65 29 21 3d 30 20  E_VdbeTrace)!=0 
0c40: 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20  ? stdout : 0;.  
0c50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61    sqlite3VdbeTra
0c60: 63 65 28 76 2c 20 74 72 61 63 65 29 3b 0a 20 20  ce(v, trace);.  
0c70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b    sqlite3VdbeMak
0c80: 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73 65  eReady(v, pParse
0c90: 2d 3e 6e 56 61 72 2c 20 70 50 61 72 73 65 2d 3e  ->nVar, pParse->
0ca0: 6e 4d 65 6d 2b 33 2c 0a 20 20 20 20 20 20 20 20  nMem+3,.        
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cc0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 33 2c   pParse->nTab+3,
0cd0: 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 44 65 70   pParse->nMaxDep
0ce0: 74 68 2b 31 2c 20 70 50 61 72 73 65 2d 3e 65 78  th+1, pParse->ex
0cf0: 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50 61 72  plain);.    pPar
0d00: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
0d10: 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65  DONE;.    pParse
0d20: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
0d30: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
0d40: 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54  Parse->rc==SQLIT
0d50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 72  E_OK ){.    pPar
0d60: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
0d70: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61  ERROR;.  }.  pPa
0d80: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20  rse->nTab = 0;. 
0d90: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
0da0: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65  0;.  pParse->nSe
0db0: 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  t = 0;.  pParse-
0dc0: 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50 61  >nVar = 0;.  pPa
0dd0: 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
0de0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  = 0;.  pParse->c
0df0: 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d  ookieGoto = 0;.}
0e00: 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20  ../*.** Run the 
0e10: 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20  parser and code 
0e20: 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73  generator recurs
0e30: 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74  ively in order t
0e40: 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f  o generate.** co
0e50: 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73  de for the SQL s
0e60: 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f  tatement given o
0e70: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
0e80: 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78  he pParse contex
0e90: 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  t.** currently u
0ea0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
0eb0: 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72  n.  When the par
0ec0: 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72  ser is run recur
0ed0: 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77  sively.** this w
0ee0: 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50  ay, the final OP
0ef0: 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70  _Halt is not app
0f00: 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20  ended and other 
0f10: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a  initialization.*
0f20: 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69  * and finalizati
0f30: 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69  on steps are omi
0f40: 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f  tted because tho
0f50: 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20  se are handling 
0f60: 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d  by the.** outerm
0f70: 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a  ost parser..**.*
0f80: 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67  * Not everything
0f90: 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54   is nestable.  T
0fa0: 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20  his facility is 
0fb0: 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d  designed to perm
0fc0: 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50  it.** INSERT, UP
0fd0: 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45  DATE, and DELETE
0fe0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69   operations agai
0ff0: 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  nst SQLITE_MASTE
1000: 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20  R.  Use.** care 
1010: 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f  if you decide to
1020: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73   try to use this
1030: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d   routine for som
1040: 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73  e other purposes
1050: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1060: 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72  3NestedParse(Par
1070: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
1080: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
1090: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
10a0: 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71   ap;.  char *zSq
10b0: 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 20 64  l;.  int rc;.# d
10c0: 65 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28  efine SAVE_SZ  (
10d0: 73 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20  sizeof(Parse) - 
10e0: 6f 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e  offsetof(Parse,n
10f0: 56 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76  Var)).  char sav
1100: 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a  eBuf[SAVE_SZ];..
1110: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1120: 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  rr ) return;.  a
1130: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
1140: 65 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20  ested<10 );  /* 
1150: 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f  Nesting should o
1160: 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65  nly be of limite
1170: 64 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f  d depth */.  va_
1180: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
1190: 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  t);.  zSql = sql
11a0: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f  ite3VMPrintf(zFo
11b0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
11c0: 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a  end(ap);.  if( z
11d0: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Sql==0 ){.    re
11e0: 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c  turn;   /* A mal
11f0: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
1200: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50  iled */.  }.  pP
1210: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a  arse->nested++;.
1220: 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66    memcpy(saveBuf
1230: 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  , &pParse->nVar,
1240: 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d   SAVE_SZ);.  mem
1250: 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56 61  set(&pParse->nVa
1260: 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  r, 0, SAVE_SZ);.
1270: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 75    rc = sqlite3Ru
1280: 6e 50 61 72 73 65 72 28 70 50 61 72 73 65 2c 20  nParser(pParse, 
1290: 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 73 71 6c 69  zSql, 0);.  sqli
12a0: 74 65 46 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  teFree(zSql);.  
12b0: 6d 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e  memcpy(&pParse->
12c0: 6e 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53  nVar, saveBuf, S
12d0: 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73  AVE_SZ);.  pPars
12e0: 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a  e->nested--;.}..
12f0: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
1300: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
1310: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
1320: 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  bes a particular
1330: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62   database.** tab
1340: 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  le given the nam
1350: 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  e of that table 
1360: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
1370: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1380: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
1390: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
13a0: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
13b0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
13c0: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
13d0: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
13e0: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
13f0: 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  d for the table 
1400: 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  and the.** first
1410: 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20   matching table 
1420: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
1430: 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64  o checking for d
1440: 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a  uplicate table.*
1450: 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  * names is done.
1460: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
1470: 64 65 72 20 69 73 20 54 45 4d 50 20 66 69 72 73  der is TEMP firs
1480: 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68  t, then MAIN, th
1490: 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69  en any.** auxili
14a0: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
14b0: 64 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54  ded using the AT
14c0: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  TACH command..**
14d0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
14e0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
14f0: 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  )..*/.Table *sql
1500: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71  ite3FindTable(sq
1510: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
1520: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
1530: 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62  nst char *zDatab
1540: 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ase){.  Table *p
1550: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
1560: 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d   assert( zName!=
1570: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
1580: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1590: 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 20  TE_Initialized) 
15a0: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
15b0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
15c0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
15d0: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
15e0: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f  ) ? i^1 : i;   /
15f0: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
1600: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
1610: 20 69 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d   if( zDatabase!=
1620: 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
1630: 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64  Cmp(zDatabase, d
1640: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29  b->aDb[j].zName)
1650: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1660: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
1670: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d  Find(&db->aDb[j]
1680: 2e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  .tblHash, zName,
1690: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
16a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62  );.    if( p ) b
16b0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
16c0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn p;.}../*.** L
16d0: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
16e0: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
16f0: 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70  at describes a p
1700: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
1710: 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65  se.** table give
1720: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
1730: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
1740: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
1750: 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  me of the.** dat
1760: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
1770: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
1780: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
1790: 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61  found.  Also lea
17a0: 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d  ve an.** error m
17b0: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
17c0: 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
17d0: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
17e0: 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
17f0: 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33  tine and sqlite3
1800: 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73 20 74  FindTable() is t
1810: 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hat this.** rout
1820: 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72  ine leaves an er
1830: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
1840: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77  Parse->zErrMsg w
1850: 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46  here.** sqlite3F
1860: 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20  indTable() does 
1870: 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  not..*/.Table *s
1880: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
1890: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
18a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
18b0: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
18c0: 7a 44 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  zDbase){.  Table
18d0: 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20   *p;..  /* Read 
18e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
18f0: 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ema. If an error
1900: 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
1910: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
1920: 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e    ** and code in
1930: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
1940: 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66  rn NULL. */.  if
1950: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
1960: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
1970: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
1980: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70  turn 0;.  }..  p
1990: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
19a0: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
19b0: 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a  zName, zDbase);.
19c0: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
19d0: 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a    if( zDbase ){.
19e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
19f0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
1a00: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
1a10: 2e 25 73 22 2c 20 7a 44 62 61 73 65 2c 20 7a 4e  .%s", zDbase, zN
1a20: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ame);.    }else 
1a30: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
1a40: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
1a50: 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b   zName, 0)!=0 ){
1a60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1a70: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1a80: 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 69 73 20  table \"%s\" is 
1a90: 6e 6f 74 20 69 6e 20 64 61 74 61 62 61 73 65 20  not in database 
1aa0: 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20  \"%s\"",.       
1ab0: 20 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29    zName, zDbase)
1ac0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ad0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1ae0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
1af0: 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
1b00: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
1b10: 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
1b20: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20  chema = 1;.  }. 
1b30: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1b40: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
1b50: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
1b60: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
1b70: 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c  s .** a particul
1b80: 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74  ar index given t
1b90: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
1ba0: 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65  index.** and the
1bb0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
1bc0: 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61  abase that conta
1bd0: 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ins the index..*
1be0: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
1bf0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
1c00: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
1c10: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
1c20: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
1c30: 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  for the.** table
1c40: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d   and the first m
1c50: 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73  atching index is
1c60: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
1c70: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20  checking.** for 
1c80: 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20  duplicate index 
1c90: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
1ca0: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
1cb0: 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72  r is.** TEMP fir
1cc0: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
1cd0: 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72  hen any auxiliar
1ce0: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
1cf0: 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41  d.** using the A
1d00: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
1d10: 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
1d20: 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65  FindIndex(sqlite
1d30: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1d40: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
1d50: 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e  char *zDb){.  In
1d60: 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e  dex *p = 0;.  in
1d70: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 28  t i;.  assert( (
1d80: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1d90: 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 20  TE_Initialized) 
1da0: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
1db0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
1dc0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
1dd0: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
1de0: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a  ) ? i^1 : i;  /*
1df0: 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66   Search TEMP bef
1e00: 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20  ore MAIN */.    
1e10: 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74  if( zDb && sqlit
1e20: 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64  e3StrICmp(zDb, d
1e30: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29  b->aDb[j].zName)
1e40: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e50: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
1e60: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d  Find(&db->aDb[j]
1e70: 2e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  .idxHash, zName,
1e80: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
1e90: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62  );.    if( p ) b
1ea0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
1eb0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn p;.}../*.** R
1ec0: 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72  eclaim the memor
1ed0: 79 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64  y used by an ind
1ee0: 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ex.*/.static voi
1ef0: 64 20 66 72 65 65 49 6e 64 65 78 28 49 6e 64 65  d freeIndex(Inde
1f00: 78 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 46  x *p){.  sqliteF
1f10: 72 65 65 28 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b  ree(p->zColAff);
1f20: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29  .  sqliteFree(p)
1f30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
1f40: 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65  e the given inde
1f50: 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  x from the index
1f60: 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64   hash table, and
1f70: 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d   free.** its mem
1f80: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a  ory structures..
1f90: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  **.** The index 
1fa0: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
1fb0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
1fc0: 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20  h tables but.** 
1fd0: 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b  it is not unlink
1fe0: 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c  ed from the Tabl
1ff0: 65 20 74 68 61 74 20 69 74 20 69 6e 64 65 78 65  e that it indexe
2000: 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20  s..** Unlinking 
2010: 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d  from the Table m
2020: 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74  ust be done by t
2030: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2040: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
2050: 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65  oid sqliteDelete
2060: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
2070: 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  b, Index *p){.  
2080: 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20 20  Index *pOld;..  
2090: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 26 26  assert( db!=0 &&
20a0: 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a   p->zName!=0 );.
20b0: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
20c0: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
20d0: 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48  aDb[p->iDb].idxH
20e0: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20  ash, p->zName,. 
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2100: 20 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e 28           strlen(
2110: 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b  p->zName)+1, 0);
2120: 0a 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 26  .  if( pOld!=0 &
2130: 26 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20  & pOld!=p ){.   
2140: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
2150: 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69  rt(&db->aDb[p->i
2160: 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 4f 6c  Db].idxHash, pOl
2170: 64 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  d->zName,.      
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2190: 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d  trlen(pOld->zNam
21a0: 65 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d  e)+1, pOld);.  }
21b0: 0a 20 20 66 72 65 65 49 6e 64 65 78 28 70 29 3b  .  freeIndex(p);
21c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
21d0: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
21e0: 20 66 72 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c   from its table,
21f0: 20 74 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20   then remove.** 
2200: 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  the index from t
2210: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
2220: 62 6c 65 20 61 6e 64 20 66 72 65 65 20 69 74 73  ble and free its
2230: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63   memory.** struc
2240: 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tures..*/.void s
2250: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
2260: 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74  eleteIndex(sqlit
2270: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
2280: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
2290: 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20  xName){.  Index 
22a0: 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c  *pIndex;.  int l
22b0: 65 6e 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72  en;..  len = str
22c0: 6c 65 6e 28 7a 49 64 78 4e 61 6d 65 29 3b 0a 20  len(zIdxName);. 
22d0: 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
22e0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
22f0: 3e 61 44 62 5b 69 44 62 5d 2e 69 64 78 48 61 73  >aDb[iDb].idxHas
2300: 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e  h, zIdxName, len
2310: 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 49  +1, 0);.  if( pI
2320: 6e 64 65 78 20 29 7b 0a 20 20 20 20 69 66 28 20  ndex ){.    if( 
2330: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
2340: 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29  pIndex==pIndex )
2350: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
2360: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
2370: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
2380: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2390: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20   Index *p;.     
23a0: 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70   for(p=pIndex->p
23b0: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
23c0: 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49   && p->pNext!=pI
23d0: 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  ndex; p=p->pNext
23e0: 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20  ){}.      if( p 
23f0: 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  && p->pNext==pIn
2400: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  dex ){.        p
2410: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
2420: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
2430: 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49  .    }.    freeI
2440: 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
2450: 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  }.  db->flags |=
2460: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
2470: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
2480: 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61  Erase all schema
2490: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
24a0: 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  m the in-memory 
24b0: 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a  hash tables of.*
24c0: 2a 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  * a single datab
24d0: 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ase.  This routi
24e0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
24f0: 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a  reclaim memory.*
2500: 2a 20 62 65 66 6f 72 65 20 74 68 65 20 64 61 74  * before the dat
2510: 61 62 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49  abase closes.  I
2520: 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64  t is also called
2530: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
2540: 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77  ck.** if there w
2550: 65 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ere schema chang
2560: 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72  es during the tr
2570: 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20  ansaction or if 
2580: 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b  a.** schema-cook
2590: 69 65 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75  ie mismatch occu
25a0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  rs..**.** If iDb
25b0: 3c 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20 74  <=0 then reset t
25c0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
25d0: 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c  ma tables for al
25e0: 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  l database.** fi
25f0: 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20  les.  If iDb>=2 
2600: 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69  then reset the i
2610: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66  nternal schema f
2620: 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73  or only the.** s
2630: 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63  ingle file indic
2640: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
2650: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
2660: 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  alSchema(sqlite3
2670: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
2680: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
2690: 6d 3b 0a 20 20 48 61 73 68 20 74 65 6d 70 31 3b  m;.  Hash temp1;
26a0: 0a 20 20 48 61 73 68 20 74 65 6d 70 32 3b 0a 20  .  Hash temp2;. 
26b0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73   int i, j;..  as
26c0: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
26d0: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
26e0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
26f0: 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65  QLITE_Initialize
2700: 64 3b 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20  d;.  for(i=iDb; 
2710: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
2720: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
2730: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
2740: 74 65 6d 70 31 20 3d 20 70 44 62 2d 3e 74 62 6c  temp1 = pDb->tbl
2750: 48 61 73 68 3b 0a 20 20 20 20 74 65 6d 70 32 20  Hash;.    temp2 
2760: 3d 20 70 44 62 2d 3e 74 72 69 67 48 61 73 68 3b  = pDb->trigHash;
2770: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
2780: 49 6e 69 74 28 26 70 44 62 2d 3e 74 72 69 67 48  Init(&pDb->trigH
2790: 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48  ash, SQLITE_HASH
27a0: 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20  _STRING, 0);.   
27b0: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
27c0: 72 28 26 70 44 62 2d 3e 61 46 4b 65 79 29 3b 0a  r(&pDb->aFKey);.
27d0: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43      sqlite3HashC
27e0: 6c 65 61 72 28 26 70 44 62 2d 3e 69 64 78 48 61  lear(&pDb->idxHa
27f0: 73 68 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c  sh);.    for(pEl
2800: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
2810: 73 74 28 26 74 65 6d 70 32 29 3b 20 70 45 6c 65  st(&temp2); pEle
2820: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
2830: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
2840: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
2850: 6c 65 74 65 54 72 69 67 67 65 72 28 28 54 72 69  leteTrigger((Tri
2860: 67 67 65 72 2a 29 73 71 6c 69 74 65 48 61 73 68  gger*)sqliteHash
2870: 44 61 74 61 28 70 45 6c 65 6d 29 29 3b 0a 20 20  Data(pElem));.  
2880: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 48    }.    sqlite3H
2890: 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70 32 29  ashClear(&temp2)
28a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73  ;.    sqlite3Has
28b0: 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 62 6c 48  hInit(&pDb->tblH
28c0: 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48  ash, SQLITE_HASH
28d0: 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20  _STRING, 0);.   
28e0: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
28f0: 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d 70  eHashFirst(&temp
2900: 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  1); pElem; pElem
2910: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
2920: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 54  pElem)){.      T
2930: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
2940: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
2950: 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
2960: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
2970: 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20   pTab);.    }.  
2980: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
2990: 61 72 28 26 74 65 6d 70 31 29 3b 0a 20 20 20 20  ar(&temp1);.    
29a0: 70 44 62 2d 3e 70 53 65 71 54 61 62 20 3d 20 30  pDb->pSeqTab = 0
29b0: 3b 0a 20 20 20 20 44 62 43 6c 65 61 72 50 72 6f  ;.    DbClearPro
29c0: 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f  perty(db, i, DB_
29d0: 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3b 0a 20  SchemaLoaded);. 
29e0: 20 20 20 69 66 28 20 69 44 62 3e 30 20 29 20 72     if( iDb>0 ) r
29f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
2a00: 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20  ert( iDb==0 );. 
2a10: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
2a20: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
2a30: 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  ges;..  /* If on
2a40: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
2a50: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
2a60: 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62 65  ase files has be
2a70: 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20  en closed,.  ** 
2a80: 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 6e  then remove then
2a90: 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c 69   from the auxili
2aa0: 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69 73  ary database lis
2ab0: 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65 0a  t.  We take the.
2ac0: 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79    ** opportunity
2ad0: 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72 65   to do this here
2ae0: 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6a   since we have j
2af0: 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c 20  ust deleted all 
2b00: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65  of the.  ** sche
2b10: 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  ma hash tables a
2b20: 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f 20  nd therefore do 
2b30: 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b 65  not have to make
2b40: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20 2a   any changes.  *
2b50: 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73  * to any of thos
2b60: 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
2b70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
2b80: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nDb; i++){.    s
2b90: 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20  truct Db *pDb = 
2ba0: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
2bb0: 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30   if( pDb->pBt==0
2bc0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
2bd0: 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62 2d 3e  b->pAux && pDb->
2be0: 78 46 72 65 65 41 75 78 20 29 20 70 44 62 2d 3e  xFreeAux ) pDb->
2bf0: 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e 70 41  xFreeAux(pDb->pA
2c00: 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  ux);.      pDb->
2c10: 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pAux = 0;.    }.
2c20: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b    }.  for(i=j=2;
2c30: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
2c40: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
2c50: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
2c60: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
2c70: 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >pBt==0 ){.     
2c80: 20 73 71 6c 69 74 65 46 72 65 65 28 70 44 62 2d   sqliteFree(pDb-
2c90: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  >zName);.      p
2ca0: 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  Db->zName = 0;. 
2cb0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2cc0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69     }.    if( j<i
2cd0: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44   ){.      db->aD
2ce0: 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69  b[j] = db->aDb[i
2cf0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b  ];.    }.    j++
2d00: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
2d10: 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28  db->aDb[j], 0, (
2d20: 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f  db->nDb-j)*sizeo
2d30: 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a  f(db->aDb[j]));.
2d40: 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20    db->nDb = j;. 
2d50: 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20   if( db->nDb<=2 
2d60: 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e  && db->aDb!=db->
2d70: 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20  aDbStatic ){.   
2d80: 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53   memcpy(db->aDbS
2d90: 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20  tatic, db->aDb, 
2da0: 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62  2*sizeof(db->aDb
2db0: 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  [0]));.    sqlit
2dc0: 65 46 72 65 65 28 64 62 2d 3e 61 44 62 29 3b 0a  eFree(db->aDb);.
2dd0: 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62      db->aDb = db
2de0: 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d  ->aDbStatic;.  }
2df0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2e00: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2e10: 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
2e20: 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 20 49 66  back occurs.  If
2e30: 20 74 68 65 72 65 20 77 65 72 65 0a 2a 2a 20 73   there were.** s
2e40: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75  chema changes du
2e50: 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ring the transac
2e60: 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20 68 61  tion, then we ha
2e70: 76 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 0a  ve to reset the.
2e80: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  ** internal hash
2e90: 20 74 61 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f   tables and relo
2ea0: 61 64 20 74 68 65 6d 20 66 72 6f 6d 20 64 69 73  ad them from dis
2eb0: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
2ec0: 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e  e3RollbackIntern
2ed0: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
2ee0: 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
2ef0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
2f00: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29  _InternChanges )
2f10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
2f20: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
2f30: 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  (db, 0);.  }.}..
2f40: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2f50: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
2f60: 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72  n a commit occur
2f70: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
2f80: 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
2f90: 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
2fa0: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67  *db){.  db->flag
2fb0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
2fc0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
2fd0: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
2fe0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
2ff0: 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
3000: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3010: 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75   sqliteResetColu
3020: 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70  mnNames(Table *p
3030: 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Table){.  int i;
3040: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
3050: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
3060: 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  e!=0 );.  for(i=
3070: 30 2c 20 70 43 6f 6c 3d 70 54 61 62 6c 65 2d 3e  0, pCol=pTable->
3080: 61 43 6f 6c 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  aCol; i<pTable->
3090: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
30a0: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  +){.    sqliteFr
30b0: 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  ee(pCol->zName);
30c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
30d0: 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66  Delete(pCol->pDf
30e0: 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  lt);.    sqliteF
30f0: 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29  ree(pCol->zType)
3100: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
3110: 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29  ee(pTable->aCol)
3120: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ;.  pTable->aCol
3130: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
3140: 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nCol = 0;.}../*.
3150: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
3160: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
3170: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
3180: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
3190: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
31a0: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
31b0: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
31c0: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
31d0: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
31e0: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
31f0: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
3200: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
3210: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
3220: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
3230: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
3240: 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d   Nor does it rem
3250: 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b  ove.** foreign k
3260: 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  eys from the sql
3270: 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74  ite.aFKey hash t
3280: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
3290: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
32a0: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
32b0: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
32c0: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
32d0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
32e0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
32f0: 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73  *.** Indices ass
3300: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
3310: 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e   table are unlin
3320: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62  ked from the "db
3330: 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74  ".** data struct
3340: 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e  ure if db!=NULL.
3350: 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69    If db==NULL, i
3360: 6e 64 69 63 65 73 20 61 74 74 61 63 68 65 64 20  ndices attached 
3370: 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  to.** the table 
3380: 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74  are deleted, but
3390: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
33a0: 68 65 79 20 68 61 76 65 20 61 6c 72 65 61 64 79  hey have already
33b0: 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65   been.** unlinke
33c0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
33d0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  e3DeleteTable(sq
33e0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
33f0: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64   *pTable){.  Ind
3400: 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65  ex *pIndex, *pNe
3410: 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  xt;.  FKey *pFKe
3420: 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a  y, *pNextFKey;..
3430: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
3440: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
3450: 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63  Delete all indic
3460: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
3470: 74 68 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20  th this table.  
3480: 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20  */.  for(pIndex 
3490: 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  = pTable->pIndex
34a0: 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
34b0: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
34c0: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
34d0: 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  xt;.    assert( 
34e0: 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 70 54 61  pIndex->iDb==pTa
34f0: 62 6c 65 2d 3e 69 44 62 20 7c 7c 20 28 70 54 61  ble->iDb || (pTa
3500: 62 6c 65 2d 3e 69 44 62 3d 3d 30 20 26 26 20 70  ble->iDb==0 && p
3510: 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 31 29 20 29  Index->iDb==1) )
3520: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65  ;.    sqliteDele
3530: 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  teIndex(db, pInd
3540: 65 78 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  ex);.  }..#ifnde
3550: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
3560: 52 45 49 47 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44  REIGN_KEY.  /* D
3570: 65 6c 65 74 65 20 61 6c 6c 20 66 6f 72 65 69 67  elete all foreig
3580: 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65  n keys associate
3590: 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c  d with this tabl
35a0: 65 2e 20 20 54 68 65 20 6b 65 79 73 0a 20 20 2a  e.  The keys.  *
35b0: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  * should have al
35c0: 72 65 61 64 79 20 62 65 65 6e 20 75 6e 6c 69 6e  ready been unlin
35d0: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ked from the db-
35e0: 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c  >aFKey hash tabl
35f0: 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46  e .  */.  for(pF
3600: 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65  Key=pTable->pFKe
3610: 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d  y; pFKey; pFKey=
3620: 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20 20  pNextFKey){.    
3630: 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b 65  pNextFKey = pFKe
3640: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20  y->pNextFrom;.  
3650: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
3660: 2d 3e 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  ->iDb<db->nDb );
3670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
3680: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
3690: 2d 3e 61 44 62 5b 70 54 61 62 6c 65 2d 3e 69 44  ->aDb[pTable->iD
36a0: 62 5d 2e 61 46 4b 65 79 2c 0a 20 20 20 20 20 20  b].aFKey,.      
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c0: 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c       pFKey->zTo,
36d0: 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a   strlen(pFKey->z
36e0: 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b  To)+1)!=pFKey );
36f0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
3700: 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64  pFKey);.  }.#end
3710: 69 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  if..  /* Delete 
3720: 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
3730: 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f  ure itself..  */
3740: 0a 20 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f  .  sqliteResetCo
3750: 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 6c 65  lumnNames(pTable
3760: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
3770: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
3780: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
3790: 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  ble->zColAff);. 
37a0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
37b0: 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53 65  lete(pTable->pSe
37c0: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46  lect);.  sqliteF
37d0: 72 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a  ree(pTable);.}..
37e0: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  /*.** Unlink the
37f0: 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f   given table fro
3800: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
3810: 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65  s and the delete
3820: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74   the.** table st
3830: 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c  ructure with all
3840: 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64   its indices and
3850: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a   foreign keys..*
3860: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
3870: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62  linkAndDeleteTab
3880: 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  le(sqlite3 *db, 
3890: 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63  int iDb, const c
38a0: 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a  har *zTabName){.
38b0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 46 4b    Table *p;.  FK
38c0: 65 79 20 2a 70 46 31 2c 20 2a 70 46 32 3b 0a 20  ey *pF1, *pF2;. 
38d0: 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73   Db *pDb;..  ass
38e0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
38f0: 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
3900: 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
3910: 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 4e  .  assert( zTabN
3920: 61 6d 65 20 26 26 20 7a 54 61 62 4e 61 6d 65 5b  ame && zTabName[
3930: 30 5d 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64  0] );.  pDb = &d
3940: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
3950: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
3960: 73 65 72 74 28 26 70 44 62 2d 3e 74 62 6c 48 61  sert(&pDb->tblHa
3970: 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 73 74  sh, zTabName, st
3980: 72 6c 65 6e 28 7a 54 61 62 4e 61 6d 65 29 2b 31  rlen(zTabName)+1
3990: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  , 0);.  if( p ){
39a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
39b0: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
39c0: 0a 20 20 20 20 66 6f 72 28 70 46 31 3d 70 2d 3e  .    for(pF1=p->
39d0: 70 46 4b 65 79 3b 20 70 46 31 3b 20 70 46 31 3d  pFKey; pF1; pF1=
39e0: 70 46 31 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b  pF1->pNextFrom){
39f0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d  .      int nTo =
3a00: 20 73 74 72 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f   strlen(pF1->zTo
3a10: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 32  ) + 1;.      pF2
3a20: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
3a30: 6e 64 28 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20  nd(&pDb->aFKey, 
3a40: 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a  pF1->zTo, nTo);.
3a50: 20 20 20 20 20 20 69 66 28 20 70 46 32 3d 3d 70        if( pF2==p
3a60: 46 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  F1 ){.        sq
3a70: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
3a80: 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 31  &pDb->aFKey, pF1
3a90: 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d  ->zTo, nTo, pF1-
3aa0: 3e 70 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 20  >pNextTo);.     
3ab0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3ac0: 77 68 69 6c 65 28 20 70 46 32 20 26 26 20 70 46  while( pF2 && pF
3ad0: 32 2d 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31 20  2->pNextTo!=pF1 
3ae0: 29 7b 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78  ){ pF2=pF2->pNex
3af0: 74 54 6f 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  tTo; }.        i
3b00: 66 28 20 70 46 32 20 29 7b 0a 20 20 20 20 20 20  f( pF2 ){.      
3b10: 20 20 20 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f      pF2->pNextTo
3b20: 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b   = pF1->pNextTo;
3b30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3b40: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
3b50: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
3b60: 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20  eTable(db, p);. 
3b70: 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c   }.  db->flags |
3b80: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
3b90: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
3ba0: 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20   Given a token, 
3bb0: 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  return a string 
3bc0: 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
3bd0: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 61   the text of tha
3be0: 74 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69 74 68 20  t.** token with 
3bf0: 61 6e 79 20 71 75 6f 74 61 74 69 6f 6e 73 20 72  any quotations r
3c00: 65 6d 6f 76 65 64 2e 20 20 53 70 61 63 65 20 74  emoved.  Space t
3c10: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
3c20: 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ned string.** is
3c30: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
3c40: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
3c50: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
3c60: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  by the calling.*
3c70: 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  * function..**.*
3c80: 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 72 65 61  * Tokens are rea
3c90: 6c 6c 79 20 6a 75 73 74 20 70 6f 69 6e 74 65 72  lly just pointer
3ca0: 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  s into the origi
3cb0: 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64  nal SQL text and
3cc0: 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c   so.** are not \
3cd0: 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61  000 terminated a
3ce0: 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69  nd are not persi
3cf0: 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75  stent.  The retu
3d00: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
3d10: 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  s \000 terminate
3d20: 64 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74  d and is persist
3d30: 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  ent..*/.char *sq
3d40: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
3d50: 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  en(Token *pName)
3d60: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
3d70: 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
3d80: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
3d90: 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d  teStrNDup(pName-
3da0: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20  >z, pName->n);. 
3db0: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
3dc0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73  e(zName);.  }els
3dd0: 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30  e{.    zName = 0
3de0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
3df0: 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  Name;.}../*.** O
3e00: 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  pen the sqlite_m
3e10: 61 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72  aster table stor
3e20: 65 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e  ed in database n
3e30: 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a  umber iDb for.**
3e40: 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61   writing. The ta
3e50: 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73  ble is opened us
3e60: 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f  ing cursor 0..*/
3e70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65  .void sqlite3Ope
3e80: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 56 64 62  nMasterTable(Vdb
3e90: 65 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *v, int iDb){.
3ea0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3eb0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
3ec0: 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c  , iDb, 0);.  sql
3ed0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3ee0: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30   OP_OpenWrite, 0
3ef0: 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 29 3b 0a  , MASTER_ROOT);.
3f00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3f10: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  Op(v, OP_SetNumC
3f20: 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35 29 3b 20 2f  olumns, 0, 5); /
3f30: 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
3f40: 68 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f  has 5 columns */
3f50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f  .}../*.** The to
3f60: 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61  ken *pName conta
3f70: 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ins the name of 
3f80: 61 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68  a database (eith
3f90: 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20  er "main" or.** 
3fa0: 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61  "temp" or the na
3fb0: 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65  me of an attache
3fc0: 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74  d db). This rout
3fd0: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a  ine returns the.
3fe0: 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ** index of the 
3ff0: 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69  named database i
4000: 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20  n db->aDb[], or 
4010: 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  -1 if the named 
4020: 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  db .** does not 
4030: 65 78 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  exist..*/.static
4040: 20 69 6e 74 20 66 69 6e 64 44 62 28 73 71 6c 69   int findDb(sqli
4050: 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a  te3 *db, Token *
4060: 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20  pName){.  int i 
4070: 3d 20 2d 31 3b 20 20 20 20 2f 2a 20 44 61 74 61  = -1;    /* Data
4080: 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  base number */. 
4090: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
40a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
40b0: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 6e  racters in the n
40c0: 61 6d 65 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62  ame */.  Db *pDb
40d0: 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 64 61 74  ;       /* A dat
40e0: 61 62 61 73 65 20 77 68 6f 73 65 20 6e 61 6d 65  abase whose name
40f0: 20 73 70 61 63 65 20 69 73 20 62 65 69 6e 67 20   space is being 
4100: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 68  searched */.  ch
4110: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
4120: 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72  Name we are sear
4130: 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 0a 20 20  ching for */..  
4140: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
4150: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61  ameFromToken(pNa
4160: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
4170: 20 29 7b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c   ){.    n = strl
4180: 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66  en(zName);.    f
4190: 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29  or(i=(db->nDb-1)
41a0: 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69  , pDb=&db->aDb[i
41b0: 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44  ]; i>=0; i--, pD
41c0: 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20  b--){.      if( 
41d0: 6e 3d 3d 73 74 72 6c 65 6e 28 70 44 62 2d 3e 7a  n==strlen(pDb->z
41e0: 4e 61 6d 65 29 20 26 26 20 30 3d 3d 73 71 6c 69  Name) && 0==sqli
41f0: 74 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e  te3StrICmp(pDb->
4200: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  zName, zName) ){
4210: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4220: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4230: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
4240: 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  me);.  }.  retur
4250: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74  n i;.}../* The t
4260: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20  able or view or 
4270: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20  trigger name is 
4280: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
4290: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
42a0: 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20  s.** pName1 and 
42b0: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
42c0: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
42d0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
42e0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
42f0: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
4300: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a  xx.yyy (...);.**
4310: 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31   .** Then pName1
4320: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
4330: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
4340: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
4350: 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74  hand if.** the t
4360: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
4370: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
4380: 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52  , i.e.:.**.** CR
4390: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
43a0: 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ..);.**.** Then 
43b0: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
43c0: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
43d0: 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54  2 is ""..**.** T
43e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
43f0: 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70   the *ppUnqual p
4400: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
4410: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
4420: 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65  ame1 or.** pName
4430: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
4440: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
4450: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
4460: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
4470: 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69  database "xxx" i
4480: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
4490: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
44a0: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
44b0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
44c0: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
44d0: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
44e0: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
44f0: 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20  pName1,      /* 
4500: 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65  The "xxx" in the
4510: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
4520: 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f  or "xxx" */.  To
4530: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
4540: 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69    /* The "yyy" i
4550: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
4560: 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  yyy" */.  Token 
4570: 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a  **pUnqual     /*
4580: 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61   Write the unqua
4590: 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61  lified object na
45a0: 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  me here */.){.  
45b0: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
45d0: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
45e0: 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
45f0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
4600: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
4610: 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65   pName2 && pName
4620: 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73  2->n>0 ){.    as
4630: 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
4640: 62 75 73 79 20 29 3b 0a 20 20 20 20 2a 70 55 6e  busy );.    *pUn
4650: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20  qual = pName2;. 
4660: 20 20 20 69 44 62 20 3d 20 66 69 6e 64 44 62 28     iDb = findDb(
4670: 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  db, pName1);.   
4680: 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20   if( iDb<0 ){.  
4690: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
46a0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b  Msg(pParse, "unk
46b0: 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25 54  nown database %T
46c0: 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  ", pName1);.    
46d0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
46e0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  ;.      return -
46f0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
4700: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
4710: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c  ->init.iDb==0 ||
4720: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
4730: 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e  ;.    iDb = db->
4740: 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70  init.iDb;.    *p
4750: 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b  Unqual = pName1;
4760: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44  .  }.  return iD
4770: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  b;.}../*.** This
4780: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
4790: 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65   to check if the
47a0: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e   UTF-8 string zN
47b0: 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a  ame is a legal.*
47c0: 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * unqualified na
47d0: 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63 68  me for a new sch
47e0: 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62 6c  ema object (tabl
47f0: 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20 6f  e, index, view o
4800: 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20 41  r.** trigger). A
4810: 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65 67  ll names are leg
4820: 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65 20  al except those 
4830: 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
4840: 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73  the string.** "s
4850: 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70 65  qlite_" (in uppe
4860: 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65  r, lower or mixe
4870: 64 20 63 61 73 65 29 2e 20 54 68 69 73 20 70 6f  d case). This po
4880: 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d  rtion of the nam
4890: 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65 73  espace.** is res
48a0: 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e  erved for intern
48b0: 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  al use..*/.int s
48c0: 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
48d0: 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50 61  tName(Parse *pPa
48e0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
48f0: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 21  *zName){.  if( !
4900: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74  pParse->db->init
4910: 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d  .busy && pParse-
4920: 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20 20  >nested==0 .    
4930: 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69        && 0==sqli
4940: 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d  te3StrNICmp(zNam
4950: 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
4960: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4970: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4980: 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73  "object name res
4990: 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e  erved for intern
49a0: 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61  al use: %s", zNa
49b0: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
49c0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
49d0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
49e0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  E_OK;.}../*.** B
49f0: 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  egin constructin
4a00: 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65  g a new table re
4a10: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20  presentation in 
4a20: 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73  memory.  This is
4a30: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66  .** the first of
4a40: 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20   several action 
4a50: 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65  routines that ge
4a60: 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70  t called in resp
4a70: 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45  onse.** to a CRE
4a80: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
4a90: 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75  ent.  In particu
4aa0: 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  lar, this routin
4ab0: 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61  e is called.** a
4ac0: 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65  fter seeing toke
4ad0: 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20  ns "CREATE" and 
4ae0: 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20  "TABLE" and the 
4af0: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65  table name.  The
4b00: 0a 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b 65 6e  .** pStart token
4b10: 20 69 73 20 74 68 65 20 43 52 45 41 54 45 20 61   is the CREATE a
4b20: 6e 64 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  nd pName is the 
4b30: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65  table name.  The
4b40: 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20   isTemp.** flag 
4b50: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74  is true if the t
4b60: 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73  able should be s
4b70: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78  tored in the aux
4b80: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a  iliary database.
4b90: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
4ba0: 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  of in the main d
4bb0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
4bc0: 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
4bd0: 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e  the case.** when
4be0: 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22   the "TEMP" or "
4bf0: 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f  TEMPORARY" keywo
4c00: 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  rd occurs in bet
4c10: 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61  ween.** CREATE a
4c20: 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  nd TABLE..**.** 
4c30: 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65  The new table re
4c40: 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69  cord is initiali
4c50: 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70  zed and put in p
4c60: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
4c70: 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20  ..** As more of 
4c80: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
4c90: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
4ca0: 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c  rsed, additional
4cb0: 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69   action.** routi
4cc0: 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  nes will be call
4cd0: 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69  ed to add more i
4ce0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
4cf0: 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74  is record..** At
4d00: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
4d10: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
4d20: 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69  tement, the sqli
4d30: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f  te3EndTable() ro
4d40: 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
4d50: 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  ed to complete t
4d60: 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  he construction 
4d70: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
4d80: 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64   record..*/.void
4d90: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
4da0: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
4db0: 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72  rse,   /* Parser
4dc0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
4dd0: 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f  ken *pStart,   /
4de0: 2a 20 54 68 65 20 22 43 52 45 41 54 45 22 20 74  * The "CREATE" t
4df0: 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  oken */.  Token 
4e00: 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69  *pName1,   /* Fi
4e10: 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  rst part of the 
4e20: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
4e30: 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54  e or view */.  T
4e40: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
4e50: 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f  /* Second part o
4e60: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
4e70: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
4e80: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c  */.  int isTemp,
4e90: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
4ea0: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20   this is a TEMP 
4eb0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
4ec0: 73 56 69 65 77 20 20 20 20 20 20 20 2f 2a 20 54  sView       /* T
4ed0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
4ee0: 20 56 49 45 57 20 2a 2f 0a 29 7b 0a 20 20 54 61   VIEW */.){.  Ta
4ef0: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49  ble *pTable;.  I
4f00: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 63 68  ndex *pIdx;.  ch
4f10: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f  ar *zName = 0; /
4f20: 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * The name of th
4f30: 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
4f40: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
4f50: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
4f60: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b  e *v;.  int iDb;
4f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
4f80: 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63  base number to c
4f90: 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  reate the table 
4fa0: 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  in */.  Token *p
4fb0: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75  Name;    /* Unqu
4fc0: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
4fd0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65  the table to cre
4fe0: 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ate */..  /* The
4ff0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
5000: 61 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69 73  ame to create is
5010: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
5020: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
5030: 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61  ns.  ** pName1 a
5040: 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68  nd pName2. If th
5050: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73  e table name was
5060: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5070: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20  , for example:. 
5080: 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20   **.  ** CREATE 
5090: 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e  TABLE xxx.yyy (.
50a0: 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ..);.  ** .  ** 
50b0: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
50c0: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
50d0: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
50e0: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
50f0: 69 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  if.  ** the tabl
5100: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
5110: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
5120: 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  .e.:.  **.  ** C
5130: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
5140: 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ...);.  **.  ** 
5150: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
5160: 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20  et to "yyy" and 
5170: 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20  pName2 is ""..  
5180: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  **.  ** The call
5190: 20 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20   below sets the 
51a0: 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f  pName pointer to
51b0: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f   point at the to
51c0: 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20  ken (pName1 or. 
51d0: 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74   ** pName2) that
51e0: 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75   stores the unqu
51f0: 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61  alified table na
5200: 6d 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65  me. The variable
5210: 20 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74   iDb is.  ** set
5220: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
5230: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
5240: 61 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  at the table or 
5250: 76 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20  view is to be.  
5260: 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20  ** created in.. 
5270: 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   */.  iDb = sqli
5280: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
5290: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
52a0: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
52b0: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
52c0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 69 73 54 65  turn;.  if( isTe
52d0: 6d 70 20 26 26 20 69 44 62 3e 31 20 29 7b 0a 20  mp && iDb>1 ){. 
52e0: 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e     /* If creatin
52f0: 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20  g a temp table, 
5300: 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74  the name may not
5310: 20 62 65 20 71 75 61 6c 69 66 69 65 64 20 2a 2f   be qualified */
5320: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
5330: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65  rMsg(pParse, "te
5340: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61  mporary table na
5350: 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61  me must be unqua
5360: 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 72 65  lified");.    re
5370: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
5380: 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31  isTemp ) iDb = 1
5390: 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61  ;..  pParse->sNa
53a0: 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65  meToken = *pName
53b0: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  zName = sqli
53c0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
53d0: 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  (pName);.  if( z
53e0: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
53f0: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
5400: 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
5410: 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
5420: 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
5430: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
5440: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  _error;.  }.  if
5450: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
5460: 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a  1 ) isTemp = 1;.
5470: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5480: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
5490: 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 54  N.  assert( (isT
54a0: 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70  emp & 1)==isTemp
54b0: 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20   );.  {.    int 
54c0: 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  code;.    char *
54d0: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
54e0: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b].zName;.    if
54f0: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
5500: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
5510: 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
5520: 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20  _TABLE(isTemp), 
5530: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
5540: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
5550: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
5560: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
5570: 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 65 6d  .      if( isTem
5580: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
5590: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
55a0: 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  E_TEMP_VIEW;.   
55b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
55c0: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
55d0: 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20  CREATE_VIEW;.   
55e0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
55f0: 20 20 20 20 20 20 69 66 28 20 69 73 54 65 6d 70        if( isTemp
5600: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
5610: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
5620: 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
5630: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5640: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
5650: 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20  CREATE_TABLE;.  
5660: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5670: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
5680: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
5690: 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  e, zName, 0, zDb
56a0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
56b0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
56c0: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  r;.    }.  }.#en
56d0: 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  dif..  /* Make s
56e0: 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c  ure the new tabl
56f0: 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20  e name does not 
5700: 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20  collide with an 
5710: 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e  existing.  ** in
5720: 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d  dex or table nam
5730: 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  e in the same da
5740: 74 61 62 61 73 65 2e 20 20 49 73 73 75 65 20 61  tabase.  Issue a
5750: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
5760: 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e  if.  ** it does.
5770: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
5780: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
5790: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
57a0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67   ){.    goto beg
57b0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
57c0: 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73    }.  pTable = s
57d0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
57e0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61  db, zName, db->a
57f0: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a  Db[iDb].zName);.
5800: 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a    if( pTable ){.
5810: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5820: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
5830: 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78  le %T already ex
5840: 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ists", pName);. 
5850: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
5860: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
5870: 20 69 66 28 20 28 70 49 64 78 20 3d 20 73 71 6c   if( (pIdx = sql
5880: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
5890: 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20  , zName, 0))!=0 
58a0: 26 26 20 0a 20 20 20 20 20 20 28 20 69 44 62 3d  && .      ( iDb=
58b0: 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e  =0 || !db->init.
58c0: 62 75 73 79 29 20 29 7b 0a 20 20 20 20 73 71 6c  busy) ){.    sql
58d0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
58e0: 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
58f0: 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20  lready an index 
5900: 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
5910: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69  );.    goto begi
5920: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
5930: 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71   }.  pTable = sq
5940: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
5950: 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69  of(Table) );.  i
5960: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  f( pTable==0 ){.
5970: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
5980: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
5990: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
59a0: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69  +;.    goto begi
59b0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
59c0: 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61   }.  pTable->zNa
59d0: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54  me = zName;.  pT
59e0: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
59f0: 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d    pTable->aCol =
5a00: 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50   0;.  pTable->iP
5a10: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62  Key = -1;.  pTab
5a20: 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  le->pIndex = 0;.
5a30: 20 20 70 54 61 62 6c 65 2d 3e 69 44 62 20 3d 20    pTable->iDb = 
5a40: 69 44 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73  iDb;.  if( pPars
5a50: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73  e->pNewTable ) s
5a60: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
5a70: 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e  e(db, pParse->pN
5a80: 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72  ewTable);.  pPar
5a90: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
5aa0: 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66  pTable;..  /* If
5ab0: 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 67   this is the mag
5ac0: 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  ic sqlite_sequen
5ad0: 63 65 20 74 61 62 6c 65 20 75 73 65 64 20 62 79  ce table used by
5ae0: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a   autoincrement,.
5af0: 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72 64    ** then record
5b00: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
5b10: 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  is table in the 
5b20: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74  main database st
5b30: 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20  ructure.  ** so 
5b40: 74 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e 20  that INSERT can 
5b50: 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 65  find the table e
5b60: 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e  asily..  */.#ifn
5b70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5b80: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
5b90: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
5ba0: 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  , "sqlite_sequen
5bb0: 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64  ce")==0 ){.    d
5bc0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 65 71  b->aDb[iDb].pSeq
5bd0: 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  Tab = pTable;.  
5be0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  }.#endif..  /* B
5bf0: 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  egin generating 
5c00: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  the code that wi
5c10: 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74 61  ll insert the ta
5c20: 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a  ble record into.
5c30: 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f    ** the SQLITE_
5c40: 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e  MASTER table.  N
5c50: 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61  ote in particula
5c60: 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20 67  r that we must g
5c70: 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64  o ahead.  ** and
5c80: 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65   allocate the re
5c90: 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20  cord number for 
5ca0: 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
5cb0: 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79  now.  Before any
5cc0: 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45  .  ** PRIMARY KE
5cd0: 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77  Y or UNIQUE keyw
5ce0: 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64 2e  ords are parsed.
5cf0: 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73    Those keywords
5d00: 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a   will cause.  **
5d10: 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63   indices to be c
5d20: 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20 74  reated and the t
5d30: 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74  able record must
5d40: 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65   come before the
5d50: 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20   .  ** indices. 
5d60: 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f   Hence, the reco
5d70: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
5d80: 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  e table must be 
5d90: 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e  allocated.  ** n
5da0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ow..  */.  if( !
5db0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
5dc0: 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   (v = sqlite3Get
5dd0: 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30  Vdbe(pParse))!=0
5de0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
5df0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
5e00: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
5e10: 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 65 72  b);..    /* Ever
5e20: 79 20 74 69 6d 65 20 61 20 6e 65 77 20 74 61 62  y time a new tab
5e30: 6c 65 20 69 73 20 63 72 65 61 74 65 64 20 74 68  le is created th
5e40: 65 20 66 69 6c 65 2d 66 6f 72 6d 61 74 0a 20 20  e file-format.  
5e50: 20 20 2a 2a 20 61 6e 64 20 65 6e 63 6f 64 69 6e    ** and encodin
5e60: 67 20 6d 65 74 61 2d 76 61 6c 75 65 73 20 61 72  g meta-values ar
5e70: 65 20 73 65 74 20 69 6e 20 74 68 65 20 64 61 74  e set in the dat
5e80: 61 62 61 73 65 2c 20 69 6e 0a 20 20 20 20 2a 2a  abase, in.    **
5e90: 20 63 61 73 65 20 74 68 69 73 20 69 73 20 74 68   case this is th
5ea0: 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 63 72  e first table cr
5eb0: 65 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eated..    */.  
5ec0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5ed0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
5ee0: 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  , db->file_forma
5ef0: 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
5f00: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5f10: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
5f20: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
5f30: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5f40: 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 65 6e  _Integer, db->en
5f50: 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  c, 0);.    sqlit
5f60: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5f70: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
5f80: 2c 20 34 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  , 4);..    /* Th
5f90: 69 73 20 6a 75 73 74 20 63 72 65 61 74 65 73 20  is just creates 
5fa0: 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72  a place-holder r
5fb0: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c  ecord in the sql
5fc0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
5fd0: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  ..    ** The rec
5fe0: 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f 65 73  ord created does
5ff0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79   not contain any
6000: 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77  thing yet.  It w
6010: 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a  ill be replaced.
6020: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65      ** by the re
6030: 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65  al entry in code
6040: 20 67 65 6e 65 72 61 74 65 64 20 61 74 20 73 71   generated at sq
6050: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e  lite3EndTable().
6060: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
6070: 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
6080: 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65   new entry is le
6090: 66 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  ft on the top of
60a0: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20   the stack..    
60b0: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 76 61 6c  ** The rowid val
60c0: 75 65 20 69 73 20 6e 65 65 64 65 64 20 62 79 20  ue is needed by 
60d0: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71  the code that sq
60e0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69  lite3EndTable wi
60f0: 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61  ll.    ** genera
6100: 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  te..    */.#ifnd
6110: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
6120: 49 45 57 0a 20 20 20 20 69 66 28 20 69 73 56 69  IEW.    if( isVi
6130: 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ew ){.      sqli
6140: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6150: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30  OP_Integer, 0, 0
6160: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
6170: 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
6180: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6190: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
61a0: 6c 65 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20  le, iDb, 0);.   
61b0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70   }.    sqlite3Op
61c0: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c  enMasterTable(v,
61d0: 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
61e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
61f0: 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30  P_NewRecno, 0, 0
6200: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6210: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
6220: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 0, 0);.    sq
6230: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6240: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
6250: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
6260: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6270: 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29  PutIntKey, 0, 0)
6280: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6290: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
62a0: 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  se, 0, 0);.    s
62b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
62c0: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30  v, OP_Pull, 1, 0
62d0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72  );.  }..  /* Nor
62e0: 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20  mal (non-error) 
62f0: 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74  return. */.  ret
6300: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  urn;..  /* If an
6310: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77   error occurs, w
6320: 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62  e jump here */.b
6330: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
6340: 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  :.  sqliteFree(z
6350: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Name);.  return;
6360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d  .}../*.** This m
6370: 61 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20  acro is used to 
6380: 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69  compare two stri
6390: 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e  ngs in a case-in
63a0: 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65 72  sensitive manner
63b0: 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67 68  ..** It is sligh
63c0: 74 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e 20  tly faster than 
63d0: 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 53  calling sqlite3S
63e0: 74 72 49 43 6d 70 28 29 20 64 69 72 65 63 74 6c  trICmp() directl
63f0: 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63  y, but.** produc
6400: 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a  es larger code..
6410: 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54  **.** WARNING: T
6420: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74  his macro is not
6430: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
6440: 20 74 68 65 20 73 74 72 63 6d 70 28 29 20 66 61   the strcmp() fa
6450: 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75  mily. It.** retu
6460: 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20  rns true if the 
6470: 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65 20  two strings are 
6480: 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73 65  equal, otherwise
6490: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69   false..*/.#defi
64a0: 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79 29  ne STRICMP(x, y)
64b0: 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72   (\.sqlite3Upper
64c0: 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e  ToLower[*(unsign
64d0: 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d  ed char *)(x)]==
64e0: 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70 65     \.sqlite3Uppe
64f0: 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67  rToLower[*(unsig
6500: 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d 20  ned char *)(y)] 
6510: 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65 33      \.&& sqlite3
6520: 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28 79  StrICmp((x)+1,(y
6530: 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a  )+1)==0 )../*.**
6540: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
6550: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
6560: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
6570: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a  onstructed..**.*
6580: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
6590: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
65a0: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f  once for each co
65b0: 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  lumn declaration
65c0: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
65d0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
65e0: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
65f0: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
6600: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
6610: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
6620: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
6630: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
6640: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
6650: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6660: 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20  AddColumn(Parse 
6670: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
6680: 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  pName){.  Table 
6690: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
66a0: 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e  har *z;.  Column
66b0: 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70   *pCol;.  if( (p
66c0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
66d0: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
66e0: 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  n;.  z = sqlite3
66f0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e  NameFromToken(pN
6700: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  ame);.  if( z==0
6710: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
6720: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
6730: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53   i++){.    if( S
6740: 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f  TRICMP(z, p->aCo
6750: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20  l[i].zName) ){. 
6760: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
6770: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
6780: 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e  plicate column n
6790: 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ame: %s", z);.  
67a0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
67b0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
67c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
67d0: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
67e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
67f0: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
6800: 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
6810: 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e  c( p->aCol, (p->
6820: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
6830: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
6840: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72   if( aNew==0 ) r
6850: 65 74 75 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43  eturn;.    p->aC
6860: 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20  ol = aNew;.  }. 
6870: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
6880: 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d  [p->nCol];.  mem
6890: 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a  set(pCol, 0, siz
68a0: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
68b0: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20  ;.  pCol->zName 
68c0: 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74  = z;. .  /* If t
68d0: 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20  here is no type 
68e0: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d  specified, colum
68f0: 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61  ns have the defa
6900: 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a  ult affinity.  *
6910: 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65  * 'NONE'. If the
6920: 72 65 20 69 73 20 61 20 74 79 70 65 20 73 70 65  re is a type spe
6930: 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c  cified, then sql
6940: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70  ite3AddColumnTyp
6950: 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  e() will.  ** be
6960: 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20   called next to 
6970: 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  set pCol->affini
6980: 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20  ty correctly..  
6990: 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  */.  pCol->affin
69a0: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
69b0: 5f 4e 4f 4e 45 3b 0a 20 20 70 43 6f 6c 2d 3e 70  _NONE;.  pCol->p
69c0: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
69d0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
69e0: 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a  p->nCol++;.}../*
69f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6a00: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
6a10: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
6a20: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
6a30: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
6a40: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
6a50: 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c  ent.  A "NOT NUL
6a60: 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  L" constraint ha
6a70: 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f  s.** been seen o
6a80: 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69  n a column.  Thi
6a90: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
6aa0: 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20  he notNull flag 
6ab0: 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  on.** the column
6ac0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
6ad0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
6ae0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
6af0: 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a  dNotNull(Parse *
6b00: 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72  pParse, int onEr
6b10: 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ror){.  Table *p
6b20: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
6b30: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
6b40: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
6b50: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
6b60: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d  Col-1;.  if( i>=
6b70: 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e  0 ) p->aCol[i].n
6b80: 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72  otNull = onError
6b90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  ;.}../*.** Scan 
6ba0: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
6bb0: 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67  name zType (leng
6bc0: 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65  th nType) and re
6bd0: 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f  turn the.** asso
6be0: 63 69 61 74 65 64 20 61 66 66 69 6e 69 74 79 20  ciated affinity 
6bf0: 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  type..**.** This
6c00: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20   routine does a 
6c10: 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74  case-independent
6c20: 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65   search of zType
6c30: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62   for the .** sub
6c40: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66  strings in the f
6c50: 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20  ollowing table. 
6c60: 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  If one of the su
6c70: 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66  bstrings is.** f
6c80: 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73  ound, the corres
6c90: 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79  ponding affinity
6ca0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
6cb0: 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a   zType contains.
6cc0: 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ** more than one
6cd0: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
6ce0: 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61  gs, entries towa
6cf0: 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a  rd the top of .*
6d00: 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65  * the table take
6d10: 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65   priority. For e
6d20: 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65  xample, if zType
6d30: 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a   is 'BLOBINT', .
6d40: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  ** SQLITE_AFF_IN
6d50: 54 45 47 45 52 20 69 73 20 72 65 74 75 72 6e 65  TEGER is returne
6d60: 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69  d..**.** Substri
6d70: 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74  ng     | Affinit
6d80: 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  y.** -----------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6da0: 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20  -----.** 'INT'  
6db0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
6dc0: 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27  AFF_INTEGER.** '
6dd0: 43 48 41 52 27 20 20 20 20 20 20 20 20 7c 20 53  CHAR'        | S
6de0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
6df0: 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20  * 'CLOB'        
6e00: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
6e10: 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20  T.** 'TEXT'     
6e20: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
6e30: 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20  TEXT.** 'BLOB'  
6e40: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
6e50: 46 46 5f 4e 4f 4e 45 0a 2a 2a 0a 2a 2a 20 49 66  FF_NONE.**.** If
6e60: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62   none of the sub
6e70: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61  strings in the a
6e80: 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66  bove table are f
6e90: 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ound,.** SQLITE_
6ea0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72  AFF_NUMERIC is r
6eb0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
6ec0: 69 63 20 63 68 61 72 20 73 71 6c 69 74 65 33 41  ic char sqlite3A
6ed0: 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73  ffinityType(cons
6ee0: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69  t char *zType, i
6ef0: 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20 75 33 32  nt nType){.  u32
6f00: 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61   h = 0;.  char a
6f10: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
6f20: 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74  NUMERIC;.  const
6f30: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
6f40: 7a 49 6e 20 3d 20 7a 54 79 70 65 3b 0a 20 20 63  zIn = zType;.  c
6f50: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
6f60: 61 72 20 2a 7a 45 6e 64 20 3d 20 28 7a 49 6e 2b  ar *zEnd = (zIn+
6f70: 6e 54 79 70 65 29 3b 0a 0a 20 20 77 68 69 6c 65  nType);..  while
6f80: 28 20 7a 49 6e 21 3d 7a 45 6e 64 20 29 7b 0a 20  ( zIn!=zEnd ){. 
6f90: 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20     h = (h<<8) + 
6fa0: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
6fb0: 77 65 72 5b 2a 7a 49 6e 5d 3b 0a 20 20 20 20 7a  wer[*zIn];.    z
6fc0: 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d  In++;.    if( h=
6fd0: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27  =(('c'<<24)+('h'
6fe0: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
6ff0: 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  r') ){          
7000: 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20     /* CHAR */.  
7010: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
7020: 5f 41 46 46 5f 54 45 58 54 3b 20 0a 20 20 20 20  _AFF_TEXT; .    
7030: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
7040: 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  c'<<24)+('l'<<16
7050: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
7060: 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42  ){       /* CLOB
7070: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
7080: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
7090: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
70a0: 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65  ==(('t'<<24)+('e
70b0: 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b  '<<16)+('x'<<8)+
70c0: 27 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a  't') ){       /*
70d0: 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61   TEXT */.      a
70e0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
70f0: 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20  TEXT;.    }else 
7100: 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34  if( h==(('b'<<24
7110: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
7120: 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20  <<8)+'b')       
7130: 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20     /* BLOB */.  
7140: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
7150: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
7160: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
7170: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
7180: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
7190: 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28  h&0x00FFFFFF)==(
71a0: 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c  ('i'<<16)+('n'<<
71b0: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a  8)+'t') ){    /*
71c0: 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66   INT */.      af
71d0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  f = SQLITE_AFF_I
71e0: 4e 54 45 47 45 52 3b 20 0a 20 20 20 20 20 20 62  NTEGER; .      b
71f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
7200: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
7210: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
7220: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
7230: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
7240: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
7250: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
7260: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
7270: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46  atement.  The pF
7280: 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68  irst token is th
7290: 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e  e first.** token
72a0: 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65   in the sequence
72b0: 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20   of tokens that 
72c0: 64 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70  describe the typ
72d0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75  e of the.** colu
72e0: 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  mn currently und
72f0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
7300: 20 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20     pLast is the 
7310: 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e  last token.** in
7320: 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20   the sequence.  
7330: 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61  Use this informa
7340: 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63  tion to construc
7350: 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68  t a string.** th
7360: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
7370: 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20  typename of the 
7380: 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65  column and store
7390: 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20   that string.** 
73a0: 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f  in zType..*/ .vo
73b0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
73c0: 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70  umnType(Parse *p
73d0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46  Parse, Token *pF
73e0: 69 72 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61  irst, Token *pLa
73f0: 73 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  st){.  Table *p;
7400: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
7410: 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nt n;.  char *z;
7420: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
7430: 64 20 63 68 61 72 20 2a 7a 49 6e 3b 0a 0a 20 20  d char *zIn;..  
7440: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
7450: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
7460: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
7470: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
7480: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20  ->nCol-1;.  if( 
7490: 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  i<0 ) return;.  
74a0: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
74b0: 69 5d 3b 0a 20 20 7a 49 6e 20 3d 20 70 46 69 72  i];.  zIn = pFir
74c0: 73 74 2d 3e 7a 3b 0a 20 20 6e 20 3d 20 70 4c 61  st->z;.  n = pLa
74d0: 73 74 2d 3e 6e 20 2b 20 28 70 4c 61 73 74 2d 3e  st->n + (pLast->
74e0: 7a 20 2d 20 7a 49 6e 29 3b 0a 20 20 61 73 73 65  z - zIn);.  asse
74f0: 72 74 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d  rt( pCol->zType=
7500: 3d 30 20 29 3b 0a 20 20 7a 20 3d 20 70 43 6f 6c  =0 );.  z = pCol
7510: 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65  ->zType = sqlite
7520: 4d 61 6c 6c 6f 63 52 61 77 28 6e 2b 31 29 3b 0a  MallocRaw(n+1);.
7530: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
7540: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  urn;.  for(i=j=0
7550: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
7560: 20 69 6e 74 20 63 20 3d 20 7a 49 6e 5b 69 5d 3b   int c = zIn[i];
7570: 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65  .    if( isspace
7580: 28 63 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  (c) ) continue;.
7590: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a      z[j++] = c;.
75a0: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
75b0: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
75c0: 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69   = sqlite3Affini
75d0: 74 79 54 79 70 65 28 7a 2c 20 6e 29 3b 0a 7d 0a  tyType(z, n);.}.
75e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  ./*.** The expre
75f0: 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66  ssion is the def
7600: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
7610: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
7620: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a   added column.**
7630: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 75   of the table cu
7640: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
7650: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
7660: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
7670: 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74  expressions must
7680: 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52   be constant.  R
7690: 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  aise an exceptio
76a0: 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  n if this.** is 
76b0: 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a  not the case..**
76c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
76d0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
76e0: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
76f0: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
7700: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
7710: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
7720: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
7730: 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61  ite3AddDefaultVa
7740: 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lue(Parse *pPars
7750: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
7760: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43  .  Table *p;.  C
7770: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69  olumn *pCol;.  i
7780: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
7790: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
77a0: 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d  return;.  pCol =
77b0: 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43   &(p->aCol[p->nC
77c0: 6f 6c 2d 31 5d 29 3b 0a 20 20 69 66 28 20 21 73  ol-1]);.  if( !s
77d0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
77e0: 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20  tant(pExpr) ){. 
77f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
7800: 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61  sg(pParse, "defa
7810: 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c  ult value of col
7820: 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20  umn [%s] is not 
7830: 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20  constant",.     
7840: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b     pCol->zName);
7850: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
7860: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
7870: 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20  pCol->pDflt);.  
7880: 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20    pCol->pDflt = 
7890: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
78a0: 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Expr);.  }.  sql
78b0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
78c0: 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
78d0: 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52  Designate the PR
78e0: 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68  IMARY KEY for th
78f0: 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20  e table.  pList 
7900: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d  is a list of nam
7910: 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e  es .** of column
7920: 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  s that form the 
7930: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
7940: 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20   pList is NULL, 
7950: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74  then the.** most
7960: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
7970: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
7980: 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61  ble is the prima
7990: 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20  ry key..**.** A 
79a0: 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61  table can have a
79b0: 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61  t most one prima
79c0: 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20  ry key.  If the 
79d0: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
79e0: 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b  s.** a primary k
79f0: 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20  ey (and this is 
7a00: 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61  the second prima
7a10: 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65  ry key) then cre
7a20: 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e  ate an.** error.
7a30: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52  .**.** If the PR
7a40: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20  IMARY KEY is on 
7a50: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
7a60: 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69  whose datatype i
7a70: 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68  s INTEGER,.** th
7a80: 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74  en we will try t
7a90: 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d  o use that colum
7aa0: 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20  n as the rowid. 
7ab0: 20 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69   Set the Table.i
7ac0: 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66  PKey.** field of
7ad0: 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72   the table under
7ae0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f   construction to
7af0: 20 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66   be the index of
7b00: 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20   the.** INTEGER 
7b10: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
7b20: 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79  mn.  Table.iPKey
7b30: 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66   is set to -1 if
7b40: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
7b50: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
7b60: 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  KEY..**.** If th
7b70: 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20  e key is not an 
7b80: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
7b90: 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65  KEY, then create
7ba0: 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64   a unique.** ind
7bb0: 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20  ex for the key. 
7bc0: 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65   No index is cre
7bd0: 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52  ated for INTEGER
7be0: 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a   PRIMARY KEYs..*
7bf0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
7c00: 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50  dPrimaryKey(.  P
7c10: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7c20: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
7c30: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
7c40: 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  t *pList,  /* Li
7c50: 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65  st of field name
7c60: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
7c70: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
7c80: 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  ,      /* What t
7c90: 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71  o do with a uniq
7ca0: 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20  ueness conflict 
7cb0: 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63  */.  int autoInc
7cc0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
7cd0: 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d  f the AUTOINCREM
7ce0: 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  ENT keyword is p
7cf0: 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54  resent */.){.  T
7d00: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
7d10: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
7d20: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
7d30: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
7d40: 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61  -1, i;.  if( pTa
7d50: 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 69 6d  b==0 ) goto prim
7d60: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20  ary_key_exit;.  
7d70: 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69  if( pTab->hasPri
7d80: 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  mKey ){.    sqli
7d90: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7da0: 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c  se, .      "tabl
7db0: 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72  e \"%s\" has mor
7dc0: 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61  e than one prima
7dd0: 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a  ry key", pTab->z
7de0: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
7df0: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
7e00: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61  ;.  }.  pTab->ha
7e10: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
7e20: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
7e30: 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
7e40: 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70  >nCol - 1;.    p
7e50: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
7e60: 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  isPrimKey = 1;. 
7e70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
7e80: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
7e90: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
7ea0: 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
7eb0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
7ec0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ol++){.        i
7ed0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
7ee0: 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
7ef0: 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
7f00: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  iCol].zName)==0 
7f10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
7f20: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
7f30: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7f40: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iCol<pTab->nCol 
7f50: 29 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ) pTab->aCol[iCo
7f60: 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31  l].isPrimKey = 1
7f70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7f80: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29  pList->nExpr>1 )
7f90: 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a   iCol = -1;.  }.
7fa0: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
7fb0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
7fc0: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
7fd0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
7fe0: 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66  .zType;.  }.  if
7ff0: 28 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74  ( zType && sqlit
8000: 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c  e3StrICmp(zType,
8010: 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 20 29   "INTEGER")==0 )
8020: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  {.    pTab->iPKe
8030: 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54  y = iCol;.    pT
8040: 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e  ab->keyConf = on
8050: 45 72 72 6f 72 3b 0a 20 20 20 20 70 54 61 62 2d  Error;.    pTab-
8060: 3e 61 75 74 6f 49 6e 63 20 3d 20 61 75 74 6f 49  >autoInc = autoI
8070: 6e 63 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  nc;.  }else if( 
8080: 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64  autoInc ){.#ifnd
8090: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
80a0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
80b0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
80c0: 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e  (pParse, "AUTOIN
80d0: 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20  CREMENT is only 
80e0: 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a  allowed on an ".
80f0: 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20         "INTEGER 
8100: 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23  PRIMARY KEY");.#
8110: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
8120: 20 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65     sqlite3Create
8130: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c  Index(pParse, 0,
8140: 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e   0, 0, pList, on
8150: 45 72 72 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20  Error, 0, 0);.  
8160: 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d    pList = 0;.  }
8170: 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  ..primary_key_ex
8180: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  it:.  sqlite3Exp
8190: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  rListDelete(pLis
81a0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  t);.  return;.}.
81b0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
81c0: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
81d0: 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
81e0: 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61  cently parsed ta
81f0: 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f  ble column.** to
8200: 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76   the CollSeq giv
8210: 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  en..*/.void sqli
8220: 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70  te3AddCollateTyp
8230: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
8240: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
8250: 70 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a  pe, int nType){.
8260: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 49 6e    Table *p;.  In
8270: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 43 6f 6c  dex *pIdx;.  Col
8280: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
8290: 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 28 70 20  nt i;..  if( (p 
82a0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
82b0: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
82c0: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
82d0: 31 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  1;..  pColl = sq
82e0: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
82f0: 65 71 28 70 50 61 72 73 65 2c 20 7a 54 79 70 65  eq(pParse, zType
8300: 2c 20 6e 54 79 70 65 29 3b 0a 20 20 70 2d 3e 61  , nType);.  p->a
8310: 43 6f 6c 5b 69 5d 2e 70 43 6f 6c 6c 20 3d 20 70  Col[i].pColl = p
8320: 43 6f 6c 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Coll;..  /* If t
8330: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63  he column is dec
8340: 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e  lared as "<name>
8350: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c   PRIMARY KEY COL
8360: 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20  LATE <type>",.  
8370: 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78  ** then an index
8380: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63   may have been c
8390: 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63  reated on this c
83a0: 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65  olumn before the
83b0: 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20  .  ** collation 
83c0: 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20  type was added. 
83d0: 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20  Correct this if 
83e0: 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  it is the case..
83f0: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 20    */.  for(pIdx 
8400: 3d 20 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  = p->pIndex; pId
8410: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
8420: 65 78 74 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ext){.    assert
8430: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d  ( pIdx->nColumn=
8440: 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  =1 );.    if( pI
8450: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
8460: 3d 69 20 29 20 70 49 64 78 2d 3e 6b 65 79 49 6e  =i ) pIdx->keyIn
8470: 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 43  fo.aColl[0] = pC
8480: 6f 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  oll;.  }.}../*.*
8490: 2a 20 4c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  * Locate and ret
84a0: 75 72 6e 20 61 6e 20 65 6e 74 72 79 20 66 72 6f  urn an entry fro
84b0: 6d 20 74 68 65 20 64 62 2e 61 43 6f 6c 6c 53 65  m the db.aCollSe
84c0: 71 20 68 61 73 68 20 74 61 62 6c 65 2e 20 49 66  q hash table. If
84d0: 20 74 68 65 20 65 6e 74 72 79 0a 2a 2a 20 73 70   the entry.** sp
84e0: 65 63 69 66 69 65 64 20 62 79 20 7a 4e 61 6d 65  ecified by zName
84f0: 20 61 6e 64 20 6e 4e 61 6d 65 20 69 73 20 6e 6f   and nName is no
8500: 74 20 66 6f 75 6e 64 20 61 6e 64 20 70 61 72 61  t found and para
8510: 6d 65 74 65 72 20 27 63 72 65 61 74 65 27 20 69  meter 'create' i
8520: 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e 20  s.** true, then 
8530: 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 6e 74  create a new ent
8540: 72 79 2e 20 4f 74 68 65 72 77 69 73 65 20 72 65  ry. Otherwise re
8550: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
8560: 20 45 61 63 68 20 70 6f 69 6e 74 65 72 20 73 74   Each pointer st
8570: 6f 72 65 64 20 69 6e 20 74 68 65 20 73 71 6c 69  ored in the sqli
8580: 74 65 33 2e 61 43 6f 6c 6c 53 65 71 20 68 61 73  te3.aCollSeq has
8590: 68 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73  h table contains
85a0: 20 61 6e 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20   an.** array of 
85b0: 74 68 72 65 65 20 43 6f 6c 6c 53 65 71 20 73 74  three CollSeq st
85c0: 72 75 63 74 75 72 65 73 2e 20 54 68 65 20 66 69  ructures. The fi
85d0: 72 73 74 20 69 73 20 74 68 65 20 63 6f 6c 6c 61  rst is the colla
85e0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2a  tion sequence.**
85f0: 20 70 72 65 66 66 65 72 72 65 64 20 66 6f 72 20   prefferred for 
8600: 55 54 46 2d 38 2c 20 74 68 65 20 73 65 63 6f 6e  UTF-8, the secon
8610: 64 20 55 54 46 2d 31 36 6c 65 2c 20 61 6e 64 20  d UTF-16le, and 
8620: 74 68 65 20 74 68 69 72 64 20 55 54 46 2d 31 36  the third UTF-16
8630: 62 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 64  be..**.** Stored
8640: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
8650: 65 72 20 74 68 65 20 74 68 72 65 65 20 63 6f 6c  er the three col
8660: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
8670: 20 69 73 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a   is a copy of.**
8680: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
8690: 65 71 75 65 6e 63 65 20 6e 61 6d 65 2e 20 41 20  equence name. A 
86a0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
86b0: 73 74 72 69 6e 67 20 69 73 20 73 74 6f 72 65 64  string is stored
86c0: 20 69 6e 0a 2a 2a 20 65 61 63 68 20 63 6f 6c 6c   in.** each coll
86d0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 73  ation sequence s
86e0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
86f0: 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 20 66 69  tic CollSeq * fi
8700: 6e 64 43 6f 6c 6c 53 65 71 45 6e 74 72 79 28 0a  ndCollSeqEntry(.
8710: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
8720: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
8730: 6d 65 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c  me,.  int nName,
8740: 0a 20 20 69 6e 74 20 63 72 65 61 74 65 0a 29 7b  .  int create.){
8750: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
8760: 6c 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30  l;.  if( nName<0
8770: 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65   ) nName = strle
8780: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 43 6f 6c  n(zName);.  pCol
8790: 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  l = sqlite3HashF
87a0: 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ind(&db->aCollSe
87b0: 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  q, zName, nName)
87c0: 3b 0a 0a 20 20 69 66 28 20 30 3d 3d 70 43 6f 6c  ;..  if( 0==pCol
87d0: 6c 20 26 26 20 63 72 65 61 74 65 20 29 7b 0a 20  l && create ){. 
87e0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
87f0: 65 4d 61 6c 6c 6f 63 28 20 33 2a 73 69 7a 65 6f  eMalloc( 3*sizeo
8800: 66 28 2a 70 43 6f 6c 6c 29 20 2b 20 6e 4e 61 6d  f(*pColl) + nNam
8810: 65 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28  e + 1 );.    if(
8820: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
8830: 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 20 3d  pColl[0].zName =
8840: 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 33   (char*)&pColl[3
8850: 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 30  ];.      pColl[0
8860: 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ].enc = SQLITE_U
8870: 54 46 38 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  TF8;.      pColl
8880: 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  [1].zName = (cha
8890: 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20  r*)&pColl[3];.  
88a0: 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e 65 6e 63      pColl[1].enc
88b0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c   = SQLITE_UTF16L
88c0: 45 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 32  E;.      pColl[2
88d0: 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ].zName = (char*
88e0: 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20  )&pColl[3];.    
88f0: 20 20 70 43 6f 6c 6c 5b 32 5d 2e 65 6e 63 20 3d    pColl[2].enc =
8900: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b   SQLITE_UTF16BE;
8910: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43  .      memcpy(pC
8920: 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  oll[0].zName, zN
8930: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
8940: 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d     pColl[0].zNam
8950: 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20  e[nName] = 0;.  
8960: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
8970: 6e 73 65 72 74 28 26 64 62 2d 3e 61 43 6f 6c 6c  nsert(&db->aColl
8980: 53 65 71 2c 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e  Seq, pColl[0].zN
8990: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 70 43 6f 6c  ame, nName, pCol
89a0: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  l);.    }.  }.  
89b0: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
89c0: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
89d0: 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f   zName points to
89e0: 20 61 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64   a UTF-8 encoded
89f0: 20 73 74 72 69 6e 67 20 6e 4e 61 6d 65 20 62 79   string nName by
8a00: 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2a 20 52 65 74  tes long..** Ret
8a10: 75 72 6e 20 74 68 65 20 43 6f 6c 6c 53 65 71 2a  urn the CollSeq*
8a20: 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 74 68 65   pointer for the
8a30: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
8a40: 6e 63 65 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 0a  nce named zName.
8a50: 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 63 6f 64  ** for the encod
8a60: 69 6e 67 20 27 65 6e 63 27 20 66 72 6f 6d 20 74  ing 'enc' from t
8a70: 68 65 20 64 61 74 61 62 61 73 65 20 27 64 62 27  he database 'db'
8a80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
8a90: 6e 74 72 79 20 73 70 65 63 69 66 69 65 64 20 69  ntry specified i
8aa0: 73 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 64 20  s not found and 
8ab0: 27 63 72 65 61 74 65 27 20 69 73 20 74 72 75 65  'create' is true
8ac0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 0a  , then create a.
8ad0: 2a 2a 20 6e 65 77 20 65 6e 74 72 79 2e 20 20 4f  ** new entry.  O
8ae0: 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
8af0: 4e 55 4c 4c 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  NULL..*/.CollSeq
8b00: 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c   *sqlite3FindCol
8b10: 6c 53 65 71 28 0a 20 20 73 71 6c 69 74 65 33 20  lSeq(.  sqlite3 
8b20: 2a 64 62 2c 0a 20 20 75 38 20 65 6e 63 2c 0a 20  *db,.  u8 enc,. 
8b30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
8b40: 6d 65 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c  me,.  int nName,
8b50: 0a 20 20 69 6e 74 20 63 72 65 61 74 65 0a 29 7b  .  int create.){
8b60: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
8b70: 6c 20 3d 20 66 69 6e 64 43 6f 6c 6c 53 65 71 45  l = findCollSeqE
8b80: 6e 74 72 79 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ntry(db, zName, 
8b90: 6e 4e 61 6d 65 2c 20 63 72 65 61 74 65 29 3b 0a  nName, create);.
8ba0: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
8bb0: 5f 55 54 46 38 3d 3d 31 20 26 26 20 53 51 4c 49  _UTF8==1 && SQLI
8bc0: 54 45 5f 55 54 46 31 36 4c 45 3d 3d 32 20 26 26  TE_UTF16LE==2 &&
8bd0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3d   SQLITE_UTF16BE=
8be0: 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =3 );.  assert( 
8bf0: 65 6e 63 3e 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc>=SQLITE_UTF8
8c00: 20 26 26 20 65 6e 63 3c 3d 53 51 4c 49 54 45 5f   && enc<=SQLITE_
8c10: 55 54 46 31 36 42 45 20 29 3b 0a 20 20 69 66 28  UTF16BE );.  if(
8c20: 20 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 2b   pColl ) pColl +
8c30: 3d 20 65 6e 63 2d 31 3b 0a 20 20 72 65 74 75 72  = enc-1;.  retur
8c40: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pColl;.}../*.*
8c50: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 27 63 6f  * Invoke the 'co
8c60: 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 27 20  llation needed' 
8c70: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 72 65 71 75  callback to requ
8c80: 65 73 74 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20  est a collation 
8c90: 73 65 71 75 65 6e 63 65 0a 2a 2a 20 69 6e 20 74  sequence.** in t
8ca0: 68 65 20 64 61 74 61 62 61 73 65 20 74 65 78 74  he database text
8cb0: 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 6e 61 6d   encoding of nam
8cc0: 65 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  e zName, length 
8cd0: 6e 4e 61 6d 65 2e 0a 2a 2a 20 49 66 20 74 68 65  nName..** If the
8ce0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
8cf0: 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nce.*/.static vo
8d00: 69 64 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65  id callCollNeede
8d10: 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  d(sqlite3 *db, c
8d20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
8d30: 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20  , int nName){.  
8d40: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 78 43 6f  assert( !db->xCo
8d50: 6c 6c 4e 65 65 64 65 64 20 7c 7c 20 21 64 62 2d  llNeeded || !db-
8d60: 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 29  >xCollNeeded16 )
8d70: 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20  ;.  if( nName<0 
8d80: 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e  ) nName = strlen
8d90: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 64  (zName);.  if( d
8da0: 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 29  b->xCollNeeded )
8db0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78 74  {.    char *zExt
8dc0: 65 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 53 74  ernal = sqliteSt
8dd0: 72 4e 44 75 70 28 7a 4e 61 6d 65 2c 20 6e 4e 61  rNDup(zName, nNa
8de0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 45  me);.    if( !zE
8df0: 78 74 65 72 6e 61 6c 20 29 20 72 65 74 75 72 6e  xternal ) return
8e00: 3b 0a 20 20 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  ;.    db->xCollN
8e10: 65 65 64 65 64 28 64 62 2d 3e 70 43 6f 6c 6c 4e  eeded(db->pCollN
8e20: 65 65 64 65 64 41 72 67 2c 20 64 62 2c 20 28 69  eededArg, db, (i
8e30: 6e 74 29 64 62 2d 3e 65 6e 63 2c 20 7a 45 78 74  nt)db->enc, zExt
8e40: 65 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  ernal);.    sqli
8e50: 74 65 46 72 65 65 28 7a 45 78 74 65 72 6e 61 6c  teFree(zExternal
8e60: 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  );.  }.#ifndef S
8e70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
8e80: 0a 20 20 69 66 28 20 64 62 2d 3e 78 43 6f 6c 6c  .  if( db->xColl
8e90: 4e 65 65 64 65 64 31 36 20 29 7b 0a 20 20 20 20  Needed16 ){.    
8ea0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 45 78 74  char const *zExt
8eb0: 65 72 6e 61 6c 3b 0a 20 20 20 20 73 71 6c 69 74  ernal;.    sqlit
8ec0: 65 33 5f 76 61 6c 75 65 20 2a 70 54 6d 70 20 3d  e3_value *pTmp =
8ed0: 20 73 71 6c 69 74 65 33 47 65 74 54 72 61 6e 73   sqlite3GetTrans
8ee0: 69 65 6e 74 56 61 6c 75 65 28 64 62 29 3b 0a 20  ientValue(db);. 
8ef0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
8f00: 65 74 53 74 72 28 70 54 6d 70 2c 20 2d 31 2c 20  etStr(pTmp, -1, 
8f10: 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54  zName, SQLITE_UT
8f20: 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
8f30: 43 29 3b 0a 20 20 20 20 7a 45 78 74 65 72 6e 61  C);.    zExterna
8f40: 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
8f50: 54 65 78 74 28 70 54 6d 70 2c 20 53 51 4c 49 54  Text(pTmp, SQLIT
8f60: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a  E_UTF16NATIVE);.
8f70: 20 20 20 20 69 66 28 20 21 7a 45 78 74 65 72 6e      if( !zExtern
8f80: 61 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  al ) return;.   
8f90: 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
8fa0: 31 36 28 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64  16(db->pCollNeed
8fb0: 65 64 41 72 67 2c 20 64 62 2c 20 28 69 6e 74 29  edArg, db, (int)
8fc0: 64 62 2d 3e 65 6e 63 2c 20 7a 45 78 74 65 72 6e  db->enc, zExtern
8fd0: 61 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  al);.  }.#endif.
8fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8ff0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
9000: 69 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  if the collation
9010: 20 66 61 63 74 6f 72 79 20 66 61 69 6c 73 20 74   factory fails t
9020: 6f 20 64 65 6c 69 76 65 72 20 61 0a 2a 2a 20 63  o deliver a.** c
9030: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
9040: 6e 20 69 6e 20 74 68 65 20 62 65 73 74 20 65 6e  n in the best en
9050: 63 6f 64 69 6e 67 20 62 75 74 20 74 68 65 72 65  coding but there
9060: 20 6d 61 79 20 62 65 20 6f 74 68 65 72 20 76 65   may be other ve
9070: 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 74 68 69  rsions.** of thi
9080: 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  s collation func
9090: 74 69 6f 6e 20 28 66 6f 72 20 6f 74 68 65 72 20  tion (for other 
90a0: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73 29 20  text encodings) 
90b0: 61 76 61 69 6c 61 62 6c 65 2e 20 55 73 65 20 6f  available. Use o
90c0: 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 73 65 20 69  ne.** of these i
90d0: 6e 73 74 65 61 64 20 69 66 20 74 68 65 79 20 65  nstead if they e
90e0: 78 69 73 74 2e 20 41 76 6f 69 64 20 61 20 55 54  xist. Avoid a UT
90f0: 46 2d 38 20 3c 2d 3e 20 55 54 46 2d 31 36 20 63  F-8 <-> UTF-16 c
9100: 6f 6e 76 65 72 73 69 6f 6e 20 69 66 0a 2a 2a 20  onversion if.** 
9110: 70 6f 73 73 69 62 6c 65 2e 0a 2a 2f 0a 73 74 61  possible..*/.sta
9120: 74 69 63 20 69 6e 74 20 73 79 6e 74 68 43 6f 6c  tic int synthCol
9130: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
9140: 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  se, CollSeq *pCo
9150: 6c 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ll){.  CollSeq *
9160: 70 43 6f 6c 6c 32 3b 0a 20 20 63 68 61 72 20 2a  pColl2;.  char *
9170: 7a 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  z = pColl->zName
9180: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c  ;.  int n = strl
9190: 65 6e 28 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33  en(z);.  sqlite3
91a0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
91b0: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  b;.  int i;.  st
91c0: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45  atic const u8 aE
91d0: 6e 63 5b 5d 20 3d 20 7b 20 53 51 4c 49 54 45 5f  nc[] = { SQLITE_
91e0: 55 54 46 31 36 42 45 2c 20 53 51 4c 49 54 45 5f  UTF16BE, SQLITE_
91f0: 55 54 46 31 36 4c 45 2c 20 53 51 4c 49 54 45 5f  UTF16LE, SQLITE_
9200: 55 54 46 38 20 7d 3b 0a 20 20 66 6f 72 28 69 3d  UTF8 };.  for(i=
9210: 30 3b 20 69 3c 33 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<3; i++){.  
9220: 20 20 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69 74    pColl2 = sqlit
9230: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
9240: 2c 20 61 45 6e 63 5b 69 5d 2c 20 7a 2c 20 6e 2c  , aEnc[i], z, n,
9250: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   0);.    if( pCo
9260: 6c 6c 32 2d 3e 78 43 6d 70 21 3d 30 20 29 7b 0a  ll2->xCmp!=0 ){.
9270: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f        memcpy(pCo
9280: 6c 6c 2c 20 70 43 6f 6c 6c 32 2c 20 73 69 7a 65  ll, pColl2, size
9290: 6f 66 28 43 6f 6c 6c 53 65 71 29 29 3b 0a 20 20  of(CollSeq));.  
92a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
92b0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
92c0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
92d0: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  rr==0 ){.    sql
92e0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
92f0: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f  rse, "no such co
9300: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
9310: 3a 20 25 2e 2a 73 22 2c 20 6e 2c 20 7a 29 3b 0a  : %.*s", n, z);.
9320: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 45    }.  pParse->nE
9330: 72 72 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 53  rr++;.  return S
9340: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
9350: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
9360: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  ne is called on 
9370: 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
9380: 65 6e 63 65 20 62 65 66 6f 72 65 20 69 74 20 69  ence before it i
9390: 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63 68 65  s used to.** che
93a0: 63 6b 20 74 68 61 74 20 69 74 20 69 73 20 64 65  ck that it is de
93b0: 66 69 6e 65 64 2e 20 41 6e 20 75 6e 64 65 66 69  fined. An undefi
93c0: 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ned collation se
93d0: 71 75 65 6e 63 65 20 65 78 69 73 74 73 20 77 68  quence exists wh
93e0: 65 6e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65  en.** a database
93f0: 20 69 73 20 6c 6f 61 64 65 64 20 74 68 61 74 20   is loaded that 
9400: 63 6f 6e 74 61 69 6e 73 20 72 65 66 65 72 65 6e  contains referen
9410: 63 65 73 20 74 6f 20 63 6f 6c 6c 61 74 69 6f 6e  ces to collation
9420: 20 73 65 71 75 65 6e 63 65 73 0a 2a 2a 20 74 68   sequences.** th
9430: 61 74 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e  at have not been
9440: 20 64 65 66 69 6e 65 64 20 62 79 20 73 71 6c 69   defined by sqli
9450: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
9460: 74 69 6f 6e 28 29 20 65 74 63 2e 0a 2a 2a 0a 2a  tion() etc..**.*
9470: 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 74  * If required, t
9480: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c  his routine call
9490: 73 20 74 68 65 20 27 63 6f 6c 6c 61 74 69 6f 6e  s the 'collation
94a0: 20 6e 65 65 64 65 64 27 20 63 61 6c 6c 62 61 63   needed' callbac
94b0: 6b 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20  k to.** request 
94c0: 61 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20  a definition of 
94d0: 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
94e0: 71 75 65 6e 63 65 2e 20 49 66 20 74 68 69 73 20  quence. If this 
94f0: 64 6f 65 73 6e 27 74 20 77 6f 72 6b 2c 20 0a 2a  doesn't work, .*
9500: 2a 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  * an equivalent 
9510: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
9520: 63 65 20 74 68 61 74 20 75 73 65 73 20 61 20 74  ce that uses a t
9530: 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 64 69 66  ext encoding dif
9540: 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 74  ferent.** from t
9550: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
9560: 20 69 73 20 73 75 62 73 74 69 74 75 74 65 64 2c   is substituted,
9570: 20 69 66 20 6f 6e 65 20 69 73 20 61 76 61 69 6c   if one is avail
9580: 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
9590: 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71  ite3CheckCollSeq
95a0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
95b0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b  CollSeq *pColl){
95c0: 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20  .  if( pColl && 
95d0: 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a  !pColl->xCmp ){.
95e0: 20 20 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74      /* No collat
95f0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ion sequence of 
9600: 74 68 69 73 20 74 79 70 65 20 66 6f 72 20 74 68  this type for th
9610: 69 73 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 72  is encoding is r
9620: 65 67 69 73 74 65 72 65 64 2e 0a 20 20 20 20 2a  egistered..    *
9630: 2a 20 43 61 6c 6c 20 74 68 65 20 63 6f 6c 6c 61  * Call the colla
9640: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 74 6f 20  tion factory to 
9650: 73 65 65 20 69 66 20 69 74 20 63 61 6e 20 73 75  see if it can su
9660: 70 70 6c 79 20 75 73 20 77 69 74 68 20 6f 6e 65  pply us with one
9670: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 6c  ..    */.    cal
9680: 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 70 50 61 72  lCollNeeded(pPar
9690: 73 65 2d 3e 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a  se->db, pColl->z
96a0: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 43 6f  Name, strlen(pCo
96b0: 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ll->zName));.   
96c0: 20 69 66 28 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d   if( !pColl->xCm
96d0: 70 20 26 26 20 73 79 6e 74 68 43 6f 6c 6c 53 65  p && synthCollSe
96e0: 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29  q(pParse, pColl)
96f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
9700: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
9710: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9720: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
9730: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  /*.** Call sqlit
9740: 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 29  e3CheckCollSeq()
9750: 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 6c 61 74 69   for all collati
9760: 6e 67 20 73 65 71 75 65 6e 63 65 73 20 69 6e 20  ng sequences in 
9770: 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 69 6e 20  an index,.** in 
9780: 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66 79 20  order to verify 
9790: 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6e 65 63  that all the nec
97a0: 65 73 73 61 72 79 20 63 6f 6c 6c 61 74 69 6e 67  essary collating
97b0: 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 0a 2a   sequences are.*
97c0: 2a 20 6c 6f 61 64 65 64 2e 0a 2a 2f 0a 69 6e 74  * loaded..*/.int
97d0: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 49 6e 64   sqlite3CheckInd
97e0: 65 78 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  exCollSeq(Parse 
97f0: 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
9800: 70 49 64 78 29 7b 0a 20 20 69 66 28 20 70 49 64  pIdx){.  if( pId
9810: 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  x ){.    int i;.
9820: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
9830: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
9840: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
9850: 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65  lite3CheckCollSe
9860: 71 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e  q(pParse, pIdx->
9870: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d  keyInfo.aColl[i]
9880: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
9890: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
98a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
98b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
98c0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
98d0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
98e0: 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61  eturns the colla
98f0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
9900: 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  r database nativ
9910: 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69  e text.** encodi
9920: 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ng identified by
9930: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d   the string zNam
9940: 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e  e, length nName.
9950: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
9960: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
9970: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f  n sequence is no
9980: 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  t available, or 
9990: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  not available.**
99a0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
99b0: 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67   native encoding
99c0: 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  , the collation 
99d0: 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b  factory is invok
99e0: 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74  ed to.** request
99f0: 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c   it. If the coll
9a00: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f  ation factory do
9a10: 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75  es not supply su
9a20: 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a  ch a sequence,.*
9a30: 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e  * and the sequen
9a40: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
9a50: 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20  in another text 
9a60: 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74  encoding, then t
9a70: 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  hat is.** return
9a80: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
9a90: 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73  * If no versions
9aa0: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65   of the requeste
9ab0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71  d collations seq
9ac0: 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61  uence are availa
9ad0: 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68  ble, or.** anoth
9ae0: 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  er error occurs,
9af0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
9b00: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d  d and an error m
9b10: 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69  essage written i
9b20: 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a  nto.** pParse..*
9b30: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
9b40: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
9b50: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
9b60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
9b70: 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20  , int nName){.  
9b80: 75 38 20 65 6e 63 20 3d 20 70 50 61 72 73 65 2d  u8 enc = pParse-
9b90: 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 75 38 20 69  >db->enc;.  u8 i
9ba0: 6e 69 74 62 75 73 79 20 3d 20 70 50 61 72 73 65  nitbusy = pParse
9bb0: 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b  ->db->init.busy;
9bc0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
9bd0: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
9be0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2d 3e 64  ollSeq(pParse->d
9bf0: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e  b, enc, zName, n
9c00: 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b  Name, initbusy);
9c10: 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29  .  if( nName<0 )
9c20: 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
9c30: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69  zName);.  if( !i
9c40: 6e 69 74 62 75 73 79 20 26 26 20 28 21 70 43 6f  nitbusy && (!pCo
9c50: 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43  ll || !pColl->xC
9c60: 6d 70 29 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  mp) ){.    /* No
9c70: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
9c80: 6e 63 65 20 6f 66 20 74 68 69 73 20 74 79 70 65  nce of this type
9c90: 20 66 6f 72 20 74 68 69 73 20 65 6e 63 6f 64 69   for this encodi
9ca0: 6e 67 20 69 73 20 72 65 67 69 73 74 65 72 65 64  ng is registered
9cb0: 2e 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 20 74 68  ..    ** Call th
9cc0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
9cd0: 6f 72 79 20 74 6f 20 73 65 65 20 69 66 20 69 74  ory to see if it
9ce0: 20 63 61 6e 20 73 75 70 70 6c 79 20 75 73 20 77   can supply us w
9cf0: 69 74 68 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a  ith one..    */.
9d00: 20 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64      callCollNeed
9d10: 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ed(pParse->db, z
9d20: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
9d30: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
9d40: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61  3FindCollSeq(pPa
9d50: 72 73 65 2d 3e 64 62 2c 20 65 6e 63 2c 20 7a 4e  rse->db, enc, zN
9d60: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a  ame, nName, 0);.
9d70: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26      if( pColl &&
9d80: 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b   !pColl->xCmp ){
9d90: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
9da0: 6d 61 79 20 62 65 20 61 20 76 65 72 73 69 6f 6e  may be a version
9db0: 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   of the collatio
9dc0: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
9dd0: 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
9de0: 2a 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62 65  * translation be
9df0: 74 77 65 65 6e 20 65 6e 63 6f 64 69 6e 67 73 2e  tween encodings.
9e00: 20 53 65 61 72 63 68 20 66 6f 72 20 69 74 20 77   Search for it w
9e10: 69 74 68 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71  ith synthCollSeq
9e20: 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ()..      */.   
9e30: 20 20 20 69 66 28 20 73 79 6e 74 68 43 6f 6c 6c     if( synthColl
9e40: 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  Seq(pParse, pCol
9e50: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  l) ){.        re
9e60: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
9e70: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9e80: 49 66 20 6e 6f 74 68 69 6e 67 20 68 61 73 20 62  If nothing has b
9e90: 65 65 6e 20 66 6f 75 6e 64 2c 20 77 72 69 74 65  een found, write
9ea0: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
9eb0: 67 65 20 69 6e 74 6f 20 70 50 61 72 73 65 20 2a  ge into pParse *
9ec0: 2f 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73  /.  if( !initbus
9ed0: 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20  y && (!pColl || 
9ee0: 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b  !pColl->xCmp) ){
9ef0: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
9f00: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
9f10: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9f20: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
9f30: 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ch collation seq
9f40: 75 65 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e  uence: %.*s", nN
9f50: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ame, zName);.   
9f60: 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30   }.    pColl = 0
9f70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
9f80: 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Coll;.}.../*.** 
9f90: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
9fa0: 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e  at will incremen
9fb0: 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  t the schema coo
9fc0: 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  kie..**.** The s
9fd0: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20  chema cookie is 
9fe0: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
9ff0: 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d  e when the schem
a000: 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74  a for the.** dat
a010: 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
a020: 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d  After each schem
a030: 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f  a change, the co
a040: 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68  okie value.** ch
a050: 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70  anges.  When a p
a060: 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61  rocess first rea
a070: 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74  ds the schema it
a080: 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20   records the.** 
a090: 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66  cookie.  Thereaf
a0a0: 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74  ter, whenever it
a0b0: 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20   goes to access 
a0c0: 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a  the database,.**
a0d0: 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63   it checks the c
a0e0: 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75  ookie to make su
a0f0: 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61  re the schema ha
a100: 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a  s not changed.**
a110: 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61   since it was la
a120: 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  st read..**.** T
a130: 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20  his plan is not 
a140: 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65  completely bulle
a150: 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20  t-proof.  It is 
a160: 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20  possible for.** 
a170: 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68  the schema to ch
a180: 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69  ange multiple ti
a190: 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20  mes and for the 
a1a0: 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20  cookie to be.** 
a1b0: 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f  set back to prio
a1c0: 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63  r value.  But sc
a1d0: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65  hema changes are
a1e0: 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61   infrequent.** a
a1f0: 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  nd the probabili
a200: 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68  ty of hitting th
a210: 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61  e same cookie va
a220: 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31  lue is only.** 1
a230: 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e   chance in 2^32.
a240: 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20    So we're safe 
a250: 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20  enough..*/.void 
a260: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
a270: 6b 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  kie(sqlite3 *db,
a280: 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 44   Vdbe *v, int iD
a290: 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b){.  sqlite3Vdb
a2a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
a2b0: 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44  eger, db->aDb[iD
a2c0: 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  b].schema_cookie
a2d0: 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  +1, 0);.  sqlite
a2e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a2f0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
a300: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65   0);.}../*.** Me
a310: 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72  asure the number
a320: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e   of characters n
a330: 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20  eeded to output 
a340: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65  the given.** ide
a350: 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75  ntifier.  The nu
a360: 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e  mber returned in
a370: 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65  cludes any quote
a380: 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f  s used.** but do
a390: 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74  es not include t
a3a0: 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74  he null terminat
a3b0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73  or..**.** The es
a3c0: 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72  timate is conser
a3d0: 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68  vative.  It migh
a3e0: 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 74  t be larger that
a3f0: 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c   what is.** real
a400: 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  ly needed..*/.st
a410: 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65  atic int identLe
a420: 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  ngth(const char 
a430: 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *z){.  int n;.  
a440: 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b  for(n=0; *z; n++
a450: 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , z++){.    if( 
a460: 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20  *z=='"' ){ n++; 
a470: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
a480: 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   + 2;.}../*.** W
a490: 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66 69  rite an identifi
a4a0: 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  er onto the end 
a4b0: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  of the given str
a4c0: 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f  ing.  Add.** quo
a4d0: 74 65 20 63 68 61 72 61 63 74 65 72 73 20 61 73  te characters as
a4e0: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
a4f0: 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74  ic void identPut
a500: 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70  (char *z, int *p
a510: 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e  Idx, char *zSign
a520: 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69  edIdent){.  unsi
a530: 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e  gned char *zIden
a540: 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  t = (unsigned ch
a550: 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74  ar*)zSignedIdent
a560: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65  ;.  int i, j, ne
a570: 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a  edQuote;.  i = *
a580: 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  pIdx;.  for(j=0;
a590: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
a5a0: 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e  {.    if( !isaln
a5b0: 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26  um(zIdent[j]) &&
a5c0: 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20   zIdent[j]!='_' 
a5d0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e  ) break;.  }.  n
a5e0: 65 65 64 51 75 6f 74 65 20 3d 20 20 7a 49 64 65  eedQuote =  zIde
a5f0: 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69  nt[j]!=0 || isdi
a600: 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20  git(zIdent[0]). 
a610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a620: 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f   || sqlite3Keywo
a630: 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a  rdCode(zIdent, j
a640: 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20  )!=TK_ID;.  if( 
a650: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
a660: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28  +] = '"';.  for(
a670: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
a680: 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d  j++){.    z[i++]
a690: 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20   = zIdent[j];.  
a6a0: 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d    if( zIdent[j]=
a6b0: 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  ='"' ) z[i++] = 
a6c0: 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  '"';.  }.  if( n
a6d0: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
a6e0: 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20  ] = '"';.  z[i] 
a6f0: 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69  = 0;.  *pIdx = i
a700: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
a710: 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42  ate a CREATE TAB
a720: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70  LE statement app
a730: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
a740: 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e   given.** table.
a750: 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64    Memory to hold
a760: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
a770: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62   statement is ob
a780: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73  tained.** from s
a790: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
a7a0: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
a7b0: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
a7c0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
a7d0: 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54  ic char *createT
a7e0: 61 62 6c 65 53 74 6d 74 28 54 61 62 6c 65 20 2a  ableStmt(Table *
a7f0: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20  p){.  int i, k, 
a800: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  n;.  char *zStmt
a810: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20  ;.  char *zSep, 
a820: 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 2c 20 2a  *zSep2, *zEnd, *
a830: 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  z;.  Column *pCo
a840: 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f  l;.  n = 0;.  fo
a850: 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c  r(pCol = p->aCol
a860: 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  , i=0; i<p->nCol
a870: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
a880: 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65      n += identLe
a890: 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ngth(pCol->zName
a8a0: 29 3b 0a 20 20 20 20 7a 20 3d 20 70 43 6f 6c 2d  );.    z = pCol-
a8b0: 3e 7a 54 79 70 65 3b 0a 20 20 20 20 69 66 28 20  >zType;.    if( 
a8c0: 7a 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20  z ){.      n += 
a8d0: 28 73 74 72 6c 65 6e 28 7a 29 20 2b 20 31 29 3b  (strlen(z) + 1);
a8e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 20 2b  .    }.  }.  n +
a8f0: 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d  = identLength(p-
a900: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e  >zName);.  if( n
a910: 3c 35 30 20 29 7b 0a 20 20 20 20 7a 53 65 70 20  <50 ){.    zSep 
a920: 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  = "";.    zSep2 
a930: 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20  = ",";.    zEnd 
a940: 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = ")";.  }else{.
a950: 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20      zSep = "\n  
a960: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
a970: 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64  ,\n  ";.    zEnd
a980: 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20   = "\n)";.  }.  
a990: 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e  n += 35 + 6*p->n
a9a0: 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73  Col;.  zStmt = s
a9b0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
a9c0: 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74  n );.  if( zStmt
a9d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
a9e0: 20 20 73 74 72 63 70 79 28 7a 53 74 6d 74 2c 20    strcpy(zStmt, 
a9f0: 70 2d 3e 69 44 62 3d 3d 31 20 3f 20 22 43 52 45  p->iDb==1 ? "CRE
aa00: 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 22  ATE TEMP TABLE "
aa10: 20 3a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45   : "CREATE TABLE
aa20: 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65   ");.  k = strle
aa30: 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e  n(zStmt);.  iden
aa40: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
aa50: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74  p->zName);.  zSt
aa60: 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20  mt[k++] = '(';. 
aa70: 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f   for(pCol=p->aCo
aa80: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
aa90: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
aaa0: 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74  .    strcpy(&zSt
aab0: 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20  mt[k], zSep);.  
aac0: 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a    k += strlen(&z
aad0: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
aae0: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
aaf0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
ab00: 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  &k, pCol->zName)
ab10: 3b 0a 20 20 20 20 69 66 28 20 28 7a 20 3d 20 70  ;.    if( (z = p
ab20: 43 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29  Col->zType)!=0 )
ab30: 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b  {.      zStmt[k+
ab40: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
ab50: 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  strcpy(&zStmt[k]
ab60: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 6b 20 2b 3d  , z);.      k +=
ab70: 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20   strlen(z);.    
ab80: 7d 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 26  }.  }.  strcpy(&
ab90: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b  zStmt[k], zEnd);
aba0: 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b  .  return zStmt;
abb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
abc0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
abd0: 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66   to report the f
abe0: 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65  inal ")" that te
abf0: 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52  rminates.** a CR
ac00: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
ac10: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
ac20: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
ac30: 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f  that other actio
ac40: 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20  n routines have 
ac50: 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a  been building.**
ac60: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
ac70: 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74   internal hash t
ac80: 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20  ables, assuming 
ac90: 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a  no errors have.*
aca0: 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a  * occurred..**.*
acb0: 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  * An entry for t
acc0: 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65  he table is made
acd0: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74   in the master t
ace0: 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e  able on disk, un
acf0: 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20  less.** this is 
ad00: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
ad10: 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75  e or db->init.bu
ad20: 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d  sy==1.  When db-
ad30: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a  >init.busy==1.**
ad40: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
ad50: 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c   reading the sql
ad60: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
ad70: 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74   because we just
ad80: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f  .** connected to
ad90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72   the database or
ada0: 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c   because the sql
adb0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
adc0: 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79   has.** recently
add0: 20 63 68 61 6e 67 65 73 2c 20 73 6f 20 74 68 65   changes, so the
ade0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20   entry for this 
adf0: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78  table already ex
ae00: 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73  ists in.** the s
ae10: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
ae20: 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77  le.  We do not w
ae30: 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74  ant to create it
ae40: 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66   again..**.** If
ae50: 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67   the pSelect arg
ae60: 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  ument is not NUL
ae70: 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  L, it means that
ae80: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
ae90: 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63   was called to c
aea0: 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65  reate a table ge
aeb0: 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a  nerated from a .
aec0: 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  ** "CREATE TABLE
aed0: 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e   ... AS SELECT .
aee0: 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  .." statement.  
aef0: 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  The column names
af00: 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74   of.** the new t
af10: 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20  able will match 
af20: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
af30: 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f  f the SELECT..*/
af40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64  .void sqlite3End
af50: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
af60: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  rse, Token *pEnd
af70: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
af80: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  t){.  Table *p;.
af90: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
afa0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
afb0: 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70  f( (pEnd==0 && p
afc0: 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50  Select==0) || pP
afd0: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
afe0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
aff0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
b000: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
b010: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
b020: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  0 ) return;..  a
b030: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
b040: 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63  .busy || !pSelec
b050: 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t );..  /* If th
b060: 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
b070: 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65  is 1 it means we
b080: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
b090: 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a   SQL off the.  *
b0a0: 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  * "sqlite_master
b0b0: 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d  " or "sqlite_tem
b0c0: 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20  p_master" table 
b0d0: 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a  on the disk..  *
b0e0: 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74  * So do not writ
b0f0: 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67  e to the disk ag
b100: 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68  ain.  Extract th
b110: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
b120: 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
b130: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64  table from the d
b140: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20  b->init.newTnum 
b150: 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67  field.  (The pag
b160: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68  e number.  ** sh
b170: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
b180: 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20  ut there by the 
b190: 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75  sqliteOpenCb rou
b1a0: 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66  tine.).  */.  if
b1b0: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
b1c0: 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d  ){.    p->tnum =
b1d0: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
b1e0: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  m;.  }..  /* If 
b1f0: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  not initializing
b200: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
b210: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e  record for the n
b220: 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  ew table.  ** in
b230: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
b240: 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ER table of the 
b250: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72  database.  The r
b260: 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a  ecord number.  *
b270: 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  * for the new ta
b280: 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64  ble entry should
b290: 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74   already be on t
b2a0: 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20  he stack..  **. 
b2b0: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
b2c0: 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65   TEMPORARY table
b2d0: 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72  , write the entr
b2e0: 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c  y into the auxil
b2f0: 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69  iary.  ** file i
b300: 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74  nstead of into t
b310: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
b320: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
b330: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
b340: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20   ){.    int n;. 
b350: 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
b360: 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20  char *zType;    
b370: 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61  /* "view" or "ta
b380: 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  ble" */.    char
b390: 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22   *zType2;   /* "
b3a0: 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22  VIEW" or "TABLE"
b3b0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
b3c0: 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20  tmt;    /* Text 
b3d0: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
b3e0: 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49  BLE or CREATE VI
b3f0: 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EW statement */.
b400: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
b410: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
b420: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
b430: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c  return;..    sql
b440: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b450: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
b460: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ;..    /* Create
b470: 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f   the rootpage fo
b480: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  r the new table 
b490: 61 6e 64 20 70 75 73 68 20 69 74 20 6f 6e 74 6f  and push it onto
b4a0: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20   the stack..    
b4b0: 2a 2a 20 41 20 76 69 65 77 20 68 61 73 20 6e 6f  ** A view has no
b4c0: 20 72 6f 6f 74 70 61 67 65 2c 20 73 6f 20 6a 75   rootpage, so ju
b4d0: 73 74 20 70 75 73 68 20 61 20 7a 65 72 6f 20 6f  st push a zero o
b4e0: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20 66 6f  nto the stack fo
b4f0: 72 0a 20 20 20 20 2a 2a 20 76 69 65 77 73 2e 20  r.    ** views. 
b500: 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70   Initialize zTyp
b510: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
b520: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  me..    */.    i
b530: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  f( p->pSelect==0
b540: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72   ){.      /* A r
b550: 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a  egular table */.
b560: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
b570: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b580: 43 72 65 61 74 65 54 61 62 6c 65 2c 20 70 2d 3e  CreateTable, p->
b590: 69 44 62 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20  iDb, 0); */.    
b5a0: 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65    zType = "table
b5b0: 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20  ";.      zType2 
b5c0: 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64  = "TABLE";.#ifnd
b5d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
b5e0: 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  IEW.    }else{. 
b5f0: 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a       /* A view *
b600: 2f 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65  /.    /*  sqlite
b610: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b620: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
b630: 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
b640: 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20  = "view";.      
b650: 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b  zType2 = "VIEW";
b660: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
b670: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
b680: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
b690: 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  xx AS SELECT ...
b6a0: 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45  , execute the SE
b6b0: 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74  LECT.    ** stat
b6c0: 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74  ement to populat
b6d0: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  e the new table.
b6e0: 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e   The root-page n
b6f0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20  umber for the.  
b700: 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69    ** new table i
b710: 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  s on the top of 
b720: 74 68 65 20 76 64 62 65 20 73 74 61 63 6b 2e 0a  the vdbe stack..
b730: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e      **.    ** On
b740: 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61  ce the SELECT ha
b750: 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20  s been coded by 
b760: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c  sqlite3Select(),
b770: 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20   it is in a.    
b780: 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74  ** suitable stat
b790: 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74  e to query for t
b7a0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
b7b0: 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20  and types to be 
b7c0: 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  used.    ** by t
b7d0: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20  he new table..  
b7e0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65    */.    if( pSe
b7f0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 54 61  lect ){.      Ta
b800: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20  ble *pSelTab;.  
b810: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b820: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
b830: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
b840: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b850: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e   OP_Integer, p->
b860: 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  iDb, 0);.      s
b870: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b880: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
b890: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50   1, 0);.      pP
b8a0: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a  arse->nTab = 2;.
b8b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
b8c0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
b8d0: 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20  ect, SRT_Table, 
b8e0: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  1, 0, 0, 0, 0);.
b8f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b900: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
b910: 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  se, 1, 0);.     
b920: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
b930: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
b940: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
b950: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
b960: 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53  ct(pParse, 0, pS
b970: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
b980: 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29  if( pSelTab==0 )
b990: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
b9a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
b9b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
b9c0: 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
b9d0: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->nCol;.        
b9e0: 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->aCol = pSelTa
b9f0: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->aCol;.       
ba00: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
ba10: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   0;.        pSel
ba20: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
ba30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
ba40: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65  leteTable(0, pSe
ba50: 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lTab);.      }. 
ba60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d     }..    /* Com
ba70: 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74  pute the complet
ba80: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
ba90: 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  EATE statement *
baa0: 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  /.    if( pSelec
bab0: 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74  t ){.      zStmt
bac0: 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74   = createTableSt
bad0: 6d 74 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  mt(p);.    }else
bae0: 7b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64 64 72  {.      n = Addr
baf0: 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72  (pEnd->z) - Addr
bb00: 28 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f  (pParse->sNameTo
bb10: 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20  ken.z) + 1;.    
bb20: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
bb30: 33 4d 50 72 69 6e 74 66 28 22 43 52 45 41 54 45  3MPrintf("CREATE
bb40: 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65   %s %.*s", zType
bb50: 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e  2, n, pParse->sN
bb60: 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20  ameToken.z);.   
bb70: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f   }..    /* A slo
bb80: 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64  t for the record
bb90: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
bba0: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74  n allocated in t
bbb0: 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  he .    ** SQLIT
bbc0: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20  E_MASTER table. 
bbd0: 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f   We just need to
bbe0: 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f   update that slo
bbf0: 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a  t with all.    *
bc00: 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  * the informatio
bc10: 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65  n we've collecte
bc20: 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 66 6f  d.  The rowid fo
bc30: 72 20 74 68 65 20 70 72 65 61 6c 6c 6f 63 61 74  r the preallocat
bc40: 65 64 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69  ed.    ** slot i
bc50: 73 20 74 68 65 20 32 6e 64 20 69 74 65 6d 20 6f  s the 2nd item o
bc60: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54 68  n the stack.  Th
bc70: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
bc80: 63 6b 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  ck is the.    **
bc90: 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20 74   root page for t
bca0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28 6f 72  he new table (or
bcb0: 20 61 20 30 20 69 66 20 74 68 69 73 20 69 73 20   a 0 if this is 
bcc0: 61 20 76 69 65 77 29 2e 0a 20 20 20 20 2a 2f 0a  a view)..    */.
bcd0: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
bce0: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
bcf0: 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e       "UPDATE %Q.
bd00: 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53  %s ".         "S
bd10: 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61  ET type='%s', na
bd20: 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d  me=%Q, tbl_name=
bd30: 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 30 2c  %Q, rootpage=#0,
bd40: 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20   sql=%Q ".      
bd50: 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 31   "WHERE rowid=#1
bd60: 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ",.      db->aDb
bd70: 5b 70 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  [p->iDb].zName, 
bd80: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 2d 3e  SCHEMA_TABLE(p->
bd90: 69 44 62 29 2c 0a 20 20 20 20 20 20 7a 54 79 70  iDb),.      zTyp
bda0: 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
bdb0: 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
bdc0: 65 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 0a 20  e,.      zStmt. 
bdd0: 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
bde0: 46 72 65 65 28 7a 53 74 6d 74 29 3b 0a 20 20 20  Free(zStmt);.   
bdf0: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
be00: 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70 2d 3e 69  okie(db, v, p->i
be10: 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
be20: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
be30: 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43  CREMENT.    /* C
be40: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
be50: 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  e need to create
be60: 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65   an sqlite_seque
be70: 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20  nce table for.  
be80: 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61    ** keeping tra
be90: 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d  ck of autoincrem
bea0: 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f  ent keys..    */
beb0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 75 74 6f  .    if( p->auto
bec0: 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 44 62 20  Inc ){.      Db 
bed0: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
bee0: 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 20 20 69  p->iDb];.      i
bef0: 66 28 20 70 44 62 2d 3e 70 53 65 71 54 61 62 3d  f( pDb->pSeqTab=
bf00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
bf10: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
bf20: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
bf30: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
bf40: 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
bf50: 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a  nce(name,seq)",.
bf60: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a            pDb->z
bf70: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  Name.        );.
bf80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
bf90: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70  ndif..    /* Rep
bfa0: 61 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20  arse everything 
bfb0: 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e  to update our in
bfc0: 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75  ternal data stru
bfd0: 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71  ctures */.    sq
bfe0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
bff0: 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20  OP_ParseSchema, 
c000: 70 2d 3e 69 44 62 2c 20 30 2c 0a 20 20 20 20 20  p->iDb, 0,.     
c010: 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
c020: 66 28 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27  f("tbl_name='%q'
c030: 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f  ",p->zName), P3_
c040: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a  DYNAMIC);.  }...
c050: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62    /* Add the tab
c060: 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d  le to the in-mem
c070: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
c080: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
c090: 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  se..  */.  if( d
c0a0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
c0b0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
c0c0: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f  ){.    Table *pO
c0d0: 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46  ld;.    FKey *pF
c0e0: 4b 65 79 3b 20 0a 20 20 20 20 44 62 20 2a 70 44  Key; .    Db *pD
c0f0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70 2d 3e  b = &db->aDb[p->
c100: 69 44 62 5d 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  iDb];.    pOld =
c110: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
c120: 72 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68  rt(&pDb->tblHash
c130: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  , p->zName, strl
c140: 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20  en(p->zName)+1, 
c150: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  p);.    if( pOld
c160: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
c170: 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a  ( p==pOld );  /*
c180: 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
c190: 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20  e failed inside 
c1a0: 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a  HashInsert() */.
c1b0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
c1c0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
c1d0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
c1e0: 4b 45 59 0a 20 20 20 20 66 6f 72 28 70 46 4b 65  KEY.    for(pFKe
c1f0: 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65  y=p->pFKey; pFKe
c200: 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e  y; pFKey=pFKey->
c210: 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20  pNextFrom){.    
c220: 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c    int nTo = strl
c230: 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b  en(pFKey->zTo) +
c240: 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d   1;.      pFKey-
c250: 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74  >pNextTo = sqlit
c260: 65 33 48 61 73 68 46 69 6e 64 28 26 70 44 62 2d  e3HashFind(&pDb-
c270: 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a  >aFKey, pFKey->z
c280: 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20  To, nTo);.      
c290: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
c2a0: 74 28 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70  t(&pDb->aFKey, p
c2b0: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20  FKey->zTo, nTo, 
c2c0: 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 23 65  pFKey);.    }.#e
c2d0: 6e 64 69 66 0a 20 20 20 20 70 50 61 72 73 65 2d  ndif.    pParse-
c2e0: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a  >pNewTable = 0;.
c2f0: 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b      db->nTable++
c300: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
c310: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
c320: 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a  Changes;.  }.}..
c330: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c340: 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54  MIT_VIEW./*.** T
c350: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
c360: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20  this routine in 
c370: 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20  order to create 
c380: 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f  a new VIEW.*/.vo
c390: 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
c3a0: 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70  View(.  Parse *p
c3b0: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68  Parse,     /* Th
c3c0: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
c3d0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42  t */.  Token *pB
c3e0: 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65  egin,     /* The
c3f0: 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
c400: 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74  at begins the st
c410: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
c420: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
c430: 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
c440: 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
c450: 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
c460: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
c470: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
c480: 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
c490: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
c4a0: 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  w */.  Select *p
c4b0: 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53  Select,   /* A S
c4c0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
c4d0: 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
c4e0: 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f   the new view */
c4f0: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 20 20  .  int isTemp   
c500: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f        /* TRUE fo
c510: 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69  r a TEMPORARY vi
c520: 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ew */.){.  Table
c530: 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *p;.  int n;.  
c540: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
c550: 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20  har *z;.  Token 
c560: 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20  sEnd;.  DbFixer 
c570: 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  sFix;.  Token *p
c580: 4e 61 6d 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33  Name;..  sqlite3
c590: 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73  StartTable(pPars
c5a0: 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e 61 6d 65  e, pBegin, pName
c5b0: 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d  1, pName2, isTem
c5c0: 70 2c 20 31 29 3b 0a 20 20 70 20 3d 20 70 50 61  p, 1);.  p = pPa
c5d0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
c5e0: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50    if( p==0 || pP
c5f0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
c600: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
c610: 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a  elete(pSelect);.
c620: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
c630: 20 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74    sqlite3TwoPart
c640: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
c650: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
c660: 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ame);.  if( sqli
c670: 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
c680: 2c 20 70 50 61 72 73 65 2c 20 70 2d 3e 69 44 62  , pParse, p->iDb
c690: 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29  , "view", pName)
c6a0: 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46  .    && sqlite3F
c6b0: 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20  ixSelect(&sFix, 
c6c0: 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20  pSelect).  ){.  
c6d0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
c6e0: 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a  elete(pSelect);.
c6f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
c700: 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70  .  /* Make a cop
c710: 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  y of the entire 
c720: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
c730: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
c740: 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69  e view..  ** Thi
c750: 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c  s will force all
c760: 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e   the Expr.token.
c770: 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64  z values to be d
c780: 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20  ynamically.  ** 
c790: 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72  allocated rather
c7a0: 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74   than point to t
c7b0: 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  he input string 
c7c0: 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  - which means th
c7d0: 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c  at.  ** they wil
c7e0: 6c 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20  l persist after 
c7f0: 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69  the current sqli
c800: 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20  te3_exec() call 
c810: 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20  returns..  */.  
c820: 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  p->pSelect = sql
c830: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 53  ite3SelectDup(pS
c840: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
c850: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
c860: 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 21 70  elect);.  if( !p
c870: 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e  Parse->db->init.
c880: 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  busy ){.    sqli
c890: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
c8a0: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
c8b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
c8c0: 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
c8d0: 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
c8e0: 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73  atement.  Make s
c8f0: 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a  End point to.  *
c900: 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a  * the end..  */.
c910: 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d    sEnd = pParse-
c920: 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69  >sLastToken;.  i
c930: 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20  f( sEnd.z[0]!=0 
c940: 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b  && sEnd.z[0]!=';
c950: 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20  ' ){.    sEnd.z 
c960: 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20  += sEnd.n;.  }. 
c970: 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e   sEnd.n = 0;.  n
c980: 20 3d 20 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67   = sEnd.z - pBeg
c990: 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 28 63 6f  in->z;.  z = (co
c9a0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
c9b0: 72 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20  r*)pBegin->z;.  
c9c0: 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a  while( n>0 && (z
c9d0: 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73  [n-1]==';' || is
c9e0: 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29  space(z[n-1])) )
c9f0: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e  { n--; }.  sEnd.
ca00: 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73  z = &z[n-1];.  s
ca10: 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a  End.n = 1;..  /*
ca20: 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54   Use sqlite3EndT
ca30: 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68  able() to add th
ca40: 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51  e view to the SQ
ca50: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
ca60: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e  e */.  sqlite3En
ca70: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 26  dTable(pParse, &
ca80: 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74 75  sEnd, 0);.  retu
ca90: 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
caa0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
cab0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
cac0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
cad0: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74  .** The Table st
cae0: 72 75 63 74 75 72 65 20 70 54 61 62 6c 65 20 69  ructure pTable i
caf0: 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e  s really a VIEW.
cb00: 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61    Fill in the na
cb10: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f  mes of.** the co
cb20: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65  lumns of the vie
cb30: 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20  w in the pTable 
cb40: 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75  structure.  Retu
cb50: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  rn the number.**
cb60: 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
cb70: 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e  an error is seen
cb80: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
cb90: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
cba0: 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69  e->zErrMsg..*/.i
cbb0: 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  nt sqlite3ViewGe
cbc0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72  tColumnNames(Par
cbd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
cbe0: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61  e *pTable){.  Ta
cbf0: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20  ble *pSelTab;   
cc00: 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20  /* A fake table 
cc10: 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65  from which we ge
cc20: 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  t the result set
cc30: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
cc40: 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  el;     /* Copy 
cc50: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 74 68  of the SELECT th
cc60: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
cc70: 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  e view */.  int 
cc80: 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a  nErr = 0;     /*
cc90: 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   Number of error
cca0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f  s encountered */
ccb0: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
ccc0: 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
ccd0: 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75  ily holds the nu
cce0: 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
ccf0: 61 73 73 69 67 6e 65 64 20 2a 2f 0a 0a 20 20 61  assigned */..  a
cd00: 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b  ssert( pTable );
cd10: 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76  ..  /* A positiv
cd20: 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65  e nCol means the
cd30: 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66   columns names f
cd40: 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65  or this view are
cd50: 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e  .  ** already kn
cd60: 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  own..  */.  if( 
cd70: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29  pTable->nCol>0 )
cd80: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
cd90: 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   A negative nCol
cda0: 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61   is a special ma
cdb0: 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61  rker meaning tha
cdc0: 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  t we are current
cdd0: 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  ly.  ** trying t
cde0: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  o compute the co
cdf0: 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20  lumn names.  If 
ce00: 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f  we enter this ro
ce10: 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20  utine with.  ** 
ce20: 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c  a negative nCol,
ce30: 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72   it means two or
ce40: 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d   more views form
ce50: 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68   a loop, like th
ce60: 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
ce70: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e    CREATE VIEW on
ce80: 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  e AS SELECT * FR
ce90: 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20  OM two;.  **    
cea0: 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f   CREATE VIEW two
ceb0: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
cec0: 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  M one;.  **.  **
ced0: 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20   Actually, this 
cee0: 65 72 72 6f 72 20 69 73 20 63 61 75 67 68 74 20  error is caught 
cef0: 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73  previously and s
cf00: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
cf10: 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  test.  ** should
cf20: 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42   always fail.  B
cf30: 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65  ut we will leave
cf40: 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73   it in place jus
cf50: 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20  t to be safe..  
cf60: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
cf70: 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73  >nCol<0 ){.    s
cf80: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
cf90: 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20  Parse, "view %s 
cfa0: 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65  is circularly de
cfb0: 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e  fined", pTable->
cfc0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
cfd0: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
cfe0: 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
cff0: 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20  ar, it means we 
d000: 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
d010: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e  the table names.
d020: 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
d030: 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
d040: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
d050: 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61  lect() will expa
d060: 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20  nd any.  ** "*" 
d070: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
d080: 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74  results set of t
d090: 68 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c  he view and will
d0a0: 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a   assign cursors.
d0b0: 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d    ** to the elem
d0c0: 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d  ents of the FROM
d0d0: 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65   clause.  But we
d0e0: 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65   do not want the
d0f0: 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20  se changes.  ** 
d100: 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e  to be permanent.
d110: 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61    So the computa
d120: 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20  tion is done on 
d130: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
d140: 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d  LECT.  ** statem
d150: 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
d160: 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a   the view..  */.
d170: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
d180: 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70  ->pSelect );.  p
d190: 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  Sel = sqlite3Sel
d1a0: 65 63 74 44 75 70 28 70 54 61 62 6c 65 2d 3e 70  ectDup(pTable->p
d1b0: 53 65 6c 65 63 74 29 3b 0a 20 20 6e 20 3d 20 70  Select);.  n = p
d1c0: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 73  Parse->nTab;.  s
d1d0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
d1e0: 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
d1f0: 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a  e, pSel->pSrc);.
d200: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
d210: 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d   -1;.  pSelTab =
d220: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
d230: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
d240: 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 70 50  , 0, pSel);.  pP
d250: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a  arse->nTab = n;.
d260: 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b    if( pSelTab ){
d270: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
d280: 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ble->aCol==0 );.
d290: 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
d2a0: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c   = pSelTab->nCol
d2b0: 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43  ;.    pTable->aC
d2c0: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
d2d0: 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d  ol;.    pSelTab-
d2e0: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70  >nCol = 0;.    p
d2f0: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30  SelTab->aCol = 0
d300: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
d310: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c  eteTable(0, pSel
d320: 54 61 62 29 3b 0a 20 20 20 20 44 62 53 65 74 50  Tab);.    DbSetP
d330: 72 6f 70 65 72 74 79 28 70 50 61 72 73 65 2d 3e  roperty(pParse->
d340: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 2c  db, pTable->iDb,
d350: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
d360: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
d370: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
d380: 3b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20  ;.    nErr++;.  
d390: 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  }.  sqlite3Selec
d3a0: 74 44 65 6c 65 74 65 28 70 53 65 6c 29 3b 0a 20  tDelete(pSel);. 
d3b0: 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a   return nErr;  .
d3c0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
d3d0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
d3e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d3f0: 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
d400: 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
d410: 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72   names from ever
d420: 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61  y VIEW in databa
d430: 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69  se idx..*/.stati
d440: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65  c void sqliteVie
d450: 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65  wResetAll(sqlite
d460: 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b  3 *db, int idx){
d470: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a  .  HashElem *i;.
d480: 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70    if( !DbHasProp
d490: 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
d4a0: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29  _UnresetViews) )
d4b0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
d4c0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
d4d0: 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 74  (&db->aDb[idx].t
d4e0: 62 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71  blHash); i; i=sq
d4f0: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
d500: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
d510: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
d520: 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(i);.    if( p
d530: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
d540: 20 20 20 20 20 20 73 71 6c 69 74 65 52 65 73 65        sqliteRese
d550: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61  tColumnNames(pTa
d560: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
d570: 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
d580: 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
d590: 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c  setViews);.}.#el
d5a0: 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69  se.# define sqli
d5b0: 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41  teViewResetAll(A
d5c0: 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ,B).#endif /* SQ
d5d0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
d5e0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
d5f0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
d600: 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20   by the VDBE to 
d610: 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72  adjust the inter
d620: 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73  nal schema.** us
d630: 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65  ed by SQLite whe
d640: 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  n the btree laye
d650: 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20  r moves a table 
d660: 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a  root page. The.*
d670: 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  * root-page of a
d680: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
d690: 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20  in database iDb 
d6a0: 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d  has changed from
d6b0: 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f   iFrom.** to iTo
d6c0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
d6d0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
d6e0: 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  UUM.void sqlite3
d6f0: 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 44 62  RootPageMoved(Db
d700: 20 2a 70 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d   *pDb, int iFrom
d710: 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61  , int iTo){.  Ha
d720: 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20  shElem *pElem;. 
d730: 20 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71   .  for(pElem=sq
d740: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
d750: 44 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70 45  Db->tblHash); pE
d760: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
d770: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
d780: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
d790: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
d7a0: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
d7b0: 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d  if( pTab->tnum==
d7c0: 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
d7d0: 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Tab->tnum = iTo;
d7e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
d7f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70     }.  }.  for(p
d800: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
d810: 69 72 73 74 28 26 70 44 62 2d 3e 69 64 78 48 61  irst(&pDb->idxHa
d820: 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
d830: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
d840: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e  (pElem)){.    In
d850: 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69  dex *pIdx = sqli
d860: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
d870: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  );.    if( pIdx-
d880: 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a  >tnum==iFrom ){.
d890: 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d        pIdx->tnum
d8a0: 20 3d 20 69 54 6f 3b 0a 20 20 20 20 20 20 72 65   = iTo;.      re
d8b0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
d8c0: 20 20 61 73 73 65 72 74 28 30 29 3b 0a 7d 0a 23    assert(0);.}.#
d8d0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
d8e0: 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  te code to erase
d8f0: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
d900: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65  root-page iTable
d910: 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69   from database i
d920: 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74  Db..** Also writ
d930: 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79  e code to modify
d940: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
d950: 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74  er table and int
d960: 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
d970: 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f  if a root-page o
d980: 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  f another table 
d990: 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20  is moved by the 
d9a0: 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c  btree-layer whil
d9b0: 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54  st.** erasing iT
d9c0: 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68  able (this can h
d9d0: 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75  appen with an au
d9e0: 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
d9f0: 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  se)..*/ .static 
da00: 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74  void destroyRoot
da10: 50 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  Page(Parse *pPar
da20: 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  se, int iTable, 
da30: 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
da40: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
da50: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
da60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
da70: 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20  (v, OP_Destroy, 
da80: 69 54 61 62 6c 65 2c 20 69 44 62 29 3b 0a 23 69  iTable, iDb);.#i
da90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
daa0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
dab0: 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 70 75 73  * OP_Destroy pus
dac0: 68 65 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  hes an integer o
dad0: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 49  nto the stack. I
dae0: 66 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20  f this integer. 
daf0: 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   ** is non-zero,
db00: 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
db10: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
db20: 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65   of a table move
db30: 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69  d to.  ** locati
db40: 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66  on iTable. The f
db50: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f  ollowing code mo
db60: 64 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74  difies the sqlit
db70: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74  e_master table t
db80: 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74  o.  ** reflect t
db90: 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  his..  **.  ** T
dba0: 68 65 20 22 23 30 22 20 69 6e 20 74 68 65 20 53  he "#0" in the S
dbb0: 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  QL is a special 
dbc0: 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65  constant that me
dbd0: 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61 6c  ans whatever val
dbe0: 75 65 0a 20 20 2a 2a 20 69 73 20 6f 6e 20 74 68  ue.  ** is on th
dbf0: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
dc00: 63 6b 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ck.  See sqlite3
dc10: 52 65 67 69 73 74 65 72 45 78 70 72 28 29 2e 0a  RegisterExpr()..
dc20: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65    */.  sqlite3Ne
dc30: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
dc40: 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54 45 20  , .     "UPDATE 
dc50: 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61  %Q.%s SET rootpa
dc60: 67 65 3d 25 64 20 57 48 45 52 45 20 23 30 20 41  ge=%d WHERE #0 A
dc70: 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 30 22 2c  ND rootpage=#0",
dc80: 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62  .     pParse->db
dc90: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
dca0: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
dcb0: 44 62 29 2c 20 69 54 61 62 6c 65 29 3b 0a 23 65  Db), iTable);.#e
dcc0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ndif.}../*.** Wr
dcd0: 69 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f  ite VDBE code to
dce0: 20 65 72 61 73 65 20 74 61 62 6c 65 20 70 54 61   erase table pTa
dcf0: 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69  b and all associ
dd00: 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20  ated indices on 
dd10: 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f  disk..** Code to
dd20: 20 75 70 64 61 74 65 20 74 68 65 20 73 71 6c 69   update the sqli
dd30: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73  te_master tables
dd40: 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63   and internal sc
dd50: 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73  hema definitions
dd60: 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f  .** in case a ro
dd70: 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e  ot-page belongin
dd80: 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62  g to another tab
dd90: 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74  le is moved by t
dda0: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a  he btree layer.*
ddb0: 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20  * is also added 
ddc0: 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e  (this can happen
ddd0: 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61   with an auto-va
dde0: 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a  cuum database)..
ddf0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
de00: 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73  estroyTable(Pars
de10: 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
de20: 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20   *pTab){.#ifdef 
de30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
de40: 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a  VACUUM.  Index *
de50: 70 49 64 78 3b 0a 20 20 64 65 73 74 72 6f 79 52  pIdx;.  destroyR
de60: 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
de70: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70 54 61 62  pTab->tnum, pTab
de80: 2d 3e 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49  ->iDb);.  for(pI
de90: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
dea0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
deb0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65  ->pNext){.    de
dec0: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
ded0: 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  arse, pIdx->tnum
dee0: 2c 20 70 49 64 78 2d 3e 69 44 62 29 3b 0a 20 20  , pIdx->iDb);.  
def0: 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20  }.#else.  /* If 
df00: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
df10: 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   be auto-vacuum 
df20: 63 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49  capable (if SQLI
df30: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
df40: 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64  UM.  ** is not d
df50: 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74  efined), then it
df60: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
df70: 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79   call OP_Destroy
df80: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62   on the.  ** tab
df90: 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f  le and index roo
dfa0: 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72  t-pages in order
dfb0: 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
dfc0: 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20  the numerically 
dfd0: 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f  .  ** largest ro
dfe0: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ot-page number. 
dff0: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20  This guarantees 
e000: 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65  that none of the
e010: 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a   root-pages.  **
e020: 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64   to be destroyed
e030: 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79   is relocated by
e040: 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44   an earlier OP_D
e050: 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20  estroy. i.e. if 
e060: 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  the.  ** followi
e070: 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20  ng were coded:. 
e080: 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74   **.  ** OP_Dest
e090: 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e  roy 4 0.  ** ...
e0a0: 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
e0b0: 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61   5 0.  **.  ** a
e0c0: 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68  nd root page 5 h
e0d0: 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68  appened to be th
e0e0: 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
e0f0: 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68  age number in th
e100: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c  e.  ** database,
e110: 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20   then root page 
e120: 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64  5 would be moved
e130: 20 74 6f 20 70 61 67 65 20 34 20 62 79 20 74 68   to page 4 by th
e140: 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74  e .  ** "OP_Dest
e150: 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e  roy 4 0" opcode.
e160: 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   The subsequent 
e170: 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22  "OP_Destroy 5 0"
e180: 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20   would hit.  ** 
e190: 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65  a free-list page
e1a0: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ..  */.  int iTa
e1b0: 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a  b = pTab->tnum;.
e1c0: 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64    int iDestroyed
e1d0: 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
e1e0: 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  1 ){.    Index *
e1f0: 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c  pIdx;.    int iL
e200: 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20  argest = 0;..   
e210: 20 69 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d   if( iDestroyed=
e220: 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74  =0 || iTab<iDest
e230: 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69  royed ){.      i
e240: 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a  Largest = iTab;.
e250: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49      }.    for(pI
e260: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
e270: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
e280: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
e290: 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d  int iIdx = pIdx-
e2a0: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73  >tnum;.      ass
e2b0: 65 72 74 28 20 70 49 64 78 2d 3e 69 44 62 3d 3d  ert( pIdx->iDb==
e2c0: 70 54 61 62 2d 3e 69 44 62 20 29 3b 0a 20 20 20  pTab->iDb );.   
e2d0: 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79     if( (iDestroy
e2e0: 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69  ed==0 || (iIdx<i
e2f0: 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69  Destroyed)) && i
e300: 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a  Idx>iLargest ){.
e310: 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74          iLargest
e320: 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d   = iIdx;.      }
e330: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
e340: 4c 61 72 67 65 73 74 3d 3d 30 20 29 20 72 65 74  Largest==0 ) ret
e350: 75 72 6e 3b 0a 20 20 20 20 64 65 73 74 72 6f 79  urn;.    destroy
e360: 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
e370: 20 69 4c 61 72 67 65 73 74 2c 20 70 54 61 62 2d   iLargest, pTab-
e380: 3e 69 44 62 29 3b 0a 20 20 20 20 69 44 65 73 74  >iDb);.    iDest
e390: 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74  royed = iLargest
e3a0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
e3b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
e3c0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
e3d0: 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61  do the work of a
e3e0: 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74   DROP TABLE stat
e3f0: 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20  ement..** pName 
e400: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
e410: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64  he table to be d
e420: 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ropped..*/.void 
e430: 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65  sqlite3DropTable
e440: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
e450: 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
e460: 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 54  int isView){.  T
e470: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64  able *pTab;.  Vd
e480: 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
e490: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
e4a0: 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
e4b0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
e4c0: 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
e4d0: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74  loc_failed ) got
e4e0: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
e4f0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61  e;.  assert( pNa
e500: 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
e510: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
e520: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
e530: 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
e540: 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
e550: 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a 20  ].zDatabase);.. 
e560: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67   if( pTab==0 ) g
e570: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
e580: 62 6c 65 3b 0a 20 20 69 44 62 20 3d 20 70 54 61  ble;.  iDb = pTa
e590: 62 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72 74  b->iDb;.  assert
e5a0: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
e5b0: 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64  db->nDb );.#ifnd
e5c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e5d0: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
e5e0: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
e5f0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
e600: 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
e610: 4c 45 28 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20  LE(pTab->iDb);. 
e620: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
e630: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61  Db = db->aDb[pTa
e640: 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  b->iDb].zName;. 
e650: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
e660: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
e670: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
e680: 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20  Tab, 0, zDb)){. 
e690: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
e6a0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
e6b0: 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
e6c0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44 62  ){.      if( iDb
e6d0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
e6e0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
e6f0: 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  P_TEMP_VIEW;.   
e700: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e710: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
e720: 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  DROP_VIEW;.     
e730: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
e740: 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29      if( iDb==1 )
e750: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
e760: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
e770: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
e780: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
e790: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
e7a0: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a  _TABLE;.      }.
e7b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
e7c0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
e7d0: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61  Parse, code, pTa
e7e0: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  b->zName, 0, zDb
e7f0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
e800: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
e810: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
e820: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
e830: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
e840: 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61  ELETE, pTab->zNa
e850: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
e860: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
e870: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
e880: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
e890: 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79  ( pTab->readOnly
e8a0: 20 7c 7c 20 70 54 61 62 3d 3d 64 62 2d 3e 61 44   || pTab==db->aD
e8b0: 62 5b 69 44 62 5d 2e 70 53 65 71 54 61 62 20 29  b[iDb].pSeqTab )
e8c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
e8d0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
e8e0: 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20  able %s may not 
e8f0: 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61  be dropped", pTa
e900: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
e910: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
e920: 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  ble;.  }..#ifnde
e930: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
e940: 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 44  EW.  /* Ensure D
e950: 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f 74  ROP TABLE is not
e960: 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77 2c   used on a view,
e970: 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20 69   and DROP VIEW i
e980: 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20  s not used.  ** 
e990: 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  on a table..  */
e9a0: 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26  .  if( isView &&
e9b0: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
e9c0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
e9d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
e9e0: 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45   "use DROP TABLE
e9f0: 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65   to delete table
ea00: 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
ea10: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
ea20: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
ea30: 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  }.  if( !isView 
ea40: 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
ea50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
ea60: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
ea70: 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74  "use DROP VIEW t
ea80: 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25 73  o delete view %s
ea90: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
eaa0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
eab0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23  rop_table;.  }.#
eac0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
ead0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
eae0: 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66 72  ove the table fr
eaf0: 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
eb00: 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b  ble.  ** on disk
eb10: 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
eb20: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
eb30: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
eb40: 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72      Trigger *pTr
eb50: 69 67 67 65 72 3b 0a 20 20 20 20 69 6e 74 20 69  igger;.    int i
eb60: 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a  Db = pTab->iDb;.
eb70: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
eb80: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20  b->aDb[iDb];.   
eb90: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
eba0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
ebb0: 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 20 20  se, 0, iDb);..  
ebc0: 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72    /* Drop all tr
ebd0: 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65  iggers associate
ebe0: 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
ebf0: 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20   being dropped. 
ec00: 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73 20 67  Code.    ** is g
ec10: 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f  enerated to remo
ec20: 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
ec30: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e  sqlite_master an
ec40: 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69  d/or.    ** sqli
ec50: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69  te_temp_master i
ec60: 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  f required..    
ec70: 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72 20  */.    pTrigger 
ec80: 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72  = pTab->pTrigger
ec90: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54 72  ;.    while( pTr
eca0: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61  igger ){.      a
ecb0: 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d  ssert( pTrigger-
ecc0: 3e 69 44 62 3d 3d 69 44 62 20 7c 7c 20 70 54 72  >iDb==iDb || pTr
ecd0: 69 67 67 65 72 2d 3e 69 44 62 3d 3d 31 20 29 3b  igger->iDb==1 );
ece0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 72  .      sqlite3Dr
ecf0: 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61  opTriggerPtr(pPa
ed00: 72 73 65 2c 20 70 54 72 69 67 67 65 72 2c 20 31  rse, pTrigger, 1
ed10: 29 3b 0a 20 20 20 20 20 20 70 54 72 69 67 67 65  );.      pTrigge
ed20: 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e  r = pTrigger->pN
ed30: 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  ext;.    }..#ifn
ed40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ed50: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
ed60: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20    /* Remove any 
ed70: 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73  entries of the s
ed80: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
ed90: 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
eda0: 77 69 74 68 0a 20 20 20 20 2a 2a 20 74 68 65 20  with.    ** the 
edb0: 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
edc0: 70 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  ped. This is don
edd0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62  e before the tab
ede0: 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20  le is dropped.  
edf0: 20 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65    ** at the btre
ee00: 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65  e level, in case
ee10: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
ee20: 65 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73  ence table needs
ee30: 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20   to.    ** move 
ee40: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
ee50: 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70  he drop (can hap
ee60: 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  pen in auto-vacu
ee70: 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f  um mode)..    */
ee80: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61  .    if( pTab->a
ee90: 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20  utoInc ){.      
eea0: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
eeb0: 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
eec0: 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
eed0: 25 73 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %s.sqlite_sequen
eee0: 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ce WHERE name=%Q
eef0: 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ",.        pDb->
ef00: 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
ef10: 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
ef20: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
ef30: 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45   Drop all SQLITE
ef40: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e  _MASTER table an
ef50: 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  d index entries 
ef60: 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
ef70: 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20  e.    ** table. 
ef80: 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65  The program name
ef90: 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74   loops through t
efa0: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
efb0: 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 20 20  and deletes.    
efc0: 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61  ** every row tha
efd0: 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
efe0: 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ble of the same 
eff0: 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20  name as the one 
f000: 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f  being.    ** dro
f010: 70 70 65 64 2e 20 54 72 69 67 67 65 72 73 20 61  pped. Triggers a
f020: 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72  re handled seper
f030: 61 74 65 6c 79 20 62 65 63 61 75 73 65 20 61 20  ately because a 
f040: 74 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20  trigger can be. 
f050: 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e     ** created in
f060: 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
f070: 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74  se that refers t
f080: 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f  o a table in ano
f090: 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 61 74 61  ther.    ** data
f0a0: 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  base..    */.   
f0b0: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
f0c0: 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
f0d0: 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
f0e0: 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62  M %Q.%s WHERE tb
f0f0: 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79  l_name=%Q and ty
f100: 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a  pe!='trigger'",.
f110: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61          pDb->zNa
f120: 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
f130: 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61  (iDb), pTab->zNa
f140: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73  me);.    if( !is
f150: 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 64 65  View ){.      de
f160: 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73  stroyTable(pPars
f170: 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  e, pTab);.    }.
f180: 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  .    /* Remove t
f190: 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66  he table entry f
f1a0: 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74  rom SQLite's int
f1b0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64  ernal schema and
f1c0: 20 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a 20 74   modify.    ** t
f1d0: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
f1e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
f1f0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
f200: 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62  P_DropTable, iDb
f210: 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
f220: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
f230: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  3ChangeCookie(db
f240: 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20  , v, iDb);.  }. 
f250: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
f260: 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65  All(db, iDb);..e
f270: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a  xit_drop_table:.
f280: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
f290: 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d  Delete(pName);.}
f2a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
f2b0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
f2c0: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66  o create a new f
f2d0: 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68  oreign key on th
f2e0: 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65  e table.** curre
f2f0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
f300: 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43  ruction.  pFromC
f310: 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ol determines wh
f320: 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69  ich columns.** i
f330: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  n the current ta
f340: 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ble point to the
f350: 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49   foreign key.  I
f360: 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68  f pFromCol==0 th
f370: 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68  en.** connect th
f380: 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73  e key to the las
f390: 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65  t column inserte
f3a0: 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e  d.  pTo is the n
f3b0: 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61  ame of.** the ta
f3c0: 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e  ble referred to.
f3d0: 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69    pToCol is a li
f3e0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
f3f0: 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f  the other.** pTo
f400: 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20   table that the 
f410: 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e  foreign key poin
f420: 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f  ts to.  flags co
f430: 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e  ntains all.** in
f440: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
f450: 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  the conflict res
f460: 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
f470: 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  ms specified.** 
f480: 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45  in the ON DELETE
f490: 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20  , ON UPDATE and 
f4a0: 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65  ON INSERT clause
f4b0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79  s..**.** An FKey
f4c0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72   structure is cr
f4d0: 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20  eated and added 
f4e0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
f4f0: 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20  rently.** under 
f500: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20  construction in 
f510: 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  the pParse->pNew
f520: 54 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68  Table field.  Th
f530: 65 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73  e new FKey.** is
f540: 20 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f   not linked into
f550: 20 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68   db->aFKey at th
f560: 69 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20  is point - that 
f570: 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a  does not happen.
f580: 2a 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33  ** until sqlite3
f590: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a  EndTable()..**.*
f5a0: 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  * The foreign ke
f5b0: 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d  y is set for IMM
f5c0: 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e  EDIATE processin
f5d0: 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74  g.  A subsequent
f5e0: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69   call.** to sqli
f5f0: 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
f600: 65 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67  ey() might chang
f610: 65 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52  e this to DEFERR
f620: 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ED..*/.void sqli
f630: 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e  te3CreateForeign
f640: 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
f650: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
f660: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
f670: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46  /.  ExprList *pF
f680: 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75  romCol,  /* Colu
f690: 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c  mns in this tabl
f6a0: 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  e that point to 
f6b0: 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
f6c0: 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20   Token *pTo,    
f6d0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
f6e0: 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
f6f0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
f700: 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f  pToCol,    /* Co
f710: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68  lumns in the oth
f720: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  er table */.  in
f730: 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
f740: 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72     /* Conflict r
f750: 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
f760: 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 23 69 66 6e  thms. */.){.#ifn
f770: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f780: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b  FOREIGN_KEY.  FK
f790: 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20  ey *pFKey = 0;. 
f7a0: 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72   Table *p = pPar
f7b0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
f7c0: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e   int nByte;.  in
f7d0: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  t i;.  int nCol;
f7e0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61  .  char *z;..  a
f7f0: 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b  ssert( pTo!=0 );
f800: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
f810: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
f820: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28  to fk_end;.  if(
f830: 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
f840: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
f850: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66  ->nCol-1;.    if
f860: 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20  ( iCol<0 ) goto 
f870: 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  fk_end;.    if( 
f880: 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
f890: 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20  ->nExpr!=1 ){.  
f8a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f8b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72  Msg(pParse, "for
f8c0: 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a  eign key on %s".
f8d0: 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c           " shoul
f8e0: 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79  d reference only
f8f0: 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   one column of t
f900: 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20  able %T",.      
f910: 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d     p->aCol[iCol]
f920: 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20  .zName, pTo);.  
f930: 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
f940: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20  .    }.    nCol 
f950: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
f960: 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
f970: 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43  l->nExpr!=pFromC
f980: 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  ol->nExpr ){.   
f990: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f9a0: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
f9b0: 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75   "number of colu
f9c0: 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  mns in foreign k
f9d0: 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ey does not matc
f9e0: 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
f9f0: 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d  ".        "colum
fa00: 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65  ns in the refere
fa10: 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20  nced table");.  
fa20: 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
fa30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c   }else{.    nCol
fa40: 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78   = pFromCol->nEx
fa50: 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20  pr;.  }.  nByte 
fa60: 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29  = sizeof(*pFKey)
fa70: 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70   + nCol*sizeof(p
fa80: 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b  FKey->aCol[0]) +
fa90: 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69   pTo->n + 1;.  i
faa0: 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
fab0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43   for(i=0; i<pToC
fac0: 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ol->nExpr; i++){
fad0: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
fae0: 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61  strlen(pToCol->a
faf0: 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a  [i].zName) + 1;.
fb00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
fb10: 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  y = sqliteMalloc
fb20: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
fb30: 20 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f   pFKey==0 ) goto
fb40: 20 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79   fk_end;.  pFKey
fb50: 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70  ->pFrom = p;.  p
fb60: 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20  FKey->pNextFrom 
fb70: 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20  = p->pFKey;.  z 
fb80: 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b  = (char*)&pFKey[
fb90: 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f  1];.  pFKey->aCo
fba0: 6c 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c  l = (struct sCol
fbb0: 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73  Map*)z;.  z += s
fbc0: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f  izeof(struct sCo
fbd0: 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46  lMap)*nCol;.  pF
fbe0: 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20  Key->zTo = z;.  
fbf0: 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a  memcpy(z, pTo->z
fc00: 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70  , pTo->n);.  z[p
fc10: 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20  To->n] = 0;.  z 
fc20: 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70  += pTo->n+1;.  p
fc30: 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20  FKey->pNextTo = 
fc40: 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c  0;.  pFKey->nCol
fc50: 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70   = nCol;.  if( p
fc60: 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
fc70: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d    pFKey->aCol[0]
fc80: 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c  .iFrom = p->nCol
fc90: 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
fca0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
fcb0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
fcc0: 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
fcd0: 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a  =0; j<p->nCol; j
fce0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
fcf0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
fd00: 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  p->aCol[j].zName
fd10: 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d  , pFromCol->a[i]
fd20: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
fd30: 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61          pFKey->a
fd40: 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a  Col[i].iFrom = j
fd50: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
fd60: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
fd70: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
fd80: 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  >=p->nCol ){.   
fd90: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
fda0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
fdb0: 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e          "unknown
fdc0: 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69   column \"%s\" i
fdd0: 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  n foreign key de
fde0: 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20  finition", .    
fdf0: 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e        pFromCol->
fe00: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
fe10: 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
fe20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
fe30: 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c    }.  if( pToCol
fe40: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
fe50: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
fe60: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72       int n = str
fe70: 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  len(pToCol->a[i]
fe80: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  .zName);.      p
fe90: 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43  FKey->aCol[i].zC
fea0: 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65  ol = z;.      me
feb0: 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e  mcpy(z, pToCol->
fec0: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a  a[i].zName, n);.
fed0: 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a        z[n] = 0;.
fee0: 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a        z += n+1;.
fef0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
ff00: 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
ff10: 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65  0;.  pFKey->dele
ff20: 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26  teConf = flags &
ff30: 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e   0xff;.  pFKey->
ff40: 75 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c  updateConf = (fl
ff50: 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66  ags >> 8 ) & 0xf
ff60: 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65  f;.  pFKey->inse
ff70: 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20  rtConf = (flags 
ff80: 3e 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a  >> 16 ) & 0xff;.
ff90: 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66  .  /* Link the f
ffa0: 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68  oreign key to th
ffb0: 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c  e table as the l
ffc0: 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20  ast step..  */. 
ffd0: 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65   p->pFKey = pFKe
ffe0: 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a  y;.  pFKey = 0;.
fff0: 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74  .fk_end:.  sqlit
10000 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 23 65  eFree(pFKey);.#e
10010 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
10020 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52  (SQLITE_OMIT_FOR
10030 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73  EIGN_KEY) */.  s
10040 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
10050 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a  lete(pFromCol);.
10060 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
10070 74 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b  tDelete(pToCol);
10080 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
10090 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
100a0 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c   when an INITIAL
100b0 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20  LY IMMEDIATE or 
100c0 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
100d0 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  ED.** clause is 
100e0 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  seen as part of 
100f0 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  a foreign key de
10100 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69  finition.  The i
10110 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72  sDeferred.** par
10120 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20  ameter is 1 for 
10130 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
10140 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49  ED and 0 for INI
10150 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
10160 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f  ..** The behavio
10170 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  r of the most re
10180 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66  cently created f
10190 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64  oreign key is ad
101a0 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64  justed.** accord
101b0 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ingly..*/.void s
101c0 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
101d0 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61  gnKey(Parse *pPa
101e0 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72  rse, int isDefer
101f0 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  red){.#ifndef SQ
10200 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
10210 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70  N_KEY.  Table *p
10220 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  Tab;.  FKey *pFK
10230 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20  ey;.  if( (pTab 
10240 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
10250 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65  ble)==0 || (pFKe
10260 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29  y = pTab->pFKey)
10270 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
10280 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
10290 64 20 3d 20 69 73 44 65 66 65 72 72 65 64 3b 0a  d = isDeferred;.
102a0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
102b0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
102c0 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e  at will erase an
102d0 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a  d refill index *
102e0 70 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a  pIdx.  This is.*
102f0 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61  * used to initia
10300 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65  lize a newly cre
10310 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f  ated index or to
10320 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a   recompute the.*
10330 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  * content of an 
10340 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73  index in respons
10350 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63  e to a REINDEX c
10360 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66  ommand..**.** if
10370 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20   memRootPage is 
10380 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74  not negative, it
10390 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
103a0 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a  index is newly.*
103b0 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  * created.  The 
103c0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 73 70 65 63  memory cell spec
103d0 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74  ified by memRoot
103e0 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Page contains th
103f0 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e  e.** root page n
10400 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
10410 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50  ex.  If memRootP
10420 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
10430 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64   then.** the ind
10440 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
10450 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c  s and must be cl
10460 65 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69  eared before bei
10470 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a  ng refilled and.
10480 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ** the root page
10490 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
104a0 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72  ndex is taken fr
104b0 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e  om pIndex->tnum.
104c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
104d0 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
104e0 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
104f0 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c  , Index *pIndex,
10500 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65   int memRootPage
10510 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
10520 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
10530 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  e;  /* The table
10540 20 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64   that is indexed
10550 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
10560 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 20 20   pParse->nTab;  
10570 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75       /* Btree cu
10580 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54  rsor used for pT
10590 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ab */.  int iIdx
105a0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
105b0 31 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20  1;     /* Btree 
105c0 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  cursor used for 
105d0 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20  pIndex */.  int 
105e0 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  addr1;          
105f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
10600 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20  dress of top of 
10610 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e  loop */.  int tn
10620 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
10630 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
10640 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a   page of index *
10650 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
10660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10670 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
10680 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69  ode into this vi
10690 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f  rtual machine */
106a0 0a 20 20 69 6e 74 20 69 73 55 6e 69 71 75 65 3b  .  int isUnique;
106b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106c0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
106d0 75 6e 69 71 75 65 20 69 6e 64 65 78 20 2a 2f 0a  unique index */.
106e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
106f0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
10700 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ON.  if( sqlite3
10710 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
10720 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  , SQLITE_REINDEX
10730 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
10740 20 30 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65   0,.      pParse
10750 2d 3e 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78  ->db->aDb[pIndex
10760 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29  ->iDb].zName ) )
10770 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
10780 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45  }.#endif..  /* E
10790 6e 73 75 72 65 20 61 6c 6c 20 74 68 65 20 72 65  nsure all the re
107a0 71 75 69 72 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  quired collation
107b0 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 20 61   sequences are a
107c0 76 61 69 6c 61 62 6c 65 2e 20 54 68 69 73 0a 20  vailable. This. 
107d0 20 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c   ** routine will
107e0 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6c 6c   invoke the coll
107f0 61 74 69 6f 6e 2d 6e 65 65 64 65 64 20 63 61 6c  ation-needed cal
10800 6c 62 61 63 6b 20 69 66 20 6e 65 63 65 73 73 61  lback if necessa
10810 72 79 20 28 61 6e 64 0a 20 20 2a 2a 20 69 66 20  ry (and.  ** if 
10820 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 72 65 67  one has been reg
10830 69 73 74 65 72 65 64 29 2e 0a 20 20 2a 2f 0a 20  istered)..  */. 
10840 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63   if( sqlite3Chec
10850 6b 49 6e 64 65 78 43 6f 6c 6c 53 65 71 28 70 50  kIndexCollSeq(pP
10860 61 72 73 65 2c 20 70 49 6e 64 65 78 29 20 29 7b  arse, pIndex) ){
10870 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
10880 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
10890 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
108a0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
108b0 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f  urn;.  if( memRo
108c0 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  otPage>=0 ){.   
108d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
108e0 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
108f0 20 6d 65 6d 52 6f 6f 74 50 61 67 65 2c 20 30 29   memRootPage, 0)
10900 3b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 30 3b 0a  ;.    tnum = 0;.
10910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75    }else{.    tnu
10920 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  m = pIndex->tnum
10930 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10940 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 65  eAddOp(v, OP_Cle
10950 61 72 2c 20 74 6e 75 6d 2c 20 70 49 6e 64 65 78  ar, tnum, pIndex
10960 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71  ->iDb);.  }.  sq
10970 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10980 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49  , OP_Integer, pI
10990 6e 64 65 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20  ndex->iDb, 0);. 
109a0 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
109b0 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
109c0 20 69 49 64 78 2c 20 74 6e 75 6d 2c 0a 20 20 20   iIdx, tnum,.   
109d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109e0 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d   (char*)&pIndex-
109f0 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  >keyInfo, P3_KEY
10a00 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
10a10 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10a20 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 69  Integer, pTab->i
10a30 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  Db, 0);.  sqlite
10a40 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10a50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c  _OpenRead, iTab,
10a60 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20   pTab->tnum);.  
10a70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10a80 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c  (v, OP_SetNumCol
10a90 75 6d 6e 73 2c 20 69 54 61 62 2c 20 70 54 61 62  umns, iTab, pTab
10aa0 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 61 64 64 72 31  ->nCol);.  addr1
10ab0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
10ac0 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
10ad0 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 73 71  , iTab, 0);.  sq
10ae0 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64  lite3GenerateInd
10af0 65 78 4b 65 79 28 76 2c 20 70 49 6e 64 65 78 2c  exKey(v, pIndex,
10b00 20 69 54 61 62 29 3b 0a 20 20 69 73 55 6e 69 71   iTab);.  isUniq
10b10 75 65 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  ue = pIndex->onE
10b20 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20  rror!=OE_None;. 
10b30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10b40 70 28 76 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20  p(v, OP_IdxPut, 
10b50 69 49 64 78 2c 20 69 73 55 6e 69 71 75 65 29 3b  iIdx, isUnique);
10b60 0a 20 20 69 66 28 20 69 73 55 6e 69 71 75 65 20  .  if( isUnique 
10b70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
10b80 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
10b90 2c 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  , "indexed colum
10ba0 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75  ns are not uniqu
10bb0 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  e", P3_STATIC);.
10bc0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
10bd0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
10be0 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31  t, iTab, addr1+1
10bf0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
10c00 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72  ChangeP2(v, addr
10c10 31 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  1, sqlite3VdbeCu
10c20 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20  rrentAddr(v));. 
10c30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10c40 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  p(v, OP_Close, i
10c50 54 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  Tab, 0);.  sqlit
10c60 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10c70 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30  P_Close, iIdx, 0
10c80 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
10c90 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66  te a new index f
10ca0 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e  or an SQL table.
10cb0 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20    pName1.pName2 
10cc0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
10cd0 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64  he index .** and
10ce0 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65   pTblList is the
10cf0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
10d00 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
10d10 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20   indexed.  Both 
10d20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c  will .** be NULL
10d30 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b   for a primary k
10d40 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74  ey or an index t
10d50 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74  hat is created t
10d60 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55  o satisfy a.** U
10d70 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
10d80 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64  .  If pTable and
10d90 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c   pIndex are NULL
10da0 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  , use pParse->pN
10db0 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68  ewTable.** as th
10dc0 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
10dd0 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e  dexed.  pParse->
10de0 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74  pNewTable is a t
10df0 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  able that is.** 
10e00 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
10e10 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61  constructed by a
10e20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
10e30 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70  atement..**.** p
10e40 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
10e50 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
10e60 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20  indexed.  pList 
10e70 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
10e80 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69  this.** is a pri
10e90 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71  mary key or uniq
10ea0 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  ue-constraint on
10eb0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
10ec0 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a   column added.**
10ed0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
10ee0 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
10ef0 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f  nstruction.  .*/
10f00 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
10f10 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ateIndex(.  Pars
10f20 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
10f30 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * All informatio
10f40 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72  n about this par
10f50 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
10f60 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69  Name1,     /* Fi
10f70 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65  rst part of inde
10f80 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
10f90 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
10fa0 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53  pName2,     /* S
10fb0 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e  econd part of in
10fc0 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
10fd0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69   NULL */.  SrcLi
10fe0 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a  st *pTblName, /*
10ff0 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e   Table to index.
11000 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   Use pParse->pNe
11010 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20  wTable if 0 */. 
11020 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
11030 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66  ,   /* A list of
11040 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
11050 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
11060 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f  onError,       /
11070 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49  * OE_Abort, OE_I
11080 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63  gnore, OE_Replac
11090 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f  e, or OE_None */
110a0 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
110b0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
110c0 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
110d0 65 67 69 6e 73 20 61 20 43 52 45 41 54 45 20 54  egins a CREATE T
110e0 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  ABLE statement *
110f0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20  /.  Token *pEnd 
11100 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29         /* The ")
11110 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68  " that closes th
11120 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  e CREATE INDEX s
11130 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  tatement */.){. 
11140 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
11150 3b 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20  ;   /* Table to 
11160 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
11170 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
11180 30 3b 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20  0; /* The index 
11190 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f  to be created */
111a0 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
111b0 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   0;.  int i, j;.
111c0 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20    Token nullId; 
111d0 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e     /* Fake token
111e0 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44   for an empty ID
111f0 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46 69 78   list */.  DbFix
11200 65 72 20 73 46 69 78 3b 20 20 20 20 2f 2a 20 46  er sFix;    /* F
11210 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74  or assigning dat
11220 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70  abase names to p
11230 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  Table */.  int i
11240 73 54 65 6d 70 3b 20 20 20 20 20 20 2f 2a 20 54  sTemp;      /* T
11250 72 75 65 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  rue for a tempor
11260 61 72 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 73  ary index */.  s
11270 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
11280 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 6e 74 20  rse->db;..  int 
11290 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  iDb;          /*
112a0 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   Index of the da
112b0 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20 62  tabase that is b
112c0 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a  eing written */.
112d0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d    Token *pName =
112e0 20 30 3b 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69   0; /* Unqualifi
112f0 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  ed name of the i
11300 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a  ndex to create *
11310 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  /..  if( pParse-
11320 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
11330 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
11340 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
11350 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20  e_index;..  /*. 
11360 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62   ** Find the tab
11370 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
11380 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72   indexed.  Retur
11390 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66  n early if not f
113a0 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ound..  */.  if(
113b0 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
113c0 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20  .    /* Use the 
113d0 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e  two-part index n
113e0 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
113f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
11400 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20     ** to search 
11410 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27  for the table. '
11420 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e  Fix' the table n
11430 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20  ame to this db. 
11440 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f     ** before loo
11450 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c  king up the tabl
11460 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
11470 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20  sert( pName1 && 
11480 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44  pName2 );.    iD
11490 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
114a0 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
114b0 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
114c0 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
114d0 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69  iDb<0 ) goto exi
114e0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
114f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
11500 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e  ndex name was un
11510 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b  qualified, check
11520 20 69 66 20 74 68 65 20 74 68 65 20 74 61 62 6c   if the the tabl
11530 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65  e.    ** is a te
11540 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c  mp table. If so,
11550 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
11560 65 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2f 0a 20  e to 1..    */. 
11570 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
11580 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70  3SrcListLookup(p
11590 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29  Parse, pTblName)
115a0 3b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32  ;.    if( pName2
115b0 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30   && pName2->n==0
115c0 20 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62   && pTab && pTab
115d0 2d 3e 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  ->iDb==1 ){.    
115e0 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7d    iDb = 1;.    }
115f0 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
11600 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20  3FixInit(&sFix, 
11610 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e  pParse, iDb, "in
11620 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26 26 0a  dex", pName) &&.
11630 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
11640 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c  ixSrcList(&sFix,
11650 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20 29   pTblName).    )
11660 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
11670 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11680 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
11690 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
116a0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 62 6c  ble(pParse, pTbl
116b0 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
116c0 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c 4e  , .        pTblN
116d0 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
116e0 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ase);.    if( !p
116f0 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Tab ) goto exit_
11700 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11710 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 70    assert( iDb==p
11720 54 61 62 2d 3e 69 44 62 20 29 3b 0a 20 20 7d 65  Tab->iDb );.  }e
11730 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
11740 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20   pName==0 );.   
11750 20 70 54 61 62 20 3d 20 20 70 50 61 72 73 65 2d   pTab =  pParse-
11760 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20  >pNewTable;.    
11770 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b  iDb = pTab->iDb;
11780 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 61 62  .  }..  if( pTab
11790 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
117a0 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Err ) goto exit_
117b0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
117c0 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e  if( pTab->readOn
117d0 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ly ){.    sqlite
117e0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
117f0 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
11800 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c  not be indexed",
11810 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
11820 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
11830 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
11840 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11850 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54  IT_VIEW.  if( pT
11860 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
11870 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11880 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
11890 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
118a0 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
118b0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
118c0 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ex;.  }.#endif. 
118d0 20 69 73 54 65 6d 70 20 3d 20 70 54 61 62 2d 3e   isTemp = pTab->
118e0 69 44 62 3d 3d 31 3b 0a 0a 20 20 2f 2a 0a 20 20  iDb==1;..  /*.  
118f0 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  ** Find the name
11900 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
11910 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
11920 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
11930 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65  nother.  ** inde
11940 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20  x or table with 
11950 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
11960 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
11970 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65  tion:  If we are
11980 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d   reading the nam
11990 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20  es of permanent 
119a0 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65  indices from the
119b0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73  .  ** sqlite_mas
119c0 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75  ter table (becau
119d0 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
119e0 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68  ocess changed th
119f0 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20  e schema) and.  
11a00 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  ** one of the in
11a10 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64  dex names collid
11a20 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  es with the name
11a30 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   of a temporary 
11a40 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e  table or.  ** in
11a50 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c  dex, then we wil
11a60 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72  l continue to pr
11a70 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78  ocess this index
11a80 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
11a90 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
11aa0 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a   that we are.  *
11ab0 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  * dealing with a
11ac0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
11ad0 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
11ae0 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  t.  We have to i
11af0 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f  nvent our.  ** o
11b00 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  wn name..  */.  
11b10 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
11b20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
11b30 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e  NameFromToken(pN
11b40 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 53 51  ame);.    if( SQ
11b50 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
11b60 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
11b70 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  e) ) goto exit_c
11b80 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
11b90 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
11ba0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
11bb0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
11bc0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
11bd0 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
11be0 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
11bf0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
11c00 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
11c10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11c20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
11c30 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
11c40 49 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a  ISameName;    /*
11c50 20 41 6e 6f 74 68 65 72 20 69 6e 64 65 78 20 77   Another index w
11c60 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
11c70 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65  e */.      Table
11c80 20 2a 70 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20   *pTSameName;   
11c90 20 2f 2a 20 41 20 74 61 62 6c 65 20 77 69 74 68   /* A table with
11ca0 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
11cb0 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  e index */.     
11cc0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
11cd0 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
11ce0 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f  a(pParse) ) goto
11cf0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
11d00 65 78 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ex;.      if( (p
11d10 49 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69  ISameName = sqli
11d20 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
11d30 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b   zName, db->aDb[
11d40 69 44 62 5d 2e 7a 4e 61 6d 65 29 29 21 3d 30 20  iDb].zName))!=0 
11d50 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
11d60 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
11d70 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72  e, "index %s alr
11d80 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e  eady exists", zN
11d90 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
11da0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
11db0 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
11dc0 20 20 20 20 69 66 28 20 28 70 54 53 61 6d 65 4e      if( (pTSameN
11dd0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ame = sqlite3Fin
11de0 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
11df0 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 0))!=0 ){.    
11e00 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11e10 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
11e20 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
11e30 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c  table named %s",
11e40 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
11e50 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
11e60 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
11e70 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
11e80 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30      char zBuf[30
11e90 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ];.    int n;.  
11ea0 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a    Index *pLoop;.
11eb0 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54      for(pLoop=pT
11ec0 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b  ab->pIndex, n=1;
11ed0 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
11ee0 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29  oop->pNext, n++)
11ef0 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  {}.    sprintf(z
11f00 42 75 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20 20  Buf,"_%d",n);.  
11f10 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20    zName = 0;.   
11f20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
11f30 67 28 26 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  g(&zName, "sqlit
11f40 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 70  e_autoindex_", p
11f50 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66  Tab->zName, zBuf
11f60 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
11f70 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
11f80 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
11f90 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
11fa0 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68  * Check for auth
11fb0 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65  orization to cre
11fc0 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20  ate an index..  
11fd0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
11fe0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
11ff0 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e  TION.  {.    con
12000 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
12010 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62  b->aDb[pTab->iDb
12020 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
12030 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
12040 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
12050 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f  _INSERT, SCHEMA_
12060 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30  TABLE(isTemp), 0
12070 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
12080 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12090 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
120a0 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45    i = SQLITE_CRE
120b0 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  ATE_INDEX;.    i
120c0 66 28 20 69 73 54 65 6d 70 20 29 20 69 20 3d 20  f( isTemp ) i = 
120d0 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
120e0 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
120f0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
12100 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e  ck(pParse, i, zN
12110 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
12120 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
12130 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12140 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
12150 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
12160 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d  f pList==0, it m
12170 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e  eans this routin
12180 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  e was called to 
12190 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20  make a primary. 
121a0 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74   ** key out of t
121b0 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61  he last column a
121c0 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
121d0 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
121e0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72  tion..  ** So cr
121f0 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74  eate a fake list
12200 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69   to simulate thi
12210 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  s..  */.  if( pL
12220 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75  ist==0 ){.    nu
12230 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d 3e 61  llId.z = pTab->a
12240 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31  Col[pTab->nCol-1
12250 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c  ].zName;.    nul
12260 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 6e  lId.n = strlen(n
12270 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c  ullId.z);.    pL
12280 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
12290 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 30  rListAppend(0, 0
122a0 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20  , &nullId);.    
122b0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67  if( pList==0 ) g
122c0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
122d0 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
122e0 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20   .  ** Allocate 
122f0 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74  the index struct
12300 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e  ure. .  */.  pIn
12310 64 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  dex = sqliteMall
12320 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78  oc( sizeof(Index
12330 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  ) + strlen(zName
12340 29 20 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20  ) + 1 +.        
12350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12360 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73  (sizeof(int) + s
12370 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29  izeof(CollSeq*))
12380 2a 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  *pList->nExpr );
12390 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
123a0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
123b0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49 6e  ate_index;.  pIn
123c0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20  dex->aiColumn = 
123d0 28 69 6e 74 2a 29 26 70 49 6e 64 65 78 2d 3e 6b  (int*)&pIndex->k
123e0 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 70 4c 69  eyInfo.aColl[pLi
123f0 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 70 49  st->nExpr];.  pI
12400 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63  ndex->zName = (c
12410 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69  har*)&pIndex->ai
12420 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 45  Column[pList->nE
12430 78 70 72 5d 3b 0a 20 20 73 74 72 63 70 79 28 70  xpr];.  strcpy(p
12440 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  Index->zName, zN
12450 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ame);.  pIndex->
12460 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20  pTable = pTab;. 
12470 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
12480 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
12490 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  .  pIndex->onErr
124a0 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20  or = onError;.  
124b0 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65  pIndex->autoInde
124c0 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20  x = pName==0;.  
124d0 70 49 6e 64 65 78 2d 3e 69 44 62 20 3d 20 69 44  pIndex->iDb = iD
124e0 62 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68  b;..  /* Scan th
124f0 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63  e names of the c
12500 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61  olumns of the ta
12510 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
12520 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20  d and.  ** load 
12530 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63  the column indic
12540 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65  es into the Inde
12550 78 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  x structure.  Re
12560 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20  port an error.  
12570 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e  ** if any column
12580 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   is not found.. 
12590 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
125a0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
125b0 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  ++){.    for(j=0
125c0 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
125d0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
125e0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
125f0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
12600 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  , pTab->aCol[j].
12610 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  zName)==0 ) brea
12620 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
12630 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29   j>=pTab->nCol )
12640 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
12650 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
12660 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 6e 6f  "table %s has no
12670 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73   column named %s
12680 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ",.        pTab-
12690 3e 7a 4e 61 6d 65 2c 20 70 4c 69 73 74 2d 3e 61  >zName, pList->a
126a0 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
126b0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
126c0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
126d0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
126e0 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20  lumn[i] = j;.   
126f0 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   if( pList->a[i]
12700 2e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  .pExpr ){.      
12710 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
12720 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  [i].pExpr->pColl
12730 20 29 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   );.      pIndex
12740 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
12750 69 5d 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  i] = pList->a[i]
12760 2e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20  .pExpr->pColl;. 
12770 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12780 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
12790 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 54 61 62 2d  aColl[i] = pTab-
127a0 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a  >aCol[j].pColl;.
127b0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
127c0 28 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  ( pIndex->keyInf
127d0 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 29 3b 0a 20 20  o.aColl[i] );.  
127e0 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
127f0 62 75 73 79 20 26 26 20 0a 20 20 20 20 20 20 20  busy && .       
12800 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c   sqlite3CheckCol
12810 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 6e  lSeq(pParse, pIn
12820 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  dex->keyInfo.aCo
12830 6c 6c 5b 69 5d 29 20 0a 20 20 20 20 29 7b 0a 20  ll[i]) .    ){. 
12840 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
12850 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
12860 20 7d 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 2d   }.  }.  pIndex-
12870 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20  >keyInfo.nField 
12880 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
12890 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61  .  if( pTab==pPa
128a0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29  rse->pNewTable )
128b0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f  {.    /* This ro
128c0 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63  utine has been c
128d0 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
128e0 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
128f0 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72  ex as a.    ** r
12900 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41  esult of a PRIMA
12910 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
12920 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c   clause on a col
12930 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20  umn definition, 
12940 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d  or.    ** a PRIM
12950 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
12960 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69  E clause followi
12970 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65  ng the column de
12980 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  finitions..    *
12990 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20  * i.e. one of:. 
129a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45     **.    ** CRE
129b0 41 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52  ATE TABLE t(x PR
129c0 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20  IMARY KEY, y);. 
129d0 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42     ** CREATE TAB
129e0 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55  LE t(x, y, UNIQU
129f0 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a  E(x, y));.    **
12a00 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77  .    ** Either w
12a10 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  ay, check to see
12a20 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   if the table al
12a30 72 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61  ready has such a
12a40 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20  n index. If.    
12a50 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74  ** so, don't bot
12a60 68 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69  her creating thi
12a70 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79  s one. This only
12a80 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20   applies to.    
12a90 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
12aa0 20 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73   created indices
12ab0 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61  . Users can do a
12ac0 73 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68  s they wish with
12ad0 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74  .    ** explicit
12ae0 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f   indices..    */
12af0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
12b00 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
12b10 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
12b20 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
12b30 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
12b40 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
12b50 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
12b60 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20  OE_None );.     
12b70 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
12b80 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20 20  utoIndex );.    
12b90 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
12ba0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
12bb0 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  ne );..      if(
12bc0 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d   pIdx->nColumn!=
12bd0 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
12be0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
12bf0 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64    for(k=0; k<pId
12c00 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29  x->nColumn; k++)
12c10 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
12c20 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21  dx->aiColumn[k]!
12c30 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  =pIndex->aiColum
12c40 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  n[k] ) break;.  
12c50 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
12c60 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d  keyInfo.aColl[k]
12c70 21 3d 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  !=pIndex->keyInf
12c80 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20 29 20 62 72 65  o.aColl[k] ) bre
12c90 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
12ca0 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e    if( k==pIdx->n
12cb0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
12cc0 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
12cd0 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45  ror!=pIndex->onE
12ce0 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rror ){.        
12cf0 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72    /* This constr
12d00 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65  aint creates the
12d10 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61   same index as a
12d20 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
12d30 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
12d40 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65  t specified some
12d50 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45  where in the CRE
12d60 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
12d70 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ent..          *
12d80 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e  * However the ON
12d90 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
12da0 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e  s are different.
12db0 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20   If both this . 
12dc0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
12dd0 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70  traint and the p
12de0 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65  revious equivale
12df0 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  nt constraint ha
12e00 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20  ve explicit.    
12e10 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46        ** ON CONF
12e20 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69  LICT clauses thi
12e30 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f  s is an error. O
12e40 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
12e50 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  e.          ** e
12e60 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
12e70 69 65 64 20 62 65 68 61 76 69 6f 75 72 20 66 6f  ied behaviour fo
12e80 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  r the index..   
12e90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
12ea0 20 20 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e      if( !(pIdx->
12eb0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
12ec0 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f  ult || pIndex->o
12ed0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
12ee0 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lt) ){.         
12ef0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12f00 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
12f10 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e              "con
12f20 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46  flicting ON CONF
12f30 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73 70 65  LICT clauses spe
12f40 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20  cified", 0);.   
12f50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12f60 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
12f70 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
12f80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12f90 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  pIdx->onError = 
12fa0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b  pIndex->onError;
12fb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
12fc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
12fd0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12fe0 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
12ff0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c     }.  }..  /* L
13000 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65  ink the new Inde
13010 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  x structure to i
13020 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20  ts table and to 
13030 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69  the other.  ** i
13040 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
13050 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20  e structures. . 
13060 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
13070 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49  it.busy ){.    I
13080 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d  ndex *p;.    p =
13090 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
130a0 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 49 6e 64  rt(&db->aDb[pInd
130b0 65 78 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68  ex->iDb].idxHash
130c0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
130d0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64              pInd
130e0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  ex->zName, strle
130f0 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  n(pIndex->zName)
13100 2b 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20  +1, pIndex);.   
13110 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
13120 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65  assert( p==pInde
13130 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  x );  /* Malloc 
13140 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
13150 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   */.      goto e
13160 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13170 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
13180 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
13190 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
131a0 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21     if( pTblName!
131b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  =0 ){.      pInd
131c0 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69  ex->tnum = db->i
131d0 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20  nit.newTnum;.   
131e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
131f0 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  the db->init.bus
13200 79 20 69 73 20 30 20 74 68 65 6e 20 63 72 65 61  y is 0 then crea
13210 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  te the index on 
13220 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  disk.  This.  **
13230 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e   involves writin
13240 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f  g the index into
13250 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
13260 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e  e and filling in
13270 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
13280 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
13290 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e   table contents.
132a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64  .  **.  ** The d
132b0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
132c0 30 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  0 when the user 
132d0 66 69 72 73 74 20 65 6e 74 65 72 73 20 61 20 43  first enters a C
132e0 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a  REATE INDEX .  *
132f0 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e  * command.  db->
13300 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 77  init.busy is 1 w
13310 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 69  hen a database i
13320 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20  s opened and .  
13330 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  ** CREATE INDEX 
13340 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72  statements are r
13350 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ead out of the m
13360 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e  aster table.  In
13370 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72  .  ** the latter
13380 20 63 61 73 65 20 74 68 65 20 69 6e 64 65 78 20   case the index 
13390 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 6f  already exists o
133a0 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73  n disk, which is
133b0 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e   why.  ** we don
133c0 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65  't want to recre
133d0 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a  ate it..  **.  *
133e0 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  * If pTblName==0
133f0 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69   it means this i
13400 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65  ndex is generate
13410 64 20 61 73 20 61 20 70 72 69 6d 61 72 79 20 6b  d as a primary k
13420 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55  ey.  ** or UNIQU
13430 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20  E constraint of 
13440 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
13450 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65  tatement.  Since
13460 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20   the table.  ** 
13470 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72  has just been cr
13480 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69  eated, it contai
13490 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74  ns no data and t
134a0 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c  he index initial
134b0 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65  ization.  ** ste
134c0 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64  p can be skipped
134d0 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
134e0 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
134f0 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =0 ){.    Vdbe *
13500 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  v;.    char *zSt
13510 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d  mt;.    int iMem
13520 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
13530 2b 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  +;..    v = sqli
13540 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
13550 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
13560 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
13570 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20  ate_index;..    
13580 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f  /* Create the ro
13590 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 69  otpage for the i
135a0 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ndex.    */.    
135b0 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
135c0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
135d0 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 1, iDb);.    
135e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
135f0 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64  (v, OP_CreateInd
13600 65 78 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20  ex, iDb, 0);.   
13610 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13620 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
13630 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 0a 20 20 20  , iMem, 0);..   
13640 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20 63   /* Gather the c
13650 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
13660 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58  the CREATE INDEX
13670 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a   statement into.
13680 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74      ** the zStmt
13690 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f   variable.    */
136a0 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20  .    if( pStart 
136b0 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  && pEnd ){.     
136c0 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65   /* A named inde
136d0 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63  x with an explic
136e0 69 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  it CREATE INDEX 
136f0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
13700 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
13710 65 33 4d 50 72 69 6e 74 66 28 22 43 52 45 41 54  e3MPrintf("CREAT
13720 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c  E%s INDEX %.*s",
13730 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72  .        onError
13740 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a  ==OE_None ? "" :
13750 20 22 20 55 4e 49 51 55 45 22 2c 0a 20 20 20 20   " UNIQUE",.    
13760 20 20 20 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a      Addr(pEnd->z
13770 29 20 2d 20 41 64 64 72 28 70 4e 61 6d 65 2d 3e  ) - Addr(pName->
13780 7a 29 20 2b 20 31 2c 0a 20 20 20 20 20 20 20 20  z) + 1,.        
13790 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d  pName->z);.    }
137a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
137b0 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
137c0 78 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50  x created by a P
137d0 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
137e0 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
137f0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d  */.      /* zStm
13800 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
13810 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20  tf(""); */.     
13820 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   zStmt = 0;.    
13830 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e  }..    /* Add an
13840 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65   entry in sqlite
13850 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73  _master for this
13860 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20   index.    */.  
13870 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
13880 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
13890 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
138a0 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28  TO %Q.%s VALUES(
138b0 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 30  'index',%Q,%Q,#0
138c0 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20  ,%Q);",.        
138d0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
138e0 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
138f0 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70  (iDb),.        p
13900 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  Index->zName,.  
13910 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
13920 65 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74  e,.        zStmt
13930 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
13940 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13950 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
13960 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 53     sqliteFree(zS
13970 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  tmt);..    /* Fi
13980 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69 74  ll the index wit
13990 68 20 64 61 74 61 20 61 6e 64 20 72 65 70 61 72  h data and repar
139a0 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43  se the schema. C
139b0 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65  ode an OP_Expire
139c0 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c  .    ** to inval
139d0 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f  idate all pre-co
139e0 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
139f0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
13a00 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20  ( pTblName ){.  
13a10 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
13a20 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
13a30 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20  Index, iMem);.  
13a40 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
13a50 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69  eCookie(db, v, i
13a60 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
13a70 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
13a80 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62  ParseSchema, iDb
13a90 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71  , 0,.         sq
13aa0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 6e 61  lite3MPrintf("na
13ab0 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78  me='%q'", pIndex
13ac0 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e  ->zName), P3_DYN
13ad0 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  AMIC);.      sql
13ae0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
13af0 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c 20 30   OP_Expire, 0, 0
13b00 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
13b10 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61  /* When adding a
13b20 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c  n index to the l
13b30 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66  ist of indices f
13b40 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65  or a table, make
13b50 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69  .  ** sure all i
13b60 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f  ndices labeled O
13b70 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61  E_Replace come a
13b80 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c  fter all those l
13b90 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49  abeled.  ** OE_I
13ba0 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20  gnore.  This is 
13bb0 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68  necessary for th
13bc0 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  e correct operat
13bd0 69 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20  ion of UPDATE.  
13be0 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20  ** and INSERT.. 
13bf0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
13c00 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e  it.busy || pTblN
13c10 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ame==0 ){.    if
13c20 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ( onError!=OE_Re
13c30 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70  place || pTab->p
13c40 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20  Index==0.       
13c50 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65    || pTab->pInde
13c60 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52  x->onError==OE_R
13c70 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70  eplace){.      p
13c80 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
13c90 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
13ca0 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20     pTab->pIndex 
13cb0 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65  = pIndex;.    }e
13cc0 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
13cd0 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d   *pOther = pTab-
13ce0 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77  >pIndex;.      w
13cf0 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e  hile( pOther->pN
13d00 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70  ext && pOther->p
13d10 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  Next->onError!=O
13d20 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20  E_Replace ){.   
13d30 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f       pOther = pO
13d40 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
13d50 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65     }.      pInde
13d60 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65  x->pNext = pOthe
13d70 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
13d80 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20  pOther->pNext = 
13d90 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  pIndex;.    }.  
13da0 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
13db0 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  }..  /* Clean up
13dc0 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20   before exiting 
13dd0 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69  */.exit_create_i
13de0 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64  ndex:.  if( pInd
13df0 65 78 20 29 7b 0a 20 20 20 20 66 72 65 65 49 6e  ex ){.    freeIn
13e00 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d  dex(pIndex);.  }
13e10 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
13e20 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
13e30 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
13e40 74 44 65 6c 65 74 65 28 70 54 62 6c 4e 61 6d 65  tDelete(pTblName
13e50 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
13e60 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
13e70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
13e80 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f  routine will dro
13e90 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61  p an existing na
13ea0 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73  med index.  This
13eb0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c   routine.** impl
13ec0 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20  ements the DROP 
13ed0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e  INDEX statement.
13ee0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13ef0 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20  DropIndex(Parse 
13f00 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
13f10 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65   *pName){.  Inde
13f20 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62  x *pIndex;.  Vdb
13f30 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
13f40 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
13f50 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
13f60 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
13f70 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
13f80 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
13f90 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
13fa0 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  1 );.  if( SQLIT
13fb0 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
13fc0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
13fd0 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 49 6e 64  ) return;.  pInd
13fe0 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
13ff0 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d  Index(db, pName-
14000 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61  >a[0].zName, pNa
14010 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
14020 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  se);.  if( pInde
14030 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x==0 ){.    sqli
14040 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14050 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
14060 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20  ex: %S", pName, 
14070 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
14080 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
14090 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
140a0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
140b0 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74   if( pIndex->aut
140c0 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71  oIndex ){.    sq
140d0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
140e0 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73  arse, "index ass
140f0 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49  ociated with UNI
14100 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20  QUE ".      "or 
14110 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
14120 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65  traint cannot be
14130 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20   dropped", 0);. 
14140 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14150 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66  p_index;.  }.#if
14160 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14170 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
14180 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20   {.    int code 
14190 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e  = SQLITE_DROP_IN
141a0 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  DEX;.    Table *
141b0 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
141c0 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  Table;.    const
141d0 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
141e0 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62  >aDb[pIndex->iDb
141f0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  ].zName;.    con
14200 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
14210 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 49 6e  SCHEMA_TABLE(pIn
14220 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 69  dex->iDb);.    i
14230 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
14240 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
14250 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
14260 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
14270 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
14280 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
14290 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 44    if( pIndex->iD
142a0 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  b ) code = SQLIT
142b0 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45  E_DROP_TEMP_INDE
142c0 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
142d0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
142e0 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78  se, code, pIndex
142f0 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  ->zName, pTab->z
14300 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
14310 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
14320 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
14330 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
14340 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
14350 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  o remove the ind
14360 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20  ex and from the 
14370 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
14380 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
14390 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
143a0 69 66 28 20 76 20 29 7b 0a 20 20 20 20 69 6e 74  if( v ){.    int
143b0 20 69 44 62 20 3d 20 70 49 6e 64 65 78 2d 3e 69   iDb = pIndex->i
143c0 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e  Db;.    sqlite3N
143d0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
143e0 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54  e,.       "DELET
143f0 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
14400 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20  RE name=%Q",.   
14410 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
14420 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
14430 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20  ABLE(iDb),.     
14440 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a    pIndex->zName.
14450 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
14460 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  e3ChangeCookie(d
14470 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  b, v, iDb);.    
14480 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
14490 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e  pParse, pIndex->
144a0 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
144b0 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
144c0 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20  , OP_DropIndex, 
144d0 69 44 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  iDb, 0, pIndex->
144e0 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a  zName, 0);.  }..
144f0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a  exit_drop_index:
14500 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
14510 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a  tDelete(pName);.
14520 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
14530 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
14540 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73   the given IdLis
14550 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
14560 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65   IdList if.** ne
14570 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ed be..**.** A n
14580 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74  ew IdList is ret
14590 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
145a0 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
145b0 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c  ..*/.IdList *sql
145c0 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
145d0 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
145e0 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
145f0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
14600 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
14610 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
14620 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
14630 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
14640 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
14650 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30  List->nAlloc = 0
14660 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
14670 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73 74 2d 3e 6e  t->nId>=pList->n
14680 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 73 74 72  Alloc ){.    str
14690 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20  uct IdList_item 
146a0 2a 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e  *a;.    pList->n
146b0 41 6c 6c 6f 63 20 3d 20 70 4c 69 73 74 2d 3e 6e  Alloc = pList->n
146c0 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20 20  Alloc*2 + 5;.   
146d0 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c   a = sqliteReall
146e0 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69  oc(pList->a, pLi
146f0 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f  st->nAlloc*sizeo
14700 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
14710 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
14720 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
14730 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
14740 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
14750 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c   0;.    }.    pL
14760 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a  ist->a = a;.  }.
14770 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d    memset(&pList-
14780 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20  >a[pList->nId], 
14790 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  0, sizeof(pList-
147a0 3e 61 5b 30 5d 29 29 3b 0a 20 20 70 4c 69 73 74  >a[0]));.  pList
147b0 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e  ->a[pList->nId].
147c0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
147d0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f  ameFromToken(pTo
147e0 6b 65 6e 29 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e  ken);.  pList->n
147f0 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70  Id++;.  return p
14800 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  List;.}../*.** A
14810 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c  ppend a new tabl
14820 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69  e name to the gi
14830 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72  ven SrcList.  Cr
14840 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69  eate a new SrcLi
14850 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
14860 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
14870 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  s created in the
14880 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66   SrcList even if
14890 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e   pToken is NULL.
148a0 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63  .**.** A new Src
148b0 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
148c0 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
148d0 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a  loc() fails..**.
148e0 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20  ** If pDatabase 
148f0 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20  is not null, it 
14900 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74  means that the t
14910 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69  able has an opti
14920 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  onal.** database
14930 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c   name prefix.  L
14940 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61  ike this:  "data
14950 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68  base.table".  Th
14960 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70  e pDatabase.** p
14970 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62  oints to the tab
14980 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
14990 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  pTable points to
149a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
149b0 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69  me..** The SrcLi
149c0 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65  st.a[].zName fie
149d0 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ld is filled wit
149e0 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
149f0 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20   which might.** 
14a00 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  come from pTable
14a10 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69   (if pDatabase i
14a20 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20  s NULL) or from 
14a30 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20  pDatabase.  .** 
14a40 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74  SrcList.a[].zDat
14a50 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20  abase is filled 
14a60 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
14a70 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62  e name from pTab
14a80 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e  le,.** or with N
14a90 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61  ULL if no databa
14aa0 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e  se is specified.
14ab0 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
14ac0 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c  words, if call l
14ad0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
14ae0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
14af0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42  rcListAppend(A,B
14b00 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,0);.**.** Then 
14b10 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d  B is a table nam
14b20 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
14b30 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65  se name is unspe
14b40 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c  cified.  If call
14b50 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a  ed.** like this:
14b60 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
14b70 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
14b80 65 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a  end(A,B,C);.**.*
14b90 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20  * Then C is the 
14ba0 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42  table name and B
14bb0 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65   is the database
14bc0 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73   name..*/.SrcLis
14bd0 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
14be0 74 41 70 70 65 6e 64 28 53 72 63 4c 69 73 74 20  tAppend(SrcList 
14bf0 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
14c00 54 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70 44  Table, Token *pD
14c10 61 74 61 62 61 73 65 29 7b 0a 20 20 73 74 72 75  atabase){.  stru
14c20 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
14c30 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
14c40 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
14c50 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ist = sqliteMall
14c60 6f 63 28 20 73 69 7a 65 6f 66 28 53 72 63 4c 69  oc( sizeof(SrcLi
14c70 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
14c80 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
14c90 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
14ca0 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20  Alloc = 1;.  }. 
14cb0 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53 72 63   if( pList->nSrc
14cc0 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20  >=pList->nAlloc 
14cd0 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  ){.    SrcList *
14ce0 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73 74 2d  pNew;.    pList-
14cf0 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20  >nAlloc *= 2;.  
14d00 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    pNew = sqliteR
14d10 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a 20 20  ealloc(pList,.  
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
14d30 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20 28 70  eof(*pList) + (p
14d40 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a  List->nAlloc-1)*
14d50 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
14d60 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  0]) );.    if( p
14d70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
14d80 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
14d90 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
14da0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
14db0 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70   }.    pList = p
14dc0 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  New;.  }.  pItem
14dd0 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
14de0 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20 20 6d 65 6d  st->nSrc];.  mem
14df0 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69  set(pItem, 0, si
14e00 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
14e10 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62  ));.  if( pDatab
14e20 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65  ase && pDatabase
14e30 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  ->z==0 ){.    pD
14e40 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
14e50 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
14e60 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a 20 20   && pTable ){.  
14e70 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d    Token *pTemp =
14e80 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20   pDatabase;.    
14e90 70 44 61 74 61 62 61 73 65 20 3d 20 70 54 61 62  pDatabase = pTab
14ea0 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d  le;.    pTable =
14eb0 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49   pTemp;.  }.  pI
14ec0 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
14ed0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
14ee0 6e 28 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74  n(pTable);.  pIt
14ef0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
14f00 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
14f10 6f 6b 65 6e 28 70 44 61 74 61 62 61 73 65 29 3b  oken(pDatabase);
14f20 0a 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  .  pItem->iCurso
14f30 72 20 3d 20 2d 31 3b 0a 20 20 70 4c 69 73 74 2d  r = -1;.  pList-
14f40 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72  >nSrc++;.  retur
14f50 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
14f60 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f 72 73  * Assign cursors
14f70 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   to all tables i
14f80 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76  n a SrcList.*/.v
14f90 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
14fa0 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
14fb0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
14fc0 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
14fd0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
14fe0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
14ff0 70 49 74 65 6d 3b 0a 20 20 66 6f 72 28 69 3d 30  pItem;.  for(i=0
15000 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
15010 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
15020 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
15030 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69      if( pItem->i
15040 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61  Cursor>=0 ) brea
15050 6b 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 43  k;.    pItem->iC
15060 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
15070 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28 20  nTab++;.    if( 
15080 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
15090 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
150a0 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
150b0 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65  ors(pParse, pIte
150c0 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  m->pSelect->pSrc
150d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
150e0 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69  /*.** Add an ali
150f0 61 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 69  as to the last i
15100 64 65 6e 74 69 66 69 65 72 20 6f 6e 20 74 68 65  dentifier on the
15110 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66 69 65   given identifie
15120 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  r list..*/.void 
15130 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 64  sqlite3SrcListAd
15140 64 41 6c 69 61 73 28 53 72 63 4c 69 73 74 20 2a  dAlias(SrcList *
15150 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
15160 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69  oken){.  if( pLi
15170 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53 72  st && pList->nSr
15180 63 3e 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  c>0 ){.    pList
15190 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d  ->a[pList->nSrc-
151a0 31 5d 2e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  1].zAlias = sqli
151b0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
151c0 28 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 7d 0a  (pToken);.  }.}.
151d0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
151e0 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64   IdList..*/.void
151f0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
15200 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69  lete(IdList *pLi
15210 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
15220 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
15230 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
15240 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
15250 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
15260 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Free(pList->a[i]
15270 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
15280 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
15290 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  >a);.  sqliteFre
152a0 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pList);.}../*.
152b0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
152c0 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20  dex in pList of 
152d0 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e  the identifier n
152e0 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72  amed zId.  Retur
152f0 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66  n -1.** if not f
15300 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
15310 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28  ite3IdListIndex(
15320 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63  IdList *pList, c
15330 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
15340 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
15350 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
15360 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d  urn -1;.  for(i=
15370 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
15380 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
15390 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c  qlite3StrICmp(pL
153a0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
153b0 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74   zName)==0 ) ret
153c0 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
153d0 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
153e0 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
153f0 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64  e SrcList includ
15400 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73  ing all its subs
15410 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
15420 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
15430 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20 2a  Delete(SrcList *
15440 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
15450 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
15460 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
15470 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
15480 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49  return;.  for(pI
15490 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
154a0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  0; i<pList->nSrc
154b0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
154c0 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
154d0 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
154e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
154f0 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  e(pItem->zName);
15500 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
15510 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
15520 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
15530 54 61 62 20 26 26 20 70 49 74 65 6d 2d 3e 70 54  Tab && pItem->pT
15540 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20  ab->isTransient 
15550 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15560 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
15570 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
15580 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65   }.    sqlite3Se
15590 6c 65 63 74 44 65 6c 65 74 65 28 70 49 74 65 6d  lectDelete(pItem
155a0 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
155b0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
155c0 65 28 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20  e(pItem->pOn);. 
155d0 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
155e0 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 55  Delete(pItem->pU
155f0 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sing);.  }.  sql
15600 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a  iteFree(pList);.
15610 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
15620 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
15630 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
15640 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  nTransaction(Par
15650 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
15660 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  type){.  sqlite3
15670 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
15680 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
15690 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
156a0 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
156b0 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
156c0 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
156d0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
156e0 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
156f0 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
15700 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
15710 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
15720 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
15730 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22  SACTION, "BEGIN"
15740 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
15750 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
15760 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
15770 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75  .  if( !v ) retu
15780 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d  rn;.  if( type!=
15790 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20  TK_DEFERRED ){. 
157a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
157b0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
157c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
157d0 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  dOp(v, OP_Transa
157e0 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d  ction, i, (type=
157f0 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31  =TK_EXCLUSIVE)+1
15800 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
15810 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
15820 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
15830 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 0, 0);.}../*.*
15840 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73  * Commit a trans
15850 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
15860 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e  qlite3CommitTran
15870 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
15880 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
15890 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
158a0 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
158b0 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
158c0 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
158d0 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
158e0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
158f0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
15900 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
15910 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
15920 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
15930 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
15940 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
15950 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29   "COMMIT", 0, 0)
15960 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20   ) return;..  v 
15970 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
15980 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
15990 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
159a0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
159b0 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30  AutoCommit, 1, 0
159c0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
159d0 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  Rollback a trans
159e0 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
159f0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72  qlite3RollbackTr
15a00 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
15a10 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
15a20 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
15a30 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  *v;..  if( pPars
15a40 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
15a50 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
15a60 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
15a70 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
15a80 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
15a90 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
15aa0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
15ab0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
15ac0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
15ad0 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
15ae0 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30  N, "ROLLBACK", 0
15af0 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  , 0) ) return;..
15b00 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
15b10 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
15b20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
15b30 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
15b40 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
15b50 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1, 1);.  }.}../*
15b60 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
15b70 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
15b80 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69  is open and avai
15b90 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20  lable for use.  
15ba0 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  Return.** the nu
15bb0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
15bc0 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
15bd0 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65   messages in the
15be0 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
15bf0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
15c00 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
15c10 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a  Database(Parse *
15c20 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
15c30 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
15c40 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61  >db;.  if( db->a
15c50 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20  Db[1].pBt==0 && 
15c60 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
15c70 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
15c80 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 63   sqlite3BtreeFac
15c90 74 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20 4d  tory(db, 0, 0, M
15ca0 41 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 61  AX_PAGES, &db->a
15cb0 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[1].pBt);.    
15cc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15cd0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
15ce0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15cf0 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  e, "unable to op
15d00 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64  en a temporary d
15d10 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20  atabase ".      
15d20 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72    "file for stor
15d30 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
15d40 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50  bles");.      pP
15d50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
15d60 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
15d70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
15d80 3e 66 6c 61 67 73 20 26 20 21 64 62 2d 3e 61 75  >flags & !db->au
15d90 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
15da0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
15db0 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62  reeBeginTrans(db
15dc0 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 2c 20 31 29  ->aDb[1].pBt, 1)
15dd0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
15de0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15df0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
15e00 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
15e10 61 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72  able to get a wr
15e20 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20  ite lock on ".  
15e30 20 20 20 20 20 20 20 20 22 74 68 65 20 74 65 6d          "the tem
15e40 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
15e50 66 69 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20  file");.        
15e60 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b  pParse->rc = rc;
15e70 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
15e80 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
15e90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
15ea0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
15eb0 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
15ec0 74 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68  t will verify th
15ed0 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
15ee0 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72  and start.** a r
15ef0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
15f00 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61  for all named da
15f10 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a  tabase files..**
15f20 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74  .** It is import
15f30 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68  ant that all sch
15f40 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76  ema cookies be v
15f50 65 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a  erified and all.
15f60 2a 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63 74  ** read transact
15f70 69 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64 20  ions be started 
15f80 62 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20  before anything 
15f90 65 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a  else happens in.
15fa0 2a 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f 67  ** the VDBE prog
15fb0 72 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72  ram.  But this r
15fc0 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61  outine can be ca
15fd0 6c 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68 20  lled after much 
15fe0 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61  other.** code ha
15ff0 73 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64  s been generated
16000 2e 20 20 53 6f 20 68 65 72 65 20 69 73 20 77 68  .  So here is wh
16010 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20  at we do:.**.** 
16020 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
16030 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
16040 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61  alled, we code a
16050 6e 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a  n OP_Goto that.*
16060 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61  * will jump to a
16070 20 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74   subroutine at t
16080 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72  he end of the pr
16090 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a  ogram.  Then we.
160a0 2a 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79 20  ** record every 
160b0 64 61 74 61 62 61 73 65 20 74 68 61 74 20 6e 65  database that ne
160c0 65 64 73 20 69 74 73 20 73 63 68 65 6d 61 20 76  eds its schema v
160d0 65 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  erified in the.*
160e0 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  * pParse->cookie
160f0 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74  Mask field.  Lat
16100 65 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74  er, after all ot
16110 68 65 72 20 63 6f 64 65 20 68 61 73 20 62 65 65  her code has bee
16120 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20  n.** generated, 
16130 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  the subroutine t
16140 68 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f  hat does the coo
16150 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  kie verification
16160 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20  s and.** starts 
16170 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  the transactions
16180 20 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61   will be coded a
16190 6e 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50  nd the OP_Goto P
161a0 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  2 value.** will 
161b0 62 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74  be made to point
161c0 20 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74   to that subrout
161d0 69 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61  ine.  The genera
161e0 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63  tion of the.** c
161f0 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69  ookie verificati
16200 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f  on subroutine co
16210 64 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71  de happens in sq
16220 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
16230 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44  g()..**.** If iD
16240 62 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68  b<0 then code th
16250 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d  e OP_Goto only -
16260 20 64 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20   don't set flag 
16270 74 6f 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a  to verify the.**
16280 20 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64   schema on any d
16290 61 74 61 62 61 73 65 73 2e 20 20 54 68 69 73 20  atabases.  This 
162a0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70  can be used to p
162b0 6f 73 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47  osition the OP_G
162c0 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20  oto.** early in 
162d0 74 68 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65  the code, before
162e0 20 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20   we know if any 
162f0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 73 20  database tables 
16300 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f  will be used..*/
16310 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
16320 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61  eVerifySchema(Pa
16330 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
16340 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33   iDb){.  sqlite3
16350 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
16360 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20  .  int mask;..  
16370 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
16380 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
16390 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
163a0 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68    /* This only h
163b0 61 70 70 65 6e 73 20 69 66 20 74 68 65 72 65 20  appens if there 
163c0 77 61 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f  was a prior erro
163d0 72 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  r */.  db = pPar
163e0 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50  se->db;.  if( pP
163f0 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
16400 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ==0 ){.    pPars
16410 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20  e->cookieGoto = 
16420 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16430 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
16440 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  0)+1;.  }.  if( 
16450 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73  iDb>=0 ){.    as
16460 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44  sert( iDb<db->nD
16470 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b );.    assert(
16480 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
16490 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29  t!=0 || iDb==1 )
164a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  ;.    assert( iD
164b0 62 3c 33 32 20 29 3b 0a 20 20 20 20 6d 61 73 6b  b<32 );.    mask
164c0 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 20 20 69   = 1<<iDb;.    i
164d0 66 28 20 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  f( (pParse->cook
164e0 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  ieMask & mask)==
164f0 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  0 ){.      pPars
16500 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d  e->cookieMask |=
16510 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 50 61   mask;.      pPa
16520 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65  rse->cookieValue
16530 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  [iDb] = db->aDb[
16540 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b  iDb].schema_cook
16550 69 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 44  ie;.      if( iD
16560 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
16570 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
16580 61 74 61 62 61 73 65 28 70 50 61 72 73 65 29 3b  atabase(pParse);
16590 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
165a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
165b0 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
165c0 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72  hat prepares for
165d0 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74   doing an operat
165e0 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  ion that.** migh
165f0 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74  t change the dat
16600 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abase..**.** Thi
16610 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
16620 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
16630 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  on if we are not
16640 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a   already within.
16650 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
16660 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72  .  If we are alr
16670 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72  eady within a tr
16680 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
16690 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  a checkpoint.** 
166a0 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65  is set if the se
166b0 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d  tStatement param
166c0 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41  eter is true.  A
166d0 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
166e0 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72  ld.** be set for
166f0 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74   operations that
16700 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65   might fail (due
16710 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   to a constraint
16720 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  ) part of.** the
16730 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64   way through and
16740 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64   which will need
16750 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72   to undo some wr
16760 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76  ites without hav
16770 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61  ing to.** rollba
16780 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  ck the whole tra
16790 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f  nsaction.  For o
167a0 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20  perations where 
167b0 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
167c0 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65  ** can be checke
167d0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  d before any cha
167e0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
167f0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
16800 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65  t is never.** ne
16810 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
16820 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20  a write and the 
16830 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
16840 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a  d not be set..**
16850 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73  .** Only databas
16860 65 20 69 44 62 20 61 6e 64 20 74 68 65 20 74 65  e iDb and the te
16870 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20  mp database are 
16880 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 62 79  made writable by
16890 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49   this call..** I
168a0 66 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74  f iDb==0, then t
168b0 68 65 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70  he main and temp
168c0 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 6d   databases are m
168d0 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20  ade writable.   
168e0 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65  If.** iDb==1 the
168f0 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20  n only the temp 
16900 64 61 74 61 62 61 73 65 20 69 73 20 6d 61 64 65  database is made
16910 20 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69   writable.  If i
16920 44 62 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a  Db>1 then the.**
16930 20 73 70 65 63 69 66 69 65 64 20 61 75 78 69 6c   specified auxil
16940 69 61 72 79 20 64 61 74 61 62 61 73 65 20 61 6e  iary database an
16950 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  d the temp datab
16960 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69  ase are made wri
16970 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
16980 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
16990 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
169a0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74  *pParse, int set
169b0 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69  Statement, int i
169c0 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
169d0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
169e0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
169f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
16a00 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
16a10 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
16a20 69 44 62 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  iDb);.  pParse->
16a30 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c  writeMask |= 1<<
16a40 69 44 62 3b 0a 20 20 69 66 28 20 73 65 74 53 74  iDb;.  if( setSt
16a50 61 74 65 6d 65 6e 74 20 26 26 20 70 50 61 72 73  atement && pPars
16a60 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a  e->nested==0 ){.
16a70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16a80 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74 65  ddOp(v, OP_State
16a90 6d 65 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20  ment, iDb, 0);. 
16aa0 20 7d 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20   }.  if( iDb!=1 
16ab0 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  && pParse->db->a
16ac0 44 62 5b 31 5d 2e 70 42 74 21 3d 30 20 29 7b 0a  Db[1].pBt!=0 ){.
16ad0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
16ae0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
16af0 50 61 72 73 65 2c 20 73 65 74 53 74 61 74 65 6d  Parse, setStatem
16b00 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  ent, 1);.  }.}..
16b10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16b20 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 20 0a 2a 2a  MIT_UTF16./* .**
16b30 20 52 65 74 75 72 6e 20 74 68 65 20 74 72 61 6e   Return the tran
16b40 73 69 65 6e 74 20 73 71 6c 69 74 65 33 5f 76 61  sient sqlite3_va
16b50 6c 75 65 20 6f 62 6a 65 63 74 20 75 73 65 64 20  lue object used 
16b60 66 6f 72 20 65 6e 63 6f 64 69 6e 67 20 63 6f 6e  for encoding con
16b70 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 64 75 72 69  versions.** duri
16b80 6e 67 20 53 51 4c 20 63 6f 6d 70 69 6c 61 74 69  ng SQL compilati
16b90 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76  on..*/.sqlite3_v
16ba0 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 47 65 74  alue *sqlite3Get
16bb0 54 72 61 6e 73 69 65 6e 74 56 61 6c 75 65 28 73  TransientValue(s
16bc0 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
16bd0 66 28 20 21 64 62 2d 3e 70 56 61 6c 75 65 20 29  f( !db->pValue )
16be0 7b 0a 20 20 20 20 64 62 2d 3e 70 56 61 6c 75 65  {.    db->pValue
16bf0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
16c00 65 77 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ew();.  }.  retu
16c10 72 6e 20 64 62 2d 3e 70 56 61 6c 75 65 3b 0a 7d  rn db->pValue;.}
16c20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
16c30 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
16c40 49 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63  Index uses the c
16c50 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
16c60 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e  e pColl.  Return
16c70 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64  .** true if it d
16c80 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66  oes and false if
16c90 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f   it does not..*/
16ca0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16cb0 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
16cc0 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f  tic int collatio
16cd0 6e 4d 61 74 63 68 28 43 6f 6c 6c 53 65 71 20 2a  nMatch(CollSeq *
16ce0 70 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49  pColl, Index *pI
16cf0 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  ndex){.  int n =
16d00 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f   pIndex->keyInfo
16d10 2e 6e 46 69 65 6c 64 3b 0a 20 20 43 6f 6c 6c 53  .nField;.  CollS
16d20 65 71 20 2a 2a 70 70 20 3d 20 70 49 6e 64 65 78  eq **pp = pIndex
16d30 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 3b  ->keyInfo.aColl;
16d40 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 29 7b  .  while( n-- ){
16d50 0a 20 20 20 20 69 66 28 20 2a 70 70 3d 3d 70 43  .    if( *pp==pC
16d60 6f 6c 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  oll ) return 1;.
16d70 20 20 20 20 70 70 2b 2b 3b 0a 20 20 7d 0a 20 20      pp++;.  }.  
16d80 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
16d90 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70  if../*.** Recomp
16da0 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
16db0 6f 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65  of pTab that use
16dc0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
16dd0 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a  equence pColl..*
16de0 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68  * If pColl==0 th
16df0 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c  en recompute all
16e00 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62   indices of pTab
16e10 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
16e20 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
16e30 0a 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62  .void reindexTab
16e40 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
16e50 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 43  , Table *pTab, C
16e60 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a  ollSeq *pColl){.
16e70 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
16e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16e90 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
16ea0 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
16eb0 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d  /..  for(pIndex=
16ec0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
16ed0 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e  ndex; pIndex=pIn
16ee0 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  dex->pNext){.   
16ef0 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 7c 7c   if( pColl==0 ||
16f00 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
16f10 70 43 6f 6c 6c 2c 70 49 6e 64 65 78 29 20 29 7b  pColl,pIndex) ){
16f20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
16f30 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
16f40 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 61  n(pParse, 0, pTa
16f50 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 73  b->iDb);.      s
16f60 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
16f70 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
16f80 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , -1);.    }.  }
16f90 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
16fa0 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
16fb0 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61  ndices of all ta
16fc0 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  bles in all data
16fd0 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a  bases where the.
16fe0 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74  ** indices use t
16ff0 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
17000 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66  uence pColl.  If
17010 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
17020 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20  ecompute.** all 
17030 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65  indices everywhe
17040 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  re..*/.#ifndef S
17050 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
17060 45 58 0a 76 6f 69 64 20 72 65 69 6e 64 65 78 44  EX.void reindexD
17070 61 74 61 62 61 73 65 73 28 50 61 72 73 65 20 2a  atabases(Parse *
17080 70 50 61 72 73 65 2c 20 43 6f 6c 6c 53 65 71 20  pParse, CollSeq 
17090 2a 70 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70  *pColl){.  Db *p
170a0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
170b0 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
170c0 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
170d0 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
170e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
170f0 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
17100 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  ex number */.  s
17110 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
17120 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68  rse->db;   /* Th
17130 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
17140 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45  ction */.  HashE
17150 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20  lem *k;         
17160 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
17170 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65  oping over table
17180 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61  s in pDb */.  Ta
17190 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
171a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
171b0 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
171c0 62 61 73 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  base */..  for(i
171d0 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44  Db=0, pDb=db->aD
171e0 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  b; iDb<db->nDb; 
171f0 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20  iDb++, pDb++){. 
17200 20 20 20 69 66 28 20 70 44 62 3d 3d 30 20 29 20     if( pDb==0 ) 
17210 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
17220 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68  for(k=sqliteHash
17230 46 69 72 73 74 28 26 70 44 62 2d 3e 74 62 6c 48  First(&pDb->tblH
17240 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69  ash);  k; k=sqli
17250 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a  teHashNext(k)){.
17260 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61        pTab = (Ta
17270 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
17280 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65  ata(k);.      re
17290 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
172a0 65 2c 20 70 54 61 62 2c 20 70 43 6f 6c 6c 29 3b  e, pTab, pColl);
172b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
172c0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
172d0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
172e0 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
172f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52  ..**.**        R
17300 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20  EINDEX          
17310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17320 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20    -- 1.**       
17330 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61   REINDEX  <colla
17340 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20  tion>           
17350 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20      -- 2.**     
17360 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61     REINDEX  ?<da
17370 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e  tabase>.?<tablen
17380 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20  ame>  -- 3.**   
17390 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c       REINDEX  ?<
173a0 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65  database>.?<inde
173b0 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a  xname>  -- 4.**.
173c0 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73  ** Form 1 causes
173d0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20   all indices in 
173e0 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
173f0 61 62 61 73 65 73 20 74 6f 20 62 65 20 72 65 62  abases to be reb
17400 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20  uilt..** Form 2 
17410 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64  rebuilds all ind
17420 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  ices in all data
17430 62 61 73 65 73 20 74 68 61 74 20 75 73 65 20 74  bases that use t
17440 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c  he named.** coll
17450 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20  ating function. 
17460 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72   Forms 3 and 4 r
17470 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64  ebuild the named
17480 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a   index or all.**
17490 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
174a0 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
174b0 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66  ed table..*/.#if
174c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
174d0 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71  _REINDEX.void sq
174e0 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50 61 72  lite3Reindex(Par
174f0 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
17500 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e  n *pName1, Token
17510 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c   *pName2){.  Col
17520 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
17530 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
17540 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
17550 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20  o be reindexed, 
17560 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61  or NULL */.  cha
17570 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20  r *z;           
17580 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
17590 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69   of a table or i
175a0 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndex */.  const 
175b0 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20  char *zDb;      
175c0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
175d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
175e0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
175f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17600 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
17610 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49   database */.  I
17620 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
17630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
17640 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
17650 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20  d with pTab */. 
17660 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
17670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17680 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
17690 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  ex number */.  s
176a0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
176b0 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68  rse->db;   /* Th
176c0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
176d0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ction */.  Token
176e0 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20   *pObjName;     
176f0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
17700 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
17710 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64  ndex to be reind
17720 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  exed */..  /* Re
17730 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
17740 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72  schema. If an er
17750 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76  ror occurs, leav
17760 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
17770 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65  ge.  ** and code
17780 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
17790 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  eturn NULL. */. 
177a0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
177b0 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
177c0 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
177d0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
177e0 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 7c 7c  if( pName1==0 ||
177f0 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 20 29 7b   pName1->z==0 ){
17800 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61  .    reindexData
17810 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29  bases(pParse, 0)
17820 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
17830 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 32  }else if( pName2
17840 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a  ==0 || pName2->z
17850 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  ==0 ){.    pColl
17860 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
17870 6c 6c 53 65 71 28 64 62 2c 20 64 62 2d 3e 65 6e  llSeq(db, db->en
17880 63 2c 20 70 4e 61 6d 65 31 2d 3e 7a 2c 20 70 4e  c, pName1->z, pN
17890 61 6d 65 31 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  ame1->n, 0);.   
178a0 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
178b0 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
178c0 61 73 65 73 28 70 50 61 72 73 65 2c 20 70 43 6f  ases(pParse, pCo
178d0 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ll);.      retur
178e0 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  n;.    }.  }.  i
178f0 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
17900 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
17910 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
17920 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66  &pObjName);.  if
17930 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
17940 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e  ;.  z = sqlite3N
17950 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4f 62  ameFromToken(pOb
17960 6a 4e 61 6d 65 29 3b 0a 20 20 7a 44 62 20 3d 20  jName);.  zDb = 
17970 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
17980 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  me;.  pTab = sql
17990 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
179a0 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28  , z, zDb);.  if(
179b0 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69   pTab ){.    rei
179c0 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
179d0 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , pTab, 0);.    
179e0 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
179f0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
17a00 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
17a10 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
17a20 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , zDb);.  sqlite
17a30 46 72 65 65 28 7a 29 3b 0a 20 20 69 66 28 20 70  Free(z);.  if( p
17a40 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c  Index ){.    sql
17a50 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
17a60 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
17a70 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  0, iDb);.    sql
17a80 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
17a90 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
17aa0 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  -1);.    return;
17ab0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72  .  }.  sqlite3Er
17ac0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
17ad0 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69  unable to identi
17ae0 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f  fy the object to
17af0 20 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b   be reindexed");
17b00 0a 7d 0a 23 65 6e 64 69 66 0a                    .}.#endif.