/ Hex Artifact Content
Login

Artifact 03ccfb2d5addaa6ba7d1155cf4f27938e54b8270:


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 35 34 20 32 30 30 35 2f 31 31 2f 30 33  1.354 2005/11/03
02f0: 20 30 32 3a 30 33 3a 31 33 20 64 72 68 20 45 78   02:03:13 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 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(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 29 3b 0a 20 20 20 20 20 20 66 6f 72  to-1);.      for
0910: 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20  (iDb=0, mask=1; 
0920: 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 6d 61 73  iDb<db->nDb; mas
0930: 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29 7b 0a 20  k<<=1, iDb++){. 
0940: 20 20 20 20 20 20 20 69 66 28 20 28 6d 61 73 6b         if( (mask
0950: 20 26 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69   & pParse->cooki
0960: 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63 6f 6e 74  eMask)==0 ) cont
0970: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71  inue;.        sq
0980: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
0990: 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  , OP_Transaction
09a0: 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20 26 20 70  , iDb, (mask & p
09b0: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
09c0: 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 73  )!=0);.        s
09d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
09e0: 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b  v, OP_VerifyCook
09f0: 69 65 2c 20 69 44 62 2c 20 70 50 61 72 73 65 2d  ie, iDb, pParse-
0a00: 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62  >cookieValue[iDb
0a10: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
0a20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
0a30: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
0a40: 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  , pParse->cookie
0a50: 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  Goto);.    }..#i
0a60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0a70: 54 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 41  T_TRACE.    /* A
0a80: 64 64 20 61 20 4e 6f 2d 6f 70 20 74 68 61 74 20  dd a No-op that 
0a90: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6d  contains the com
0aa0: 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
0ab0: 65 20 63 6f 6d 70 69 6c 65 64 20 53 51 4c 0a 20  e compiled SQL. 
0ac0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
0ad0: 61 73 20 69 74 73 20 50 33 20 61 72 67 75 6d 65  as its P3 argume
0ae0: 6e 74 2e 20 20 54 68 69 73 20 64 6f 65 73 20 6e  nt.  This does n
0af0: 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 66 75  ot change the fu
0b00: 6e 63 74 69 6f 6e 61 6c 69 74 79 0a 20 20 20 20  nctionality.    
0b10: 2a 2a 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  ** of the progra
0b20: 6d 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  m. .    **.    *
0b30: 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74  * This is used t
0b40: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69  o implement sqli
0b50: 74 65 33 5f 74 72 61 63 65 28 29 2e 0a 20 20 20  te3_trace()..   
0b60: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
0b70: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 6f  dbeOp3(v, OP_Noo
0b80: 70 2c 20 30 2c 20 30 2c 20 70 50 61 72 73 65 2d  p, 0, 0, pParse-
0b90: 3e 7a 53 71 6c 2c 20 70 50 61 72 73 65 2d 3e 7a  >zSql, pParse->z
0ba0: 54 61 69 6c 2d 70 50 61 72 73 65 2d 3e 7a 53 71  Tail-pParse->zSq
0bb0: 6c 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  l);.#endif /* SQ
0bc0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
0bd0: 2a 2f 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65  */.  }...  /* Ge
0be0: 74 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  t the VDBE progr
0bf0: 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65 78 65  am ready for exe
0c00: 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66  cution.  */.  if
0c10: 28 20 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ( v && pParse->n
0c20: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49  Err==0 ){.    FI
0c30: 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d  LE *trace = (db-
0c40: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
0c50: 56 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20  VdbeTrace)!=0 ? 
0c60: 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20  stdout : 0;.    
0c70: 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 63 65  sqlite3VdbeTrace
0c80: 28 76 2c 20 74 72 61 63 65 29 3b 0a 20 20 20 20  (v, trace);.    
0c90: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
0ca0: 65 61 64 79 28 76 2c 20 70 50 61 72 73 65 2d 3e  eady(v, pParse->
0cb0: 6e 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d  nVar, pParse->nM
0cc0: 65 6d 2b 33 2c 0a 20 20 20 20 20 20 20 20 20 20  em+3,.          
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0ce0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 33 2c 20 70  Parse->nTab+3, p
0cf0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b  Parse->explain);
0d00: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
0d10: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
0d20: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
0d30: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  mesSet = 0;.  }e
0d40: 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e  lse if( pParse->
0d50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
0d60: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
0d70: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
0d80: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54    }.  pParse->nT
0d90: 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ab = 0;.  pParse
0da0: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50  ->nMem = 0;.  pP
0db0: 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a  arse->nSet = 0;.
0dc0: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
0dd0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   0;.  pParse->co
0de0: 6f 6b 69 65 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  okieMask = 0;.  
0df0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
0e00: 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  to = 0;.}../*.**
0e10: 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72 20   Run the parser 
0e20: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
0e30: 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20 69  or recursively i
0e40: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72  n order to gener
0e50: 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20  ate.** code for 
0e60: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
0e70: 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65  t given onto the
0e80: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72   end of the pPar
0e90: 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75  se context.** cu
0ea0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
0eb0: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65  nstruction.  Whe
0ec0: 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20  n the parser is 
0ed0: 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a  run recursively.
0ee0: 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68 65  ** this way, the
0ef0: 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69   final OP_Halt i
0f00: 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61  s not appended a
0f10: 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c  nd other initial
0f20: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66  ization.** and f
0f30: 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70  inalization step
0f40: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65  s are omitted be
0f50: 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20  cause those are 
0f60: 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a  handling by the.
0f70: 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72  ** outermost par
0f80: 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65  ser..**.** Not e
0f90: 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73  verything is nes
0fa0: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63  table.  This fac
0fb0: 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e 65  ility is designe
0fc0: 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49  d to permit.** I
0fd0: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61  NSERT, UPDATE, a
0fe0: 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74  nd DELETE operat
0ff0: 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c  ions against SQL
1000: 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65  ITE_MASTER.  Use
1010: 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20  .** care if you 
1020: 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f  decide to try to
1030: 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   use this routin
1040: 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
1050: 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f   purposes..*/.vo
1060: 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  id sqlite3Nested
1070: 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61  Parse(Parse *pPa
1080: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
1090: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
10a0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
10b0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 23 20 64 65  char *zSql;.# de
10c0: 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73  fine SAVE_SZ  (s
10d0: 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f  izeof(Parse) - o
10e0: 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56  ffsetof(Parse,nV
10f0: 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76 65  ar)).  char save
1100: 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20  Buf[SAVE_SZ];.. 
1110: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1120: 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  r ) return;.  as
1130: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65  sert( pParse->ne
1140: 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e  sted<10 );  /* N
1150: 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e  esting should on
1160: 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64  ly be of limited
1170: 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73   depth */.  va_s
1180: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
1190: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
11a0: 74 65 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72  te3VMPrintf(zFor
11b0: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
11c0: 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 53  nd(ap);.  if( zS
11d0: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ql==0 ){.    ret
11e0: 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c  urn;   /* A mall
11f0: 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
1200: 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61  led */.  }.  pPa
1210: 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20  rse->nested++;. 
1220: 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66 2c   memcpy(saveBuf,
1230: 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20   &pParse->nVar, 
1240: 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73  SAVE_SZ);.  mems
1250: 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72  et(&pParse->nVar
1260: 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20  , 0, SAVE_SZ);. 
1270: 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65   sqlite3RunParse
1280: 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20  r(pParse, zSql, 
1290: 30 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  0);.  sqliteFree
12a0: 28 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79  (zSql);.  memcpy
12b0: 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  (&pParse->nVar, 
12c0: 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a  saveBuf, SAVE_SZ
12d0: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73  );.  pParse->nes
12e0: 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ted--;.}../*.** 
12f0: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
1300: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
1310: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20  hat describes a 
1320: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
1330: 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76  ase.** table giv
1340: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
1350: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
1360: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
1370: 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ame of the.** da
1380: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
1390: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
13a0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
13b0: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
13c0: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
13d0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
13e0: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
13f0: 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68  the table and th
1400: 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68  e.** first match
1410: 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74  ing table is ret
1420: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
1430: 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61  king for duplica
1440: 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65  te table.** name
1450: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
1460: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
1470: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
1480: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
1490: 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61  .** auxiliary da
14a0: 74 61 62 61 73 65 73 20 61 64 64 65 64 20 75 73  tabases added us
14b0: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
14c0: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65  ommand..**.** Se
14d0: 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f  e also sqlite3Lo
14e0: 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a  cateTable()..*/.
14f0: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69  Table *sqlite3Fi
1500: 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  ndTable(sqlite3 
1510: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1520: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
1530: 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a  ar *zDatabase){.
1540: 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a    Table *p = 0;.
1550: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
1560: 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20  t( zName!=0 );. 
1570: 20 61 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c   assert( (db->fl
1580: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 69  ags & SQLITE_Ini
1590: 74 69 61 6c 69 7a 65 64 29 20 7c 7c 20 64 62 2d  tialized) || db-
15a0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
15b0: 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44  for(i=OMIT_TEMPD
15c0: 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  B; i<db->nDb; i+
15d0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
15e0: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
15f0: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d     /* Search TEM
1600: 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f  P before MAIN */
1610: 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61  .    if( zDataba
1620: 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  se!=0 && sqlite3
1630: 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73  StrICmp(zDatabas
1640: 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e  e, db->aDb[j].zN
1650: 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ame) ) continue;
1660: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
1670: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
1680: 62 5b 6a 5d 2e 74 62 6c 48 61 73 68 2c 20 7a 4e  b[j].tblHash, zN
1690: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
16a0: 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70  e)+1);.    if( p
16b0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
16c0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
16d0: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
16e0: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
16f0: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
1700: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
1710: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
1720: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
1730: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
1740: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
1750: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
1760: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
1770: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
1780: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
1790: 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f  not found.  Also
17a0: 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72   leave an.** err
17b0: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
17c0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
17d0: 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
17e0: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
17f0: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c   routine and sql
1800: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20  ite3FindTable() 
1810: 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
1820: 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61  routine leaves a
1830: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
1840: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
1850: 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69  sg where.** sqli
1860: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64  te3FindTable() d
1870: 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c  oes not..*/.Tabl
1880: 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  e *sqlite3Locate
1890: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
18a0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
18b0: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
18c0: 61 72 20 2a 7a 44 62 61 73 65 29 7b 0a 20 20 54  ar *zDbase){.  T
18d0: 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52  able *p;..  /* R
18e0: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
18f0: 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
1900: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
1910: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
1920: 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
1930: 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
1940: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
1950: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
1960: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
1970: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
1980: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1990: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69  .  p = sqlite3Fi
19a0: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
19b0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73  db, zName, zDbas
19c0: 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  e);.  if( p==0 )
19d0: 7b 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73 65  {.    if( zDbase
19e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
19f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1a00: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
1a10: 3a 20 25 73 2e 25 73 22 2c 20 7a 44 62 61 73 65  : %s.%s", zDbase
1a20: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  , zName);.    }e
1a30: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1a40: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1a50: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
1a60: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
1a70: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
1a80: 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
1a90: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
1aa0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
1ab0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
1ac0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1ad0: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
1ae0: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
1af0: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
1b00: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a  of that index.**
1b10: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   and the name of
1b20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
1b30: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
1b40: 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e  index..** Return
1b50: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
1b60: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
1b70: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
1b80: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
1b90: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a  earched for the.
1ba0: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  ** table and the
1bb0: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
1bc0: 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65  index is returne
1bd0: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
1be0: 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74  .** for duplicat
1bf0: 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73  e index names is
1c00: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
1c10: 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20  rch order is.** 
1c20: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
1c30: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20   MAIN, then any 
1c40: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
1c50: 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69  ses added.** usi
1c60: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
1c70: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20  mmand..*/.Index 
1c80: 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65  *sqlite3FindInde
1c90: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  x(sqlite3 *db, c
1ca0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1cb0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
1cc0: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  b){.  Index *p =
1cd0: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61   0;.  int i;.  a
1ce0: 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c 61 67  ssert( (db->flag
1cf0: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 69 74 69  s & SQLITE_Initi
1d00: 61 6c 69 7a 65 64 29 20 7c 7c 20 64 62 2d 3e 69  alized) || db->i
1d10: 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 66 6f  nit.busy );.  fo
1d20: 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b  r(i=OMIT_TEMPDB;
1d30: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
1d40: 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69  {.    int j = (i
1d50: 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20  <2) ? i^1 : i;  
1d60: 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62  /* Search TEMP b
1d70: 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20  efore MAIN */.  
1d80: 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c    if( zDb && sql
1d90: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
1da0: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d   db->aDb[j].zNam
1db0: 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
1dc0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
1dd0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b  shFind(&db->aDb[
1de0: 6a 5d 2e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  j].idxHash, zNam
1df0: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
1e00: 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  +1);.    if( p )
1e10: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
1e20: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1e30: 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d   Reclaim the mem
1e40: 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20 69  ory used by an i
1e50: 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ndex.*/.static v
1e60: 6f 69 64 20 66 72 65 65 49 6e 64 65 78 28 49 6e  oid freeIndex(In
1e70: 64 65 78 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dex *p){.  sqlit
1e80: 65 46 72 65 65 28 70 2d 3e 7a 43 6f 6c 41 66 66  eFree(p->zColAff
1e90: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
1ea0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  p);.}../*.** Rem
1eb0: 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e  ove the given in
1ec0: 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64  dex from the ind
1ed0: 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61  ex hash table, a
1ee0: 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d  nd free.** its m
1ef0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
1f00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ..**.** The inde
1f10: 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  x is removed fro
1f20: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  m the database h
1f30: 61 73 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a  ash tables but.*
1f40: 2a 20 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69  * it is not unli
1f50: 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61  nked from the Ta
1f60: 62 6c 65 20 74 68 61 74 20 69 74 20 69 6e 64 65  ble that it inde
1f70: 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e  xes..** Unlinkin
1f80: 67 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65  g from the Table
1f90: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79   must be done by
1fa0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
1fb0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1fc0: 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65   void sqliteDele
1fd0: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  teIndex(sqlite3 
1fe0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
1ff0: 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a    Index *pOld;..
2000: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
2010: 26 26 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29  && p->zName!=0 )
2020: 3b 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74  ;.  pOld = sqlit
2030: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  e3HashInsert(&db
2040: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64  ->aDb[p->iDb].id
2050: 78 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  xHash, p->zName,
2060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2070: 20 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65             strle
2080: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30  n(p->zName)+1, 0
2090: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6c  );.  assert( pOl
20a0: 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20  d==0 || pOld==p 
20b0: 29 3b 0a 20 20 66 72 65 65 49 6e 64 65 78 28 70  );.  freeIndex(p
20c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  );.}../*.** For 
20d0: 74 68 65 20 69 6e 64 65 78 20 63 61 6c 6c 65 64  the index called
20e0: 20 7a 49 64 78 4e 61 6d 65 20 77 68 69 63 68 20   zIdxName which 
20f0: 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  is found in the 
2100: 64 61 74 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a  database iDb,.**
2110: 20 75 6e 6c 69 6b 65 20 74 68 61 74 20 69 6e 64   unlike that ind
2120: 65 78 20 66 72 6f 6d 20 69 74 73 20 54 61 62 6c  ex from its Tabl
2130: 65 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  e then remove th
2140: 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20  e index from.** 
2150: 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74  the index hash t
2160: 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20 61 6c  able and free al
2170: 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  l memory structu
2180: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  res associated.*
2190: 2a 20 77 69 74 68 20 74 68 65 20 69 6e 64 65 78  * with the index
21a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21b0: 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
21c0: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
21d0: 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73  b, int iDb, cons
21e0: 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65  t char *zIdxName
21f0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
2200: 65 78 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a  ex;.  int len;..
2210: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a    len = strlen(z
2220: 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64  IdxName);.  pInd
2230: 65 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ex = sqlite3Hash
2240: 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b  Insert(&db->aDb[
2250: 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 7a 49  iDb].idxHash, zI
2260: 64 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31 2c 20 30  dxName, len+1, 0
2270: 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  );.  if( pIndex 
2280: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  ){.    if( pInde
2290: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
22a0: 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  x==pIndex ){.   
22b0: 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c     pIndex->pTabl
22c0: 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  e->pIndex = pInd
22d0: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ex->pNext;.    }
22e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
22f0: 78 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  x *p;.      for(
2300: 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  p=pIndex->pTable
2310: 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70  ->pIndex; p && p
2320: 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b  ->pNext!=pIndex;
2330: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20   p=p->pNext){}. 
2340: 20 20 20 20 20 69 66 28 20 70 20 26 26 20 70 2d       if( p && p-
2350: 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29  >pNext==pIndex )
2360: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65  {.        p->pNe
2370: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
2380: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
2390: 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28  }.    freeIndex(
23a0: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64  pIndex);.  }.  d
23b0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
23c0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
23d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
23e0: 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f   all schema info
23f0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
2400: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
2410: 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 61 20 73  tables of.** a s
2420: 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 2e 20  ingle database. 
2430: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2440: 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61   called to recla
2450: 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66  im memory.** bef
2460: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
2470: 20 63 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20   closes.  It is 
2480: 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69  also called duri
2490: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  ng a rollback.**
24a0: 20 69 66 20 74 68 65 72 65 20 77 65 72 65 20 73   if there were s
24b0: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75  chema changes du
24c0: 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ring the transac
24d0: 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a 2a 2a 20  tion or if a.** 
24e0: 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69  schema-cookie mi
24f0: 73 6d 61 74 63 68 20 6f 63 63 75 72 73 2e 0a 2a  smatch occurs..*
2500: 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 3d 30 20 74  *.** If iDb<=0 t
2510: 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e  hen reset the in
2520: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61  ternal schema ta
2530: 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74  bles for all dat
2540: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20  abase.** files. 
2550: 20 49 66 20 69 44 62 3e 3d 32 20 74 68 65 6e 20   If iDb>=2 then 
2560: 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e  reset the intern
2570: 61 6c 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e  al schema for on
2580: 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65  ly the.** single
2590: 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64 2e   file indicated.
25a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25b0: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
25c0: 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ema(sqlite3 *db,
25d0: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 48 61 73   int iDb){.  Has
25e0: 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20  hElem *pElem;.  
25f0: 48 61 73 68 20 74 65 6d 70 31 3b 0a 20 20 48 61  Hash temp1;.  Ha
2600: 73 68 20 74 65 6d 70 32 3b 0a 20 20 69 6e 74 20  sh temp2;.  int 
2610: 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65 72 74 28  i, j;..  assert(
2620: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
2630: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 64 62 2d 3e  b->nDb );.  db->
2640: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
2650: 5f 49 6e 69 74 69 61 6c 69 7a 65 64 3b 0a 20 20  _Initialized;.  
2660: 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d  for(i=iDb; i<db-
2670: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
2680: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
2690: 44 62 5b 69 5d 3b 0a 20 20 20 20 74 65 6d 70 31  Db[i];.    temp1
26a0: 20 3d 20 70 44 62 2d 3e 74 62 6c 48 61 73 68 3b   = pDb->tblHash;
26b0: 0a 20 20 20 20 74 65 6d 70 32 20 3d 20 70 44 62  .    temp2 = pDb
26c0: 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20 20 20 20  ->trigHash;.    
26d0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
26e0: 26 70 44 62 2d 3e 74 72 69 67 48 61 73 68 2c 20  &pDb->trigHash, 
26f0: 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49  SQLITE_HASH_STRI
2700: 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  NG, 0);.    sqli
2710: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 70 44  te3HashClear(&pD
2720: 62 2d 3e 61 46 4b 65 79 29 3b 0a 20 20 20 20 73  b->aFKey);.    s
2730: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
2740: 26 70 44 62 2d 3e 69 64 78 48 61 73 68 29 3b 0a  &pDb->idxHash);.
2750: 20 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71      for(pElem=sq
2760: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74  liteHashFirst(&t
2770: 65 6d 70 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45  emp2); pElem; pE
2780: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
2790: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
27a0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
27b0: 72 69 67 67 65 72 28 28 54 72 69 67 67 65 72 2a  rigger((Trigger*
27c0: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
27d0: 70 45 6c 65 6d 29 29 3b 0a 20 20 20 20 7d 0a 20  pElem));.    }. 
27e0: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c     sqlite3HashCl
27f0: 65 61 72 28 26 74 65 6d 70 32 29 3b 0a 20 20 20  ear(&temp2);.   
2800: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
2810: 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20  (&pDb->tblHash, 
2820: 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49  SQLITE_HASH_STRI
2830: 4e 47 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28  NG, 0);.    for(
2840: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
2850: 46 69 72 73 74 28 26 74 65 6d 70 31 29 3b 20 70  First(&temp1); p
2860: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
2870: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
2880: 29 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  )){.      Table 
2890: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
28a0: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
28b0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
28c0: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  teTable(db, pTab
28d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
28e0: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 74  ite3HashClear(&t
28f0: 65 6d 70 31 29 3b 0a 20 20 20 20 70 44 62 2d 3e  emp1);.    pDb->
2900: 70 53 65 71 54 61 62 20 3d 20 30 3b 0a 20 20 20  pSeqTab = 0;.   
2910: 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79   DbClearProperty
2920: 28 64 62 2c 20 69 2c 20 44 42 5f 53 63 68 65 6d  (db, i, DB_Schem
2930: 61 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20 69 66  aLoaded);.    if
2940: 28 20 69 44 62 3e 30 20 29 20 72 65 74 75 72 6e  ( iDb>0 ) return
2950: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2960: 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e  iDb==0 );.  db->
2970: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
2980: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
2990: 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20  .  /* If one or 
29a0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 61 75 78 69  more of the auxi
29b0: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66  liary database f
29c0: 69 6c 65 73 20 68 61 73 20 62 65 65 6e 20 63 6c  iles has been cl
29d0: 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  osed,.  ** then 
29e0: 72 65 6d 6f 76 65 20 74 68 65 6e 20 66 72 6f 6d  remove then from
29f0: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
2a00: 61 74 61 62 61 73 65 20 6c 69 73 74 2e 20 20 57  atabase list.  W
2a10: 65 20 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20  e take the.  ** 
2a20: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 64  opportunity to d
2a30: 6f 20 74 68 69 73 20 68 65 72 65 20 73 69 6e 63  o this here sinc
2a40: 65 20 77 65 20 68 61 76 65 20 6a 75 73 74 20 64  e we have just d
2a50: 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20 74 68  eleted all of th
2a60: 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 68 61  e.  ** schema ha
2a70: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68  sh tables and th
2a80: 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68  erefore do not h
2a90: 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20  ave to make any 
2aa0: 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20  changes.  ** to 
2ab0: 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 74 61 62  any of those tab
2ac0: 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  les..  */.  for(
2ad0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
2ae0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
2af0: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
2b00: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
2b10: 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20  pDb->pBt==0 ){. 
2b20: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 41       if( pDb->pA
2b30: 75 78 20 26 26 20 70 44 62 2d 3e 78 46 72 65 65  ux && pDb->xFree
2b40: 41 75 78 20 29 20 70 44 62 2d 3e 78 46 72 65 65  Aux ) pDb->xFree
2b50: 41 75 78 28 70 44 62 2d 3e 70 41 75 78 29 3b 0a  Aux(pDb->pAux);.
2b60: 20 20 20 20 20 20 70 44 62 2d 3e 70 41 75 78 20        pDb->pAux 
2b70: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
2b80: 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62   for(i=j=2; i<db
2b90: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
2ba0: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
2bb0: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
2bc0: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
2bd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2be0: 74 65 46 72 65 65 28 70 44 62 2d 3e 7a 4e 61 6d  teFree(pDb->zNam
2bf0: 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  e);.      pDb->z
2c00: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
2c10: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
2c20: 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20      if( j<i ){. 
2c30: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20       db->aDb[j] 
2c40: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20  = db->aDb[i];.  
2c50: 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d    }.    j++;.  }
2c60: 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61  .  memset(&db->a
2c70: 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e  Db[j], 0, (db->n
2c80: 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d  Db-j)*sizeof(db-
2c90: 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d  >aDb[j]));.  db-
2ca0: 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20  >nDb = j;.  if( 
2cb0: 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62  db->nDb<=2 && db
2cc0: 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74  ->aDb!=db->aDbSt
2cd0: 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63  atic ){.    memc
2ce0: 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63  py(db->aDbStatic
2cf0: 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a  , db->aDb, 2*siz
2d00: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29  eof(db->aDb[0]))
2d10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
2d20: 28 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64  (db->aDb);.    d
2d30: 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  b->aDb = db->aDb
2d40: 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Static;.  }.}../
2d50: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2d60: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
2d70: 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20  ever a rollback 
2d80: 6f 63 63 75 72 73 2e 20 20 49 66 20 74 68 65 72  occurs.  If ther
2d90: 65 20 77 65 72 65 0a 2a 2a 20 73 63 68 65 6d 61  e were.** schema
2da0: 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20   changes during 
2db0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
2dc0: 20 74 68 65 6e 20 77 65 20 68 61 76 65 20 74 6f   then we have to
2dd0: 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 69 6e   reset the.** in
2de0: 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c  ternal hash tabl
2df0: 65 73 20 61 6e 64 20 72 65 6c 6f 61 64 20 74 68  es and reload th
2e00: 65 6d 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2f  em from disk..*/
2e10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
2e20: 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68 61  lbackInternalCha
2e30: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
2e40: 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  ){.  if( db->fla
2e50: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs & SQLITE_Inte
2e60: 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
2e70: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
2e80: 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
2e90: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
2ea0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2eb0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63   called when a c
2ec0: 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f  ommit occurs..*/
2ed0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
2ee0: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
2ef0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
2f00: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
2f10: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  ~SQLITE_InternCh
2f20: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
2f30: 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
2f40: 20 6e 61 6d 65 73 20 66 72 6f 6d 20 61 20 74 61   names from a ta
2f50: 62 6c 65 20 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a  ble or view..*/.
2f60: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
2f70: 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  teResetColumnNam
2f80: 65 73 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  es(Table *pTable
2f90: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  ){.  int i;.  Co
2fa0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73  lumn *pCol;.  as
2fb0: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
2fc0: 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d  );.  if( (pCol =
2fd0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d   pTable->aCol)!=
2fe0: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
2ff0: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
3000: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
3010: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
3020: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
3030: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
3040: 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66  Delete(pCol->pDf
3050: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
3060: 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70  eFree(pCol->zTyp
3070: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
3080: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
3090: 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 70 54  >aCol);.  }.  pT
30a0: 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  able->aCol = 0;.
30b0: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
30c0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d   0;.}../*.** Rem
30d0: 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64  ove the memory d
30e0: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61  ata structures a
30f0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
3100: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c  he given.** Tabl
3110: 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  e.  No changes a
3120: 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20  re made to disk 
3130: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
3140: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
3150: 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73  ine just deletes
3160: 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74   the data struct
3170: 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ure.  It does no
3180: 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20  t unlink.** the 
3190: 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75 63  table data struc
31a0: 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61  ture from the ha
31b0: 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f 72 20 64  sh table.  Nor d
31c0: 6f 65 73 20 69 74 20 72 65 6d 6f 76 65 0a 2a 2a  oes it remove.**
31d0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 66 72   foreign keys fr
31e0: 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 2e 61 46  om the sqlite.aF
31f0: 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20  Key hash table. 
3200: 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73   But it does des
3210: 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73  troy.** memory s
3220: 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65  tructures of the
3230: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
3240: 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69  eign keys associ
3250: 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68  ated with .** th
3260: 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  e table..**.** I
3270: 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
3280: 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
3290: 20 61 72 65 20 75 6e 6c 69 6e 6b 65 64 20 66 72   are unlinked fr
32a0: 6f 6d 20 74 68 65 20 22 64 62 22 0a 2a 2a 20 64  om the "db".** d
32b0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69 66  ata structure if
32c0: 20 64 62 21 3d 4e 55 4c 4c 2e 20 20 49 66 20 64   db!=NULL.  If d
32d0: 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63 65 73  b==NULL, indices
32e0: 20 61 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20   attached to.** 
32f0: 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 64 65  the table are de
3300: 6c 65 74 65 64 2c 20 62 75 74 20 69 74 20 69 73  leted, but it is
3310: 20 61 73 73 75 6d 65 64 20 74 68 65 79 20 68 61   assumed they ha
3320: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a  ve already been.
3330: 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a  ** unlinked..*/.
3340: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
3350: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
3360: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
3370: 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  le){.  Index *pI
3380: 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  ndex, *pNext;.  
3390: 46 4b 65 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e  FKey *pFKey, *pN
33a0: 65 78 74 46 4b 65 79 3b 0a 0a 20 20 69 66 28 20  extFKey;..  if( 
33b0: 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75  pTable==0 ) retu
33c0: 72 6e 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  rn;..  /* Do not
33d0: 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c   delete the tabl
33e0: 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65  e until the refe
33f0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
3400: 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 70  hes zero. */.  p
3410: 54 61 62 6c 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Table->nRef--;. 
3420: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65   if( pTable->nRe
3430: 66 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  f>0 ){.    retur
3440: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
3450: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3d 3d 30   pTable->nRef==0
3460: 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65   );..  /* Delete
3470: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73   all indices ass
3480: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
3490: 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66  s table.  */.  f
34a0: 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62  or(pIndex = pTab
34b0: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  le->pIndex; pInd
34c0: 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74  ex; pIndex=pNext
34d0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
34e0: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
34f0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
3500: 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69  ->iDb==pTable->i
3510: 44 62 20 7c 7c 20 28 70 54 61 62 6c 65 2d 3e 69  Db || (pTable->i
3520: 44 62 3d 3d 30 20 26 26 20 70 49 6e 64 65 78 2d  Db==0 && pIndex-
3530: 3e 69 44 62 3d 3d 31 29 20 29 3b 0a 20 20 20 20  >iDb==1) );.    
3540: 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65  sqliteDeleteInde
3550: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
3560: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
3570: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
3580: 4b 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  KEY.  /* Delete 
3590: 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  all foreign keys
35a0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
35b0: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20 54 68   this table.  Th
35c0: 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75  e keys.  ** shou
35d0: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
35e0: 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72  been unlinked fr
35f0: 6f 6d 20 74 68 65 20 64 62 2d 3e 61 46 4b 65 79  om the db->aFKey
3600: 20 68 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a   hash table .  *
3610: 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54  /.  for(pFKey=pT
3620: 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b  able->pFKey; pFK
3630: 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46  ey; pFKey=pNextF
3640: 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46  Key){.    pNextF
3650: 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65  Key = pFKey->pNe
3660: 78 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65  xtFrom;.    asse
3670: 72 74 28 20 70 54 61 62 6c 65 2d 3e 69 44 62 3c  rt( pTable->iDb<
3680: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61  db->nDb );.    a
3690: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 48 61  ssert( sqlite3Ha
36a0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b  shFind(&db->aDb[
36b0: 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e 61 46 4b  pTable->iDb].aFK
36c0: 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey,.            
36d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
36e0: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65  FKey->zTo, strle
36f0: 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29  n(pFKey->zTo)+1)
3700: 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73  !=pFKey );.    s
3710: 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79 29  qliteFree(pFKey)
3720: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
3730: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61  /* Delete the Ta
3740: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74  ble structure it
3750: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  self..  */.  sql
3760: 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iteResetColumnNa
3770: 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20 20 73  mes(pTable);.  s
3780: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
3790: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
37a0: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a  teFree(pTable->z
37b0: 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74  ColAff);.  sqlit
37c0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
37d0: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b  Table->pSelect);
37e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
37f0: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73 71 6c  OMIT_CHECK.  sql
3800: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
3810: 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a  Table->pCheck);.
3820: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 46  #endif.  sqliteF
3830: 72 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a  ree(pTable);.}..
3840: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  /*.** Unlink the
3850: 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f   given table fro
3860: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
3870: 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65  s and the delete
3880: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74   the.** table st
3890: 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c  ructure with all
38a0: 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64   its indices and
38b0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a   foreign keys..*
38c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
38d0: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62  linkAndDeleteTab
38e0: 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  le(sqlite3 *db, 
38f0: 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63  int iDb, const c
3900: 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a  har *zTabName){.
3910: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 46 4b    Table *p;.  FK
3920: 65 79 20 2a 70 46 31 2c 20 2a 70 46 32 3b 0a 20  ey *pF1, *pF2;. 
3930: 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73   Db *pDb;..  ass
3940: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
3950: 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
3960: 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
3970: 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 4e  .  assert( zTabN
3980: 61 6d 65 20 26 26 20 7a 54 61 62 4e 61 6d 65 5b  ame && zTabName[
3990: 30 5d 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64  0] );.  pDb = &d
39a0: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
39b0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
39c0: 73 65 72 74 28 26 70 44 62 2d 3e 74 62 6c 48 61  sert(&pDb->tblHa
39d0: 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 73 74  sh, zTabName, st
39e0: 72 6c 65 6e 28 7a 54 61 62 4e 61 6d 65 29 2b 31  rlen(zTabName)+1
39f0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  , 0);.  if( p ){
3a00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3a10: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
3a20: 0a 20 20 20 20 66 6f 72 28 70 46 31 3d 70 2d 3e  .    for(pF1=p->
3a30: 70 46 4b 65 79 3b 20 70 46 31 3b 20 70 46 31 3d  pFKey; pF1; pF1=
3a40: 70 46 31 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b  pF1->pNextFrom){
3a50: 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d  .      int nTo =
3a60: 20 73 74 72 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f   strlen(pF1->zTo
3a70: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 32  ) + 1;.      pF2
3a80: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
3a90: 6e 64 28 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20  nd(&pDb->aFKey, 
3aa0: 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a  pF1->zTo, nTo);.
3ab0: 20 20 20 20 20 20 69 66 28 20 70 46 32 3d 3d 70        if( pF2==p
3ac0: 46 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  F1 ){.        sq
3ad0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
3ae0: 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 31  &pDb->aFKey, pF1
3af0: 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d  ->zTo, nTo, pF1-
3b00: 3e 70 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 20  >pNextTo);.     
3b10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3b20: 77 68 69 6c 65 28 20 70 46 32 20 26 26 20 70 46  while( pF2 && pF
3b30: 32 2d 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31 20  2->pNextTo!=pF1 
3b40: 29 7b 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78  ){ pF2=pF2->pNex
3b50: 74 54 6f 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  tTo; }.        i
3b60: 66 28 20 70 46 32 20 29 7b 0a 20 20 20 20 20 20  f( pF2 ){.      
3b70: 20 20 20 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f      pF2->pNextTo
3b80: 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b   = pF1->pNextTo;
3b90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3ba0: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
3bb0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
3bc0: 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20  eTable(db, p);. 
3bd0: 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c   }.  db->flags |
3be0: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
3bf0: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
3c00: 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20   Given a token, 
3c10: 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  return a string 
3c20: 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
3c30: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 61   the text of tha
3c40: 74 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69 74 68 20  t.** token with 
3c50: 61 6e 79 20 71 75 6f 74 61 74 69 6f 6e 73 20 72  any quotations r
3c60: 65 6d 6f 76 65 64 2e 20 20 53 70 61 63 65 20 74  emoved.  Space t
3c70: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
3c80: 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ned string.** is
3c90: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
3ca0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
3cb0: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
3cc0: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  by the calling.*
3cd0: 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  * function..**.*
3ce0: 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74  * Tokens are oft
3cf0: 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73  en just pointers
3d00: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
3d10: 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20  al SQL text and 
3d20: 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30  so.** are not \0
3d30: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e  00 terminated an
3d40: 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73  d are not persis
3d50: 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72  tent.  The retur
3d60: 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ned string.** is
3d70: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
3d80: 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74 65   and is persiste
3d90: 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nt..*/.char *sql
3da0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
3db0: 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  n(Token *pName){
3dc0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
3dd0: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
3de0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
3df0: 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e  eStrNDup(pName->
3e00: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
3e10: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
3e20: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  (zName);.  }else
3e30: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
3e40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
3e50: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ame;.}../*.** Op
3e60: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  en the sqlite_ma
3e70: 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65  ster table store
3e80: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75  d in database nu
3e90: 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20  mber iDb for.** 
3ea0: 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62  writing. The tab
3eb0: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  le is opened usi
3ec0: 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  ng cursor 0..*/.
3ed0: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e  void sqlite3Open
3ee0: 4d 61 73 74 65 72 54 61 62 6c 65 28 56 64 62 65  MasterTable(Vdbe
3ef0: 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20   *v, int iDb){. 
3f00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3f10: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
3f20: 20 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69   iDb, 0);.  sqli
3f30: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3f40: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c  OP_OpenWrite, 0,
3f50: 20 4d 41 53 54 45 52 5f 52 4f 4f 54 29 3b 0a 20   MASTER_ROOT);. 
3f60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3f70: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
3f80: 6c 75 6d 6e 73 2c 20 30 2c 20 35 29 3b 20 2f 2a  lumns, 0, 5); /*
3f90: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 68   sqlite_master h
3fa0: 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  as 5 columns */.
3fb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
3fc0: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
3fd0: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
3fe0: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
3ff0: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
4000: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
4010: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
4020: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
4030: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
4040: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
4050: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
4060: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
4070: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
4080: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
4090: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  xist..*/.int sql
40a0: 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74  ite3FindDb(sqlit
40b0: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
40c0: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
40d0: 20 2d 31 3b 20 20 20 20 2f 2a 20 44 61 74 61 62   -1;    /* Datab
40e0: 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
40f0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f  int n;         /
4100: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
4110: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61  acters in the na
4120: 6d 65 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b  me */.  Db *pDb;
4130: 20 20 20 20 20 20 20 2f 2a 20 41 20 64 61 74 61         /* A data
4140: 62 61 73 65 20 77 68 6f 73 65 20 6e 61 6d 65 20  base whose name 
4150: 73 70 61 63 65 20 69 73 20 62 65 69 6e 67 20 73  space is being s
4160: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 68 61  earched */.  cha
4170: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e  r *zName;   /* N
4180: 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63  ame we are searc
4190: 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a  hing for */..  z
41a0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
41b0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
41c0: 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  e);.  if( zName 
41d0: 29 7b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65  ){.    n = strle
41e0: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f  n(zName);.    fo
41f0: 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c  r(i=(db->nDb-1),
4200: 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d   pDb=&db->aDb[i]
4210: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62  ; i>=0; i--, pDb
4220: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  --){.      if( (
4230: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20  !OMIT_TEMPDB || 
4240: 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73 74 72  i!=1 ) && n==str
4250: 6c 65 6e 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20  len(pDb->zName) 
4260: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d  && .          0=
4270: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
4280: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  pDb->zName, zNam
4290: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  e) ){.        br
42a0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
42b0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
42c0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  e(zName);.  }.  
42d0: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20  return i;.}../* 
42e0: 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  The table or vie
42f0: 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d  w or trigger nam
4300: 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  e is passed to t
4310: 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20  his routine via 
4320: 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31  tokens.** pName1
4330: 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20   and pName2. If 
4340: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
4350: 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  as fully qualifi
4360: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a  ed, for example:
4370: 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41  .**.** CREATE TA
4380: 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e  BLE xxx.yyy (...
4390: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70  );.** .** Then p
43a0: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
43b0: 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32  "xxx" and pName2
43c0: 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f   "yyy". On the o
43d0: 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20  ther hand if.** 
43e0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
43f0: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
4400: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a  ified, i.e.:.**.
4410: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
4420: 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20  yyy(...);.**.** 
4430: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
4440: 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20  et to "yyy" and 
4450: 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a  pName2 is ""..**
4460: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4470: 20 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71   sets the *ppUnq
4480: 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  ual pointer to p
4490: 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65  oint at the toke
44a0: 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20  n (pName1 or.** 
44b0: 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f  pName2) that sto
44c0: 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66  res the unqualif
44d0: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ied table name. 
44e0: 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   The index of th
44f0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78  e.** database "x
4500: 78 78 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e  xx" is returned.
4510: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
4520: 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61  woPartName(.  Pa
4530: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4540: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
4550: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
4560: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
4570: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
4580: 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69    /* The "xxx" i
4590: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
45a0: 79 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f  yyy" or "xxx" */
45b0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
45c0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79  ,      /* The "y
45d0: 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  yy" in the name 
45e0: 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54  "xxx.yyy" */.  T
45f0: 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20  oken **pUnqual  
4600: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
4610: 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65  unqualified obje
4620: 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a  ct name here */.
4630: 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  ){.  int iDb;   
4640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4650: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
4660: 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20  ding the object 
4670: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
4680: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
4690: 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20    if( pName2 && 
46a0: 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20  pName2->n>0 ){. 
46b0: 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
46c0: 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20  init.busy );.   
46d0: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
46e0: 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  e2;.    iDb = sq
46f0: 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20  lite3FindDb(db, 
4700: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28  pName1);.    if(
4710: 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20   iDb<0 ){.      
4720: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4730: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
4740: 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20 70   database %T", p
4750: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70 50  Name1);.      pP
4760: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
4770: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
4780: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
4790: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e    assert( db->in
47a0: 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d  it.iDb==0 || db-
47b0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
47c0: 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74    iDb = db->init
47d0: 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75  .iDb;.    *pUnqu
47e0: 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d  al = pName1;.  }
47f0: 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d  .  return iDb;.}
4800: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
4810: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
4820: 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54 46  check if the UTF
4830: 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20  -8 string zName 
4840: 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e  is a legal.** un
4850: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66  qualified name f
4860: 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20  or a new schema 
4870: 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69  object (table, i
4880: 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a  ndex, view or.**
4890: 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e   trigger). All n
48a0: 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65  ames are legal e
48b0: 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61 74  xcept those that
48c0: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
48d0: 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74  string.** "sqlit
48e0: 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c  e_" (in upper, l
48f0: 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61  ower or mixed ca
4900: 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f  se). This portio
4910: 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61  n of the namespa
4920: 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65  ce.** is reserve
4930: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
4940: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
4950: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
4960: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
4970: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
4980: 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72  me){.  if( !pPar
4990: 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73  se->db->init.bus
49a0: 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73  y && pParse->nes
49b0: 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  ted==0 .        
49c0: 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62    && (pParse->db
49d0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
49e0: 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30  _WriteSchema)==0
49f0: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d  .          && 0=
4a00: 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  =sqlite3StrNICmp
4a10: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
4a20: 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c  ", 7) ){.    sql
4a30: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4a40: 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d  rse, "object nam
4a50: 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  e reserved for i
4a60: 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22  nternal use: %s"
4a70: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  , zName);.    re
4a80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
4a90: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
4aa0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
4ab0: 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72  .** Begin constr
4ac0: 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  ucting a new tab
4ad0: 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
4ae0: 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  n in memory.  Th
4af0: 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  is is.** the fir
4b00: 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63  st of several ac
4b10: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68  tion routines th
4b20: 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e  at get called in
4b30: 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20   response.** to 
4b40: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
4b50: 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61  tatement.  In pa
4b60: 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72  rticular, this r
4b70: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
4b80: 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67  .** after seeing
4b90: 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22   tokens "CREATE"
4ba0: 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64   and "TABLE" and
4bb0: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
4bc0: 20 20 54 68 65 0a 2a 2a 20 70 53 74 61 72 74 20    The.** pStart 
4bd0: 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 43 52 45  token is the CRE
4be0: 41 54 45 20 61 6e 64 20 70 4e 61 6d 65 20 69 73  ATE and pName is
4bf0: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
4c00: 20 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20    The isTemp.** 
4c10: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
4c20: 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  the table should
4c30: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
4c40: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
4c50: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73  base.** file ins
4c60: 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d  tead of in the m
4c70: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
4c80: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
4c90: 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a  ally the case.**
4ca0: 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22   when the "TEMP"
4cb0: 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20   or "TEMPORARY" 
4cc0: 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69  keyword occurs i
4cd0: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45  n between.** CRE
4ce0: 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a  ATE and TABLE..*
4cf0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62  *.** The new tab
4d00: 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69  le record is ini
4d10: 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74  tialized and put
4d20: 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   in pParse->pNew
4d30: 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72  Table..** As mor
4d40: 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  e of the CREATE 
4d50: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
4d60: 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74  is parsed, addit
4d70: 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20  ional action.** 
4d80: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65  routines will be
4d90: 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d   called to add m
4da0: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
4db0: 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a  to this record..
4dc0: 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
4dd0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
4de0: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
4df0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
4e00: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
4e10: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
4e20: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
4e30: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
4e40: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
4e50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61  .void sqlite3Sta
4e60: 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  rtTable(.  Parse
4e70: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
4e80: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
4e90: 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
4ea0: 2c 20 20 20 2f 2a 20 54 68 65 20 22 43 52 45 41  ,   /* The "CREA
4eb0: 54 45 22 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54  TE" token */.  T
4ec0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
4ed0: 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
4ee0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
4ef0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
4f00: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
4f10: 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70  2,   /* Second p
4f20: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
4f30: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
4f40: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
4f50: 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72  Temp,      /* Tr
4f60: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
4f70: 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TEMP table */.  
4f80: 69 6e 74 20 69 73 56 69 65 77 20 20 20 20 20 20  int isView      
4f90: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
4fa0: 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 29 7b   is a VIEW */.){
4fb0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
4fc0: 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  ;.  char *zName 
4fd0: 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65  = 0; /* The name
4fe0: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
4ff0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
5000: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
5010: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
5020: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
5030: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
5040: 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  r to create the 
5050: 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f  table in */.  To
5060: 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f  ken *pName;    /
5070: 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * Unqualified na
5080: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
5090: 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20  to create */..  
50a0: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20  /* The table or 
50b0: 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65  view name to cre
50c0: 61 74 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  ate is passed to
50d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69   this routine vi
50e0: 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e  a tokens.  ** pN
50f0: 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e  ame1 and pName2.
5100: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61   If the table na
5110: 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61  me was fully qua
5120: 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d  lified, for exam
5130: 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  ple:.  **.  ** C
5140: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
5150: 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20  yyy (...);.  ** 
5160: 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  .  ** Then pName
5170: 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78  1 is set to "xxx
5180: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79  " and pName2 "yy
5190: 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  y". On the other
51a0: 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68   hand if.  ** th
51b0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20  e table name is 
51c0: 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  not fully qualif
51d0: 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a  ied, i.e.:.  **.
51e0: 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
51f0: 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a  E yyy(...);.  **
5200: 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  .  ** Then pName
5210: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
5220: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
5230: 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ""..  **.  ** Th
5240: 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74  e call below set
5250: 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e  s the pName poin
5260: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
5270: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
5280: 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32  1 or.  ** pName2
5290: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
52a0: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
52b0: 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61  ble name. The va
52c0: 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20  riable iDb is.  
52d0: 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  ** set to the in
52e0: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
52f0: 61 73 65 20 74 68 61 74 20 74 68 65 20 74 61 62  ase that the tab
5300: 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f  le or view is to
5310: 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64   be.  ** created
5320: 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20   in..  */.  iDb 
5330: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
5340: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
5350: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
5360: 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
5370: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
5380: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
5390: 26 20 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e  & isTemp && iDb>
53a0: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63  1 ){.    /* If c
53b0: 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74  reating a temp t
53c0: 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d  able, the name m
53d0: 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66  ay not be qualif
53e0: 69 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ied */.    sqlit
53f0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5400: 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61  e, "temporary ta
5410: 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  ble name must be
5420: 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a   unqualified");.
5430: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
5440: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
5450: 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 20 69  DB && isTemp ) i
5460: 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73  Db = 1;..  pPars
5470: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20  e->sNameToken = 
5480: 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20  *pName;.  zName 
5490: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
54a0: 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
54b0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
54c0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51  return;.  if( SQ
54d0: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
54e0: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
54f0: 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29  pParse, zName) )
5500: 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  {.    goto begin
5510: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
5520: 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  }.  if( db->init
5530: 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70  .iDb==1 ) isTemp
5540: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
5550: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
5560: 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74  IZATION.  assert
5570: 28 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d  ( (isTemp & 1)==
5580: 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20  isTemp );.  {.  
5590: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
55a0: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
55b0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
55c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
55d0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
55e0: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
55f0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54  SCHEMA_TABLE(isT
5600: 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  emp), 0, zDb) ){
5610: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
5620: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
5630: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56     }.    if( isV
5640: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  iew ){.      if(
5650: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
5660: 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20   isTemp ){.     
5670: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
5680: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
5690: 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
56a0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
56b0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45  QLITE_CREATE_VIE
56c0: 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  W;.      }.    }
56d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
56e0: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
56f0: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
5700: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
5710: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
5720: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
5730: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
5740: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
5750: 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LE;.      }.    
5760: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
5770: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
5780: 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20  e, code, zName, 
5790: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
57a0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
57b0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
57c0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
57d0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
57e0: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
57f0: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
5800: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
5810: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
5820: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
5830: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
5840: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
5850: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
5860: 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   does..  */.  if
5870: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
5880: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
5890: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f  Parse) ){.    go
58a0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
58b0: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
58c0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  le = sqlite3Find
58d0: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
58e0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
58f0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ame);.  if( pTab
5900: 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  le ){.    sqlite
5910: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5920: 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65  , "table %T alre
5930: 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61  ady exists", pNa
5940: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65  me);.    goto be
5950: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
5960: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
5970: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
5980: 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 26 26 20  zName, 0)!=0 && 
5990: 28 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e  (iDb==0 || !db->
59a0: 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20  init.busy) ){.  
59b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
59c0: 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
59d0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
59e0: 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20  ndex named %s", 
59f0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
5a00: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
5a10: 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  or;.  }.  pTable
5a20: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
5a30: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
5a40: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ;.  if( pTable==
5a50: 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  0 ){.    pParse-
5a60: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
5a70: 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  EM;.    pParse->
5a80: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
5a90: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
5aa0: 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  or;.  }.  pTable
5ab0: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
5ac0: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
5ad0: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61  = 0;.  pTable->a
5ae0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  Col = 0;.  pTabl
5af0: 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  e->iPKey = -1;. 
5b00: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20   pTable->pIndex 
5b10: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69  = 0;.  pTable->i
5b20: 44 62 20 3d 20 69 44 62 3b 0a 20 20 70 54 61 62  Db = iDb;.  pTab
5b30: 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  le->nRef = 1;.  
5b40: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  if( pParse->pNew
5b50: 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65 33 44  Table ) sqlite3D
5b60: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
5b70: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
5b80: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  );.  pParse->pNe
5b90: 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  wTable = pTable;
5ba0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
5bb0: 73 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69  s the magic sqli
5bc0: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
5bd0: 65 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e  e used by autoin
5be0: 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68  crement,.  ** th
5bf0: 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e  en record a poin
5c00: 74 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ter to this tabl
5c10: 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  e in the main da
5c20: 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
5c30: 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e  .  ** so that IN
5c40: 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68  SERT can find th
5c50: 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a  e table easily..
5c60: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
5c70: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
5c80: 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50  REMENT.  if( !pP
5c90: 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20  arse->nested && 
5ca0: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  strcmp(zName, "s
5cb0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29  qlite_sequence")
5cc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61  ==0 ){.    db->a
5cd0: 44 62 5b 69 44 62 5d 2e 70 53 65 71 54 61 62 20  Db[iDb].pSeqTab 
5ce0: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  = pTable;.  }.#e
5cf0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  ndif..  /* Begin
5d00: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
5d10: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
5d20: 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20  nsert the table 
5d30: 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a  record into.  **
5d40: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
5d50: 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20  ER table.  Note 
5d60: 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68  in particular th
5d70: 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68  at we must go ah
5d80: 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c  ead.  ** and all
5d90: 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64  ocate the record
5da0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
5db0: 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e  table entry now.
5dc0: 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a    Before any.  *
5dd0: 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  * PRIMARY KEY or
5de0: 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73   UNIQUE keywords
5df0: 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68   are parsed.  Th
5e00: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c  ose keywords wil
5e10: 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64  l cause.  ** ind
5e20: 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74  ices to be creat
5e30: 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  ed and the table
5e40: 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d   record must com
5e50: 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20  e before the .  
5e60: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e  ** indices.  Hen
5e70: 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ce, the record n
5e80: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
5e90: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ble must be allo
5ea0: 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a  cated.  ** now..
5eb0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
5ec0: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20  init.busy && (v 
5ed0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
5ee0: 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a  (pParse))!=0 ){.
5ef0: 20 20 20 20 69 6e 74 20 6c 62 6c 3b 0a 20 20 20      int lbl;.   
5f00: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
5f10: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
5f20: 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 20 20  se, 0, iDb);..  
5f30: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
5f40: 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f   format and enco
5f50: 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61  ding in the data
5f60: 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65  base have not be
5f70: 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20  en set, .    ** 
5f80: 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20  set them now..  
5f90: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
5fa0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5fb0: 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  ReadCookie, iDb,
5fc0: 20 31 29 3b 20 20 20 2f 2a 20 66 69 6c 65 5f 66   1);   /* file_f
5fd0: 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20 6c 62 6c  ormat */.    lbl
5fe0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
5ff0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
6000: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6010: 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 6c 62  (v, OP_If, 0, lb
6020: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
6030: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
6040: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 66 69 6c 65  nteger, db->file
6050: 5f 66 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20  _format, 0);.   
6060: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6070: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
6080: 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20  e, iDb, 1);.    
6090: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
60a0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
60b0: 64 62 2d 3e 65 6e 63 2c 20 30 29 3b 0a 20 20 20  db->enc, 0);.   
60c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
60d0: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
60e0: 65 2c 20 69 44 62 2c 20 34 29 3b 0a 20 20 20 20  e, iDb, 4);.    
60f0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
6100: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b  veLabel(v, lbl);
6110: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75  ..    /* This ju
6120: 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61  st creates a pla
6130: 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64  ce-holder record
6140: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
6150: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20  aster table..   
6160: 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63   ** The record c
6170: 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20  reated does not 
6180: 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67  contain anything
6190: 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62   yet.  It will b
61a0: 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a  e replaced.    *
61b0: 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e  * by the real en
61c0: 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65  try in code gene
61d0: 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33  rated at sqlite3
61e0: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20  EndTable()..    
61f0: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  **.    ** The ro
6200: 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  wid for the new 
6210: 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 6f 6e  entry is left on
6220: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
6230: 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 54 68  stack..    ** Th
6240: 65 20 72 6f 77 69 64 20 76 61 6c 75 65 20 69 73  e rowid value is
6250: 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 63   needed by the c
6260: 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ode that sqlite3
6270: 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 0a 20 20  EndTable will.  
6280: 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 2e 0a 20    ** generate.. 
6290: 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
62a0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
62b0: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
62c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
62d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
62e0: 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  teger, 0, 0);.  
62f0: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
6300: 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74     {.      sqlit
6310: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6320: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 69  P_CreateTable, i
6330: 44 62 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  Db, 0);.    }.  
6340: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73    sqlite3OpenMas
6350: 74 65 72 54 61 62 6c 65 28 76 2c 20 69 44 62 29  terTable(v, iDb)
6360: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6370: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
6380: 52 6f 77 69 64 2c 20 30 2c 20 30 29 3b 0a 20 20  Rowid, 0, 0);.  
6390: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
63a0: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
63b0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
63c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
63d0: 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Null, 0, 0);.   
63e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
63f0: 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  p(v, OP_Insert, 
6400: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
6410: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6420: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
6430: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6440: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  ddOp(v, OP_Pull,
6450: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f   1, 0);.  }..  /
6460: 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72  * Normal (non-er
6470: 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a  ror) return. */.
6480: 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20    return;..  /* 
6490: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
64a0: 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65  rs, we jump here
64b0: 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f   */.begin_table_
64c0: 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 46  error:.  sqliteF
64d0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  ree(zName);.  re
64e0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
64f0: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65  his macro is use
6500: 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f  d to compare two
6510: 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20 63 61   strings in a ca
6520: 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 6d  se-insensitive m
6530: 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20  anner..** It is 
6540: 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 20  slightly faster 
6550: 74 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c  than calling sql
6560: 69 74 65 33 53 74 72 49 43 6d 70 28 29 20 64 69  ite3StrICmp() di
6570: 72 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70  rectly, but.** p
6580: 72 6f 64 75 63 65 73 20 6c 61 72 67 65 72 20 63  roduces larger c
6590: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49  ode..**.** WARNI
65a0: 4e 47 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69  NG: This macro i
65b0: 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65  s not compatible
65c0: 20 77 69 74 68 20 74 68 65 20 73 74 72 63 6d 70   with the strcmp
65d0: 28 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a  () family. It.**
65e0: 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66   returns true if
65f0: 20 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67 73   the two strings
6600: 20 61 72 65 20 65 71 75 61 6c 2c 20 6f 74 68 65   are equal, othe
6610: 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a  rwise false..*/.
6620: 23 64 65 66 69 6e 65 20 53 54 52 49 43 4d 50 28  #define STRICMP(
6630: 78 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74 65 33  x, y) (\.sqlite3
6640: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75  UpperToLower[*(u
6650: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28  nsigned char *)(
6660: 78 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65  x)]==   \.sqlite
6670: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28  3UpperToLower[*(
6680: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
6690: 28 79 29 5d 20 20 20 20 20 5c 0a 26 26 20 73 71  (y)]     \.&& sq
66a0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 28 78 29  lite3StrICmp((x)
66b0: 2b 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a  +1,(y)+1)==0 )..
66c0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
66d0: 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61  column to the ta
66e0: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65  ble currently be
66f0: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  ing constructed.
6700: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  .**.** The parse
6710: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
6720: 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61  tine once for ea
6730: 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72  ch column declar
6740: 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52  ation.** in a CR
6750: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
6760: 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74  ment.  sqlite3St
6770: 61 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20  artTable() gets 
6780: 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20  called.** first 
6790: 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f  to get things go
67a0: 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20  ing.  Then this 
67b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
67c0: 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f  d for each.** co
67d0: 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lumn..*/.void sq
67e0: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50  lite3AddColumn(P
67f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
6800: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54  ken *pName){.  T
6810: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
6820: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43  ;.  char *z;.  C
6830: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69  olumn *pCol;.  i
6840: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
6850: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
6860: 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71  return;.  z = sq
6870: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
6880: 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  en(pName);.  if(
6890: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
68a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
68b0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
68c0: 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70  if( STRICMP(z, p
68d0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
68e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
68f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6900: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
6910: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
6920: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
6930: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65  ree(z);.      re
6940: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
6950: 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26    if( (p->nCol &
6960: 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   0x7)==0 ){.    
6970: 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20  Column *aNew;.  
6980: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    aNew = sqliteR
6990: 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c  ealloc( p->aCol,
69a0: 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a   (p->nCol+8)*siz
69b0: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
69c0: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
69d0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
69e0: 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20  eFree(z);.      
69f0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
6a00: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77    p->aCol = aNew
6a10: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26  ;.  }.  pCol = &
6a20: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d  p->aCol[p->nCol]
6a30: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c  ;.  memset(pCol,
6a40: 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43   0, sizeof(p->aC
6a50: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d  ol[0]));.  pCol-
6a60: 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20  >zName = z;. .  
6a70: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
6a80: 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  o type specified
6a90: 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74  , columns have t
6aa0: 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e  he default affin
6ab0: 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e  ity.  ** 'NONE'.
6ac0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
6ad0: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 74  ype specified, t
6ae0: 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f  hen sqlite3AddCo
6af0: 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a  lumnType() will.
6b00: 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e    ** be called n
6b10: 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d  ext to set pCol-
6b20: 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63  >affinity correc
6b30: 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  tly..  */.  pCol
6b40: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
6b50: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
6b60: 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50  pCol->pColl = pP
6b70: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
6b80: 6f 6c 6c 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b  oll;.  p->nCol++
6b90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6ba0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
6bb0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
6bc0: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
6bd0: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
6be0: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
6bf0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22   statement.  A "
6c00: 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  NOT NULL" constr
6c10: 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e  aint has.** been
6c20: 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d   seen on a colum
6c30: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
6c40: 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c   sets the notNul
6c50: 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65  l flag on.** the
6c60: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
6c70: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
6c80: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
6c90: 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28  lite3AddNotNull(
6ca0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
6cb0: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54  nt onError){.  T
6cc0: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
6cd0: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
6ce0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
6cf0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
6d00: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
6d10: 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43  if( i>=0 ) p->aC
6d20: 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20  ol[i].notNull = 
6d30: 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  onError;.}../*.*
6d40: 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d  * Scan the colum
6d50: 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70  n type name zTyp
6d60: 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29  e (length nType)
6d70: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a   and return the.
6d80: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66  ** associated af
6d90: 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a  finity type..**.
6da0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6db0: 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65  does a case-inde
6dc0: 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f  pendent search o
6dd0: 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20  f zType for the 
6de0: 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69  .** substrings i
6df0: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
6e00: 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66  table. If one of
6e10: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
6e20: 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65  is.** found, the
6e30: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61   corresponding a
6e40: 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72  ffinity is retur
6e50: 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f  ned. If zType co
6e60: 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74  ntains.** more t
6e70: 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  han one of the s
6e80: 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69  ubstrings, entri
6e90: 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f  es toward the to
6ea0: 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62  p of .** the tab
6eb0: 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79  le take priority
6ec0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
6ed0: 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42  f zType is 'BLOB
6ee0: 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45  INT', .** SQLITE
6ef0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20  _AFF_NUMERIC is 
6f00: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
6f10: 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20  Substring     | 
6f20: 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d  Affinity.** ----
6f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
6f50: 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20  'INT'         | 
6f60: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
6f70: 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20  ER.** 'CHAR'    
6f80: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
6f90: 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20  _TEXT.** 'CLOB' 
6fa0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
6fb0: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58  AFF_TEXT.** 'TEX
6fc0: 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  T'        | SQLI
6fd0: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
6fe0: 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53  BLOB'        | S
6ff0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a  QLITE_AFF_NONE.*
7000: 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20  *.** If none of 
7010: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
7020: 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c  n the above tabl
7030: 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20  e are found,.** 
7040: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
7050: 49 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  IC is returned..
7060: 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
7070: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 74 79 70  _AFF_INTEGER typ
7080: 65 20 69 73 20 6f 6e 6c 79 20 72 65 74 75 72 6e  e is only return
7090: 65 64 20 69 66 20 75 73 65 49 6e 74 54 79 70 65  ed if useIntType
70a0: 20 69 73 20 74 72 75 65 2e 0a 2a 2a 20 49 66 20   is true..** If 
70b0: 75 73 65 49 6e 74 54 79 70 65 20 69 73 20 66 61  useIntType is fa
70c0: 6c 73 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  lse, then SQLITE
70d0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20  _AFF_INTEGER is 
70e0: 72 65 70 6f 72 74 65 64 20 62 61 63 6b 0a 2a 2a  reported back.**
70f0: 20 61 73 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   as SQLITE_AFF_N
7100: 55 4d 45 52 49 43 0a 2a 2f 0a 63 68 61 72 20 73  UMERIC.*/.char s
7110: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
7120: 70 65 28 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a  pe(const Token *
7130: 70 54 79 70 65 2c 20 69 6e 74 20 75 73 65 49 6e  pType, int useIn
7140: 74 54 79 70 65 29 7b 0a 20 20 75 33 32 20 68 20  tType){.  u32 h 
7150: 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20  = 0;.  char aff 
7160: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  = SQLITE_AFF_NUM
7170: 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  ERIC;.  const un
7180: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e  signed char *zIn
7190: 20 3d 20 70 54 79 70 65 2d 3e 7a 3b 0a 20 20 63   = pType->z;.  c
71a0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
71b0: 61 72 20 2a 7a 45 6e 64 20 3d 20 26 70 54 79 70  ar *zEnd = &pTyp
71c0: 65 2d 3e 7a 5b 70 54 79 70 65 2d 3e 6e 5d 3b 0a  e->z[pType->n];.
71d0: 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 21 3d 7a  .  while( zIn!=z
71e0: 45 6e 64 20 29 7b 0a 20 20 20 20 68 20 3d 20 28  End ){.    h = (
71f0: 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55  h<<8) + sqlite3U
7200: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 49 6e  pperToLower[*zIn
7210: 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20  ];.    zIn++;.  
7220: 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c    if( h==(('c'<<
7230: 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27  24)+('h'<<16)+('
7240: 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20  a'<<8)+'r') ){  
7250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48             /* CH
7260: 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  AR */.      aff 
7270: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
7280: 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  T; .    }else if
7290: 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b  ( h==(('c'<<24)+
72a0: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
72b0: 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20  8)+'b') ){      
72c0: 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20   /* CLOB */.    
72d0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
72e0: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c  FF_TEXT;.    }el
72f0: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c  se if( h==(('t'<
7300: 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28  <24)+('e'<<16)+(
7310: 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20  'x'<<8)+'t') ){ 
7320: 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f        /* TEXT */
7330: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
7340: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
7350: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
7360: 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('b'<<24)+('l'<<
7370: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
7380: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c  )          /* BL
7390: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  OB */.        &&
73a0: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
73b0: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
73c0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
73d0: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 65 6c  FF_NONE;.    }el
73e0: 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46 46  se if( (h&0x00FF
73f0: 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36  FFFF)==(('i'<<16
7400: 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20  )+('n'<<8)+'t') 
7410: 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a  ){    /* INT */.
7420: 20 20 20 20 20 20 61 66 66 20 3d 20 75 73 65 49        aff = useI
7430: 6e 74 54 79 70 65 20 3f 20 53 51 4c 49 54 45 5f  ntType ? SQLITE_
7440: 41 46 46 5f 49 4e 54 45 47 45 52 20 3a 20 53 51  AFF_INTEGER : SQ
7450: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
7460: 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
7470: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
7480: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
7490: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
74a0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
74b0: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
74c0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
74d0: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
74e0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
74f0: 74 2e 20 20 54 68 65 20 70 46 69 72 73 74 20 74  t.  The pFirst t
7500: 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72 73  oken is the firs
7510: 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68  t.** token in th
7520: 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f  e sequence of to
7530: 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63 72 69  kens that descri
7540: 62 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 74  be the type of t
7550: 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72  he.** column cur
7560: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
7570: 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61  struction.   pLa
7580: 73 74 20 69 73 20 74 68 65 20 6c 61 73 74 20 74  st is the last t
7590: 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73  oken.** in the s
75a0: 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68  equence.  Use th
75b0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  is information t
75c0: 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74  o construct a st
75d0: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e  ring.** that con
75e0: 74 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61  tains the typena
75f0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
7600: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20   and store that 
7610: 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79  string.** in zTy
7620: 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  pe..*/ .void sql
7630: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70  ite3AddColumnTyp
7640: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
7650: 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a   Token *pType){.
7660: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
7670: 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  t i;.  Column *p
7680: 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  Col;..  if( (p =
7690: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
76a0: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
76b0: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
76c0: 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65  ;.  if( i<0 ) re
76d0: 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26  turn;.  pCol = &
76e0: 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 73 71  p->aCol[i];.  sq
76f0: 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a  liteFree(pCol->z
7700: 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  Type);.  pCol->z
7710: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Type = sqlite3Na
7720: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 79 70  meFromToken(pTyp
7730: 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69  e);.  pCol->affi
7740: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66  nity = sqlite3Af
7750: 66 69 6e 69 74 79 54 79 70 65 28 70 54 79 70 65  finityType(pType
7760: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , 0);.}../*.** T
7770: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
7780: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
7790: 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  ue for the most 
77a0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63  recently added c
77b0: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  olumn.** of the 
77c0: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
77d0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
77e0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c  on..**.** Defaul
77f0: 74 20 76 61 6c 75 65 20 65 78 70 72 65 73 73 69  t value expressi
7800: 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73  ons must be cons
7810: 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20  tant.  Raise an 
7820: 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69  exception if thi
7830: 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20  s.** is not the 
7840: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  case..**.** This
7850: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
7860: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
7870: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
7880: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
7890: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
78a0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  E statement..*/.
78b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 44  void sqlite3AddD
78c0: 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73  efaultValue(Pars
78d0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
78e0: 2a 70 45 78 70 72 29 7b 0a 20 20 54 61 62 6c 65  *pExpr){.  Table
78f0: 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *p;.  Column *p
7900: 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  Col;.  if( (p = 
7910: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
7920: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f  e)!=0 ){.    pCo
7930: 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d  l = &(p->aCol[p-
7940: 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69  >nCol-1]);.    i
7950: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
7960: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
7970: 69 6f 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ion(pExpr) ){.  
7980: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7990: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66  Msg(pParse, "def
79a0: 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f  ault value of co
79b0: 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74  lumn [%s] is not
79c0: 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20   constant",.    
79d0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d        pCol->zNam
79e0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
79f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
7a00: 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66  Delete(pCol->pDf
7a10: 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  lt);.      pCol-
7a20: 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33  >pDflt = sqlite3
7a30: 45 78 70 72 44 75 70 28 70 45 78 70 72 29 3b 0a  ExprDup(pExpr);.
7a40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
7a50: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45  te3ExprDelete(pE
7a60: 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  xpr);.}../*.** D
7a70: 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49  esignate the PRI
7a80: 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65  MARY KEY for the
7a90: 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69   table.  pList i
7aa0: 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65  s a list of name
7ab0: 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73  s .** of columns
7ac0: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70   that form the p
7ad0: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
7ae0: 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74  pList is NULL, t
7af0: 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20  hen the.** most 
7b00: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63  recently added c
7b10: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
7b20: 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72  le is the primar
7b30: 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  y key..**.** A t
7b40: 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74  able can have at
7b50: 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72   most one primar
7b60: 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74  y key.  If the t
7b70: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
7b80: 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65  .** a primary ke
7b90: 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74  y (and this is t
7ba0: 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72  he second primar
7bb0: 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61  y key) then crea
7bc0: 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a  te an.** error..
7bd0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49  **.** If the PRI
7be0: 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61  MARY KEY is on a
7bf0: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77   single column w
7c00: 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73  hose datatype is
7c10: 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65   INTEGER,.** the
7c20: 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f  n we will try to
7c30: 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e   use that column
7c40: 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20   as the rowid.  
7c50: 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50  Set the Table.iP
7c60: 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  Key.** field of 
7c70: 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
7c80: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20  construction to 
7c90: 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  be the index of 
7ca0: 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50  the.** INTEGER P
7cb0: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
7cc0: 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20  n.  Table.iPKey 
7cd0: 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20  is set to -1 if 
7ce0: 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49  there is.** no I
7cf0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
7d00: 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  EY..**.** If the
7d10: 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49   key is not an I
7d20: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
7d30: 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  EY, then create 
7d40: 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65  a unique.** inde
7d50: 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20  x for the key.  
7d60: 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61  No index is crea
7d70: 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20  ted for INTEGER 
7d80: 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f  PRIMARY KEYs..*/
7d90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
7da0: 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61  PrimaryKey(.  Pa
7db0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7dc0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
7dd0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
7de0: 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73   *pList,  /* Lis
7df0: 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73  t of field names
7e00: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
7e10: 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
7e20: 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
7e30: 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75   do with a uniqu
7e40: 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a  eness conflict *
7e50: 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 20  /.  int autoInc 
7e60: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7e70: 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45   the AUTOINCREME
7e80: 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  NT keyword is pr
7e90: 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61  esent */.){.  Ta
7ea0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
7eb0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
7ec0: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30   char *zType = 0
7ed0: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d  ;.  int iCol = -
7ee0: 31 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62  1, i;.  if( pTab
7ef0: 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61  ==0 ) goto prima
7f00: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69  ry_key_exit;.  i
7f10: 66 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d  f( pTab->hasPrim
7f20: 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
7f30: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7f40: 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65  e, .      "table
7f50: 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65   \"%s\" has more
7f60: 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72   than one primar
7f70: 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e  y key", pTab->zN
7f80: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70  ame);.    goto p
7f90: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
7fa0: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73  .  }.  pTab->has
7fb0: 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69  PrimKey = 1;.  i
7fc0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
7fd0: 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     iCol = pTab->
7fe0: 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54  nCol - 1;.    pT
7ff0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69  ab->aCol[iCol].i
8000: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
8010: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
8020: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
8030: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
8040: 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c  for(iCol=0; iCol
8050: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f  <pTab->nCol; iCo
8060: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  l++){.        if
8070: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
8080: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
8090: 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  me, pTab->aCol[i
80a0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  Col].zName)==0 )
80b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  {.          brea
80c0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
80d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
80e0: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  Col<pTab->nCol )
80f0: 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  {.        pTab->
8100: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69  aCol[iCol].isPri
8110: 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  mKey = 1;.      
8120: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
8130: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29  pList->nExpr>1 )
8140: 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a   iCol = -1;.  }.
8150: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
8160: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
8170: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
8180: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
8190: 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66  .zType;.  }.  if
81a0: 28 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74  ( zType && sqlit
81b0: 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c  e3StrICmp(zType,
81c0: 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 20 29   "INTEGER")==0 )
81d0: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  {.    pTab->iPKe
81e0: 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54  y = iCol;.    pT
81f0: 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e  ab->keyConf = on
8200: 45 72 72 6f 72 3b 0a 20 20 20 20 70 54 61 62 2d  Error;.    pTab-
8210: 3e 61 75 74 6f 49 6e 63 20 3d 20 61 75 74 6f 49  >autoInc = autoI
8220: 6e 63 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  nc;.  }else if( 
8230: 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64  autoInc ){.#ifnd
8240: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
8250: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
8260: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8270: 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e  (pParse, "AUTOIN
8280: 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20  CREMENT is only 
8290: 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a  allowed on an ".
82a0: 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20         "INTEGER 
82b0: 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23  PRIMARY KEY");.#
82c0: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
82d0: 20 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65     sqlite3Create
82e0: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c  Index(pParse, 0,
82f0: 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e   0, 0, pList, on
8300: 45 72 72 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20  Error, 0, 0);.  
8310: 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d    pList = 0;.  }
8320: 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  ..primary_key_ex
8330: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  it:.  sqlite3Exp
8340: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  rListDelete(pLis
8350: 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  t);.  return;.}.
8360: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
8370: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
8380: 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  t to the table c
8390: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
83a0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
83b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
83c0: 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a  heckConstraint(.
83d0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
83e0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
83f0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
8400: 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a   *pCheckExpr  /*
8410: 20 54 68 65 20 63 68 65 63 6b 20 65 78 70 72 65   The check expre
8420: 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e  ssion */.){.#ifn
8430: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8440: 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70  CHECK.  Table *p
8450: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
8460: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
8470: 54 61 62 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Tab ){.    /* Th
8480: 65 20 43 48 45 43 4b 20 65 78 70 72 65 73 73 69  e CHECK expressi
8490: 6f 6e 20 6d 75 73 74 20 62 65 20 64 75 70 6c 69  on must be dupli
84a0: 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 6f  cated so that to
84b0: 6b 65 6e 73 20 72 65 66 65 72 0a 20 20 20 20 2a  kens refer.    *
84c0: 2a 20 74 6f 20 6d 61 6c 6c 6f 63 65 64 20 73 70  * to malloced sp
84d0: 61 63 65 20 61 6e 64 20 6e 6f 74 20 74 68 65 20  ace and not the 
84e0: 28 65 70 68 65 6d 65 72 61 6c 29 20 74 65 78 74  (ephemeral) text
84f0: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
8500: 41 42 4c 45 0a 20 20 20 20 2a 2a 20 73 74 61 74  ABLE.    ** stat
8510: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 70 54 61  ement */.    pTa
8520: 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69  b->pCheck = sqli
8530: 74 65 33 45 78 70 72 41 6e 64 28 70 54 61 62 2d  te3ExprAnd(pTab-
8540: 3e 70 43 68 65 63 6b 2c 20 73 71 6c 69 74 65 33  >pCheck, sqlite3
8550: 45 78 70 72 44 75 70 28 70 43 68 65 63 6b 45 78  ExprDup(pCheckEx
8560: 70 72 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  pr));.  }.#endif
8570: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
8580: 6c 65 74 65 28 70 43 68 65 63 6b 45 78 70 72 29  lete(pCheckExpr)
8590: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
85a0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  he collation fun
85b0: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ction of the mos
85c0: 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65  t recently parse
85d0: 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a  d table column.*
85e0: 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71  * to the CollSeq
85f0: 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20   given..*/.void 
8600: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74  sqlite3AddCollat
8610: 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  eType(Parse *pPa
8620: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
8630: 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70  *zType, int nTyp
8640: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
8650: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
8660: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
8670: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
8680: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
8690: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
86a0: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
86b0: 43 6f 6c 2d 31 3b 0a 0a 20 20 70 43 6f 6c 6c 20  Col-1;..  pColl 
86c0: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  = sqlite3LocateC
86d0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
86e0: 54 79 70 65 2c 20 6e 54 79 70 65 29 3b 0a 20 20  Type, nType);.  
86f0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 43 6f 6c 6c  p->aCol[i].pColl
8700: 20 3d 20 70 43 6f 6c 6c 3b 0a 0a 20 20 2f 2a 20   = pColl;..  /* 
8710: 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  If the column is
8720: 20 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e   declared as "<n
8730: 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59  ame> PRIMARY KEY
8740: 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22   COLLATE <type>"
8750: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69  ,.  ** then an i
8760: 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65  ndex may have be
8770: 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68  en created on th
8780: 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65  is column before
8790: 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74   the.  ** collat
87a0: 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64  ion type was add
87b0: 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73  ed. Correct this
87c0: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61   if it is the ca
87d0: 73 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  se..  */.  for(p
87e0: 49 64 78 20 3d 20 70 2d 3e 70 49 6e 64 65 78 3b  Idx = p->pIndex;
87f0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
8800: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 61 73  ->pNext){.    as
8810: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
8820: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66  umn==1 );.    if
8830: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
8840: 5b 30 5d 3d 3d 69 20 29 20 70 49 64 78 2d 3e 6b  [0]==i ) pIdx->k
8850: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20  eyInfo.aColl[0] 
8860: 3d 20 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a  = pColl;.  }.}..
8870: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  /*.** Call sqlit
8880: 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 29  e3CheckCollSeq()
8890: 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 6c 61 74 69   for all collati
88a0: 6e 67 20 73 65 71 75 65 6e 63 65 73 20 69 6e 20  ng sequences in 
88b0: 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 69 6e 20  an index,.** in 
88c0: 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66 79 20  order to verify 
88d0: 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6e 65 63  that all the nec
88e0: 65 73 73 61 72 79 20 63 6f 6c 6c 61 74 69 6e 67  essary collating
88f0: 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 0a 2a   sequences are.*
8900: 2a 20 6c 6f 61 64 65 64 2e 0a 2a 2f 0a 69 6e 74  * loaded..*/.int
8910: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 49 6e 64   sqlite3CheckInd
8920: 65 78 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  exCollSeq(Parse 
8930: 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
8940: 70 49 64 78 29 7b 0a 20 20 69 66 28 20 70 49 64  pIdx){.  if( pId
8950: 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  x ){.    int i;.
8960: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
8970: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
8980: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
8990: 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65  lite3CheckCollSe
89a0: 71 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e  q(pParse, pIdx->
89b0: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d  keyInfo.aColl[i]
89c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
89d0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
89e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
89f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
8a00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
8a10: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
8a20: 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61  eturns the colla
8a30: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
8a40: 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  r database nativ
8a50: 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69  e text.** encodi
8a60: 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ng identified by
8a70: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d   the string zNam
8a80: 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e  e, length nName.
8a90: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
8aa0: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
8ab0: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f  n sequence is no
8ac0: 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  t available, or 
8ad0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  not available.**
8ae0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
8af0: 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67   native encoding
8b00: 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  , the collation 
8b10: 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b  factory is invok
8b20: 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74  ed to.** request
8b30: 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c   it. If the coll
8b40: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f  ation factory do
8b50: 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75  es not supply su
8b60: 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a  ch a sequence,.*
8b70: 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e  * and the sequen
8b80: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
8b90: 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20  in another text 
8ba0: 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74  encoding, then t
8bb0: 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  hat is.** return
8bc0: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
8bd0: 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73  * If no versions
8be0: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65   of the requeste
8bf0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71  d collations seq
8c00: 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61  uence are availa
8c10: 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68  ble, or.** anoth
8c20: 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  er error occurs,
8c30: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
8c40: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d  d and an error m
8c50: 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69  essage written i
8c60: 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a  nto.** pParse..*
8c70: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
8c80: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
8c90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
8ca0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
8cb0: 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20  , int nName){.  
8cc0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8cd0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65  arse->db;.  u8 e
8ce0: 6e 63 20 3d 20 64 62 2d 3e 65 6e 63 3b 0a 20 20  nc = db->enc;.  
8cf0: 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62  u8 initbusy = db
8d00: 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 0a 20 20  ->init.busy;..  
8d10: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
8d20: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
8d30: 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61  Seq(db, enc, zNa
8d40: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 69 6e 69 74 62  me, nName, initb
8d50: 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69  usy);.  if( !ini
8d60: 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c  tbusy && (!pColl
8d70: 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70   || !pColl->xCmp
8d80: 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  ) ){.    pColl =
8d90: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
8da0: 65 71 28 64 62 2c 20 70 43 6f 6c 6c 2c 20 7a 4e  eq(db, pColl, zN
8db0: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
8dc0: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
8dd0: 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30       if( nName<0
8de0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4e 61 6d   ){.        nNam
8df0: 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
8e00: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8e10: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8e20: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
8e30: 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  h collation sequ
8e40: 65 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e 61  ence: %.*s", nNa
8e50: 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  me, zName);.    
8e60: 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20    pColl = 0;.   
8e70: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
8e80: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pColl;.}.../*.*
8e90: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
8ea0: 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d  that will increm
8eb0: 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  ent the schema c
8ec0: 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ookie..**.** The
8ed0: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69   schema cookie i
8ee0: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
8ef0: 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68  ine when the sch
8f00: 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64  ema for the.** d
8f10: 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
8f20: 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68    After each sch
8f30: 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20  ema change, the 
8f40: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20  cookie value.** 
8f50: 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61  changes.  When a
8f60: 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72   process first r
8f70: 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20  eads the schema 
8f80: 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a  it records the.*
8f90: 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65  * cookie.  There
8fa0: 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20  after, whenever 
8fb0: 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73  it goes to acces
8fc0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a  s the database,.
8fd0: 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65  ** it checks the
8fe0: 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20   cookie to make 
8ff0: 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20  sure the schema 
9000: 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a  has not changed.
9010: 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ** since it was 
9020: 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  last read..**.**
9030: 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f   This plan is no
9040: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c  t completely bul
9050: 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69  let-proof.  It i
9060: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a  s possible for.*
9070: 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20  * the schema to 
9080: 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20  change multiple 
9090: 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68  times and for th
90a0: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a  e cookie to be.*
90b0: 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72  * set back to pr
90c0: 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20  ior value.  But 
90d0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61  schema changes a
90e0: 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a  re infrequent.**
90f0: 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69   and the probabi
9100: 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20  lity of hitting 
9110: 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20  the same cookie 
9120: 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a  value is only.**
9130: 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33   1 chance in 2^3
9140: 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66  2.  So we're saf
9150: 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69  e enough..*/.voi
9160: 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43  d sqlite3ChangeC
9170: 6f 6f 6b 69 65 28 73 71 6c 69 74 65 33 20 2a 64  ookie(sqlite3 *d
9180: 62 2c 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  b, Vdbe *v, int 
9190: 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  iDb){.  sqlite3V
91a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
91b0: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b  nteger, db->aDb[
91c0: 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b  iDb].schema_cook
91d0: 69 65 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69  ie+1, 0);.  sqli
91e0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
91f0: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
9200: 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, 0);.}../*.** 
9210: 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62  Measure the numb
9220: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
9230: 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75   needed to outpu
9240: 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69  t the given.** i
9250: 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20  dentifier.  The 
9260: 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
9270: 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f  includes any quo
9280: 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20  tes used.** but 
9290: 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  does not include
92a0: 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e   the null termin
92b0: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
92c0: 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73  estimate is cons
92d0: 65 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69  ervative.  It mi
92e0: 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
92f0: 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65  at what is.** re
9300: 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  ally needed..*/.
9310: 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74  static int ident
9320: 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61  Length(const cha
9330: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  r *z){.  int n;.
9340: 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e    for(n=0; *z; n
9350: 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, z++){.    if
9360: 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b  ( *z=='"' ){ n++
9370: 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ; }.  }.  return
9380: 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   n + 2;.}../*.**
9390: 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69   Write an identi
93a0: 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e  fier onto the en
93b0: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73  d of the given s
93c0: 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71  tring.  Add.** q
93d0: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20  uote characters 
93e0: 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  as needed..*/.st
93f0: 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50  atic void identP
9400: 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  ut(char *z, int 
9410: 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69  *pIdx, char *zSi
9420: 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e  gnedIdent){.  un
9430: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64  signed char *zId
9440: 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ent = (unsigned 
9450: 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65  char*)zSignedIde
9460: 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  nt;.  int i, j, 
9470: 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d  needQuote;.  i =
9480: 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d   *pIdx;.  for(j=
9490: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
94a0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61  +){.    if( !isa
94b0: 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20  lnum(zIdent[j]) 
94c0: 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f  && zIdent[j]!='_
94d0: 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ' ) break;.  }. 
94e0: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a 49   needQuote =  zI
94f0: 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73  dent[j]!=0 || is
9500: 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29  digit(zIdent[0])
9510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9520: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79     || sqlite3Key
9530: 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c  wordCode(zIdent,
9540: 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66   j)!=TK_ID;.  if
9550: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
9560: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f  i++] = '"';.  fo
9570: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
9580: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b  ; j++){.    z[i+
9590: 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a  +] = zIdent[j];.
95a0: 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a      if( zIdent[j
95b0: 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20  ]=='"' ) z[i++] 
95c0: 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28  = '"';.  }.  if(
95d0: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69   needQuote ) z[i
95e0: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69  ++] = '"';.  z[i
95f0: 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d  ] = 0;.  *pIdx =
9600: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   i;.}../*.** Gen
9610: 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54  erate a CREATE T
9620: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61  ABLE statement a
9630: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
9640: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c  he given.** tabl
9650: 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f  e.  Memory to ho
9660: 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  ld the text of t
9670: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
9680: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d  obtained.** from
9690: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
96a0: 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
96b0: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
96c0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
96d0: 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74  atic char *creat
96e0: 65 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c 65  eTableStmt(Table
96f0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b   *p){.  int i, k
9700: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74  , n;.  char *zSt
9710: 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70  mt;.  char *zSep
9720: 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 2c  , *zSep2, *zEnd,
9730: 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *z;.  Column *p
9740: 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  Col;.  n = 0;.  
9750: 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43  for(pCol = p->aC
9760: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
9770: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
9780: 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74  {.    n += ident
9790: 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61  Length(pCol->zNa
97a0: 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 70 43 6f  me);.    z = pCo
97b0: 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 69 66  l->zType;.    if
97c0: 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b  ( z ){.      n +
97d0: 3d 20 28 73 74 72 6c 65 6e 28 7a 29 20 2b 20 31  = (strlen(z) + 1
97e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e  );.    }.  }.  n
97f0: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
9800: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  p->zName);.  if(
9810: 20 6e 3c 35 30 20 29 7b 0a 20 20 20 20 7a 53 65   n<50 ){.    zSe
9820: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
9830: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
9840: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
9850: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
9860: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
9870: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
9880: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
9890: 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d    n += 35 + 6*p-
98a0: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
98b0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
98c0: 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74  ( n );.  if( zSt
98d0: 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  mt==0 ) return 0
98e0: 3b 0a 20 20 73 74 72 63 70 79 28 7a 53 74 6d 74  ;.  strcpy(zStmt
98f0: 2c 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 26 26  , !OMIT_TEMPDB&&
9900: 70 2d 3e 69 44 62 3d 3d 31 20 3f 20 22 43 52 45  p->iDb==1 ? "CRE
9910: 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 22  ATE TEMP TABLE "
9920: 3a 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22  :"CREATE TABLE "
9930: 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28  );.  k = strlen(
9940: 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50  zStmt);.  identP
9950: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d  ut(zStmt, &k, p-
9960: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74  >zName);.  zStmt
9970: 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66  [k++] = '(';.  f
9980: 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c  or(pCol=p->aCol,
9990: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
99a0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
99b0: 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74     strcpy(&zStmt
99c0: 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20  [k], zSep);.    
99d0: 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74  k += strlen(&zSt
99e0: 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70  mt[k]);.    zSep
99f0: 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64   = zSep2;.    id
9a00: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
9a10: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCol->zName);.
9a20: 20 20 20 20 69 66 28 20 28 7a 20 3d 20 70 43 6f      if( (z = pCo
9a30: 6c 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29 7b 0a  l->zType)!=0 ){.
9a40: 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d        zStmt[k++]
9a50: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 73 74   = ' ';.      st
9a60: 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20  rcpy(&zStmt[k], 
9a70: 7a 29 3b 0a 20 20 20 20 20 20 6b 20 2b 3d 20 73  z);.      k += s
9a80: 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 7d 0a  trlen(z);.    }.
9a90: 20 20 7d 0a 20 20 73 74 72 63 70 79 28 26 7a 53    }.  strcpy(&zS
9aa0: 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20  tmt[k], zEnd);. 
9ab0: 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d   return zStmt;.}
9ac0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
9ad0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
9ae0: 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e  o report the fin
9af0: 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d  al ")" that term
9b00: 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41  inates.** a CREA
9b10: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
9b20: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  nt..**.** The ta
9b30: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
9b40: 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20  at other action 
9b50: 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65  routines have be
9b60: 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69  en building.** i
9b70: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  s added to the i
9b80: 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62  nternal hash tab
9b90: 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f  les, assuming no
9ba0: 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20   errors have.** 
9bb0: 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  occurred..**.** 
9bc0: 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  An entry for the
9bd0: 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69   table is made i
9be0: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  n the master tab
9bf0: 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65  le on disk, unle
9c00: 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20  ss.** this is a 
9c10: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
9c20: 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  or db->init.busy
9c30: 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69  ==1.  When db->i
9c40: 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69  nit.busy==1.** i
9c50: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
9c60: 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74  eading the sqlit
9c70: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62  e_master table b
9c80: 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a  ecause we just.*
9c90: 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74  * connected to t
9ca0: 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62  he database or b
9cb0: 65 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74  ecause the sqlit
9cc0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68  e_master table h
9cd0: 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63  as.** recently c
9ce0: 68 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65  hanged, so the e
9cf0: 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61  ntry for this ta
9d00: 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ble already exis
9d10: 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c  ts in.** the sql
9d20: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
9d30: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e  .  We do not wan
9d40: 74 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61  t to create it a
9d50: 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  gain..**.** If t
9d60: 68 65 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d  he pSelect argum
9d70: 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ent is not NULL,
9d80: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
9d90: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77  his routine.** w
9da0: 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  as called to cre
9db0: 61 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65  ate a table gene
9dc0: 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a  rated from a .**
9dd0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e   "CREATE TABLE .
9de0: 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  .. AS SELECT ...
9df0: 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  " statement.  Th
9e00: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f  e column names o
9e10: 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62  f.** the new tab
9e20: 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68  le will match th
9e30: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
9e40: 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
9e50: 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61  oid sqlite3EndTa
9e60: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
9e70: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
9e80: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
9e90: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e  */.  Token *pCon
9ea0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
9eb0: 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66  The ',' token af
9ec0: 74 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c  ter the last col
9ed0: 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54  umn defn. */.  T
9ee0: 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20  oken *pEnd,     
9ef0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
9f00: 6e 61 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69 6e  nal ')' token in
9f10: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
9f20: 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  E */.  Select *p
9f30: 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f  Select         /
9f40: 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20  * Select from a 
9f50: 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53  "CREATE ... AS S
9f60: 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54  ELECT" */.){.  T
9f70: 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74  able *p;.  sqlit
9f80: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
9f90: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e  >db;..  if( (pEn
9fa0: 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d  d==0 && pSelect=
9fb0: 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  =0) || pParse->n
9fc0: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
9fd0: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
9fe0: 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61  eturn;.  p = pPa
9ff0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
a000: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
a010: 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
a020: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c  !db->init.busy |
a030: 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 23  | !pSelect );..#
a040: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a050: 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65  IT_CHECK.  /* Re
a060: 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61  solve names in a
a070: 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ll CHECK constra
a080: 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  int expressions.
a090: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
a0a0: 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 53 72 63  Check ){.    Src
a0b0: 4c 69 73 74 20 73 53 72 63 3b 20 20 20 20 20 20  List sSrc;      
a0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a0d0: 46 61 6b 65 20 53 72 63 4c 69 73 74 20 66 6f 72  Fake SrcList for
a0e0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
a0f0: 6c 65 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f  le */.    NameCo
a100: 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20  ntext sNC;      
a110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
a120: 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 50  e context for pP
a130: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
a140: 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  */..    memset(&
a150: 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
a160: 4e 43 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  NC));.    memset
a170: 28 26 73 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f  (&sSrc, 0, sizeo
a180: 66 28 73 53 72 63 29 29 3b 0a 20 20 20 20 73 53  f(sSrc));.    sS
a190: 72 63 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20  rc.nSrc = 1;.   
a1a0: 20 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65   sSrc.a[0].zName
a1b0: 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20   = p->zName;.   
a1c0: 20 73 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20   sSrc.a[0].pTab 
a1d0: 3d 20 70 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b  = p;.    sSrc.a[
a1e0: 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  0].iCursor = -1;
a1f0: 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20  .    sNC.pParse 
a200: 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e  = pParse;.    sN
a210: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 26 73 53  C.pSrcList = &sS
a220: 72 63 3b 0a 20 20 20 20 73 4e 43 2e 69 73 43 68  rc;.    sNC.isCh
a230: 65 63 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  eck = 1;.    if(
a240: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
a250: 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
a260: 2d 3e 70 43 68 65 63 6b 29 20 29 7b 0a 20 20 20  ->pCheck) ){.   
a270: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
a280: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
a290: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
a2a0: 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20  MIT_CHECK) */.. 
a2b0: 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69   /* If the db->i
a2c0: 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74  nit.busy is 1 it
a2d0: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
a2e0: 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66  ading the SQL of
a2f0: 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69  f the.  ** "sqli
a300: 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73  te_master" or "s
a310: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
a320: 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  r" table on the 
a330: 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f  disk..  ** So do
a340: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
a350: 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45  e disk again.  E
a360: 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20  xtract the root 
a370: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
a380: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66   for the table f
a390: 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74  rom the db->init
a3a0: 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20  .newTnum field. 
a3b0: 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65   (The page numbe
a3c0: 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61  r.  ** should ha
a3d0: 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72  ve been put ther
a3e0: 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f  e by the sqliteO
a3f0: 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a  penCb routine.).
a400: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
a410: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
a420: 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  p->tnum = db->in
a430: 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a  it.newTnum;.  }.
a440: 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69  .  /* If not ini
a450: 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20  tializing, then 
a460: 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20  create a record 
a470: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
a480: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51  e.  ** in the SQ
a490: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
a4a0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
a4b0: 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20 6e  e.  The record n
a4c0: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
a4d0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e 74  he new table ent
a4e0: 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  ry should alread
a4f0: 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61 63  y be on the stac
a500: 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  k..  **.  ** If 
a510: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52  this is a TEMPOR
a520: 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65  ARY table, write
a530: 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20   the entry into 
a540: 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20  the auxiliary.  
a550: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
a560: 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  of into the main
a570: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
a580: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
a590: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
a5a0: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
a5b0: 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   *v;.    char *z
a5c0: 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65  Type;    /* "vie
a5d0: 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f  w" or "table" */
a5e0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
a5f0: 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f  2;   /* "VIEW" o
a600: 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20  r "TABLE" */.   
a610: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20   char *zStmt;   
a620: 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
a630: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20  CREATE TABLE or 
a640: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
a650: 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20  ement */..    v 
a660: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
a670: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
a680: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
a690: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
a6a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
a6b0: 73 65 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20  se, 0, 0);..    
a6c0: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f  /* Create the ro
a6d0: 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e  otpage for the n
a6e0: 65 77 20 74 61 62 6c 65 20 61 6e 64 20 70 75 73  ew table and pus
a6f0: 68 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 73 74  h it onto the st
a700: 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 41 20 76 69  ack..    ** A vi
a710: 65 77 20 68 61 73 20 6e 6f 20 72 6f 6f 74 70 61  ew has no rootpa
a720: 67 65 2c 20 73 6f 20 6a 75 73 74 20 70 75 73 68  ge, so just push
a730: 20 61 20 7a 65 72 6f 20 6f 6e 74 6f 20 74 68 65   a zero onto the
a740: 20 73 74 61 63 6b 20 66 6f 72 0a 20 20 20 20 2a   stack for.    *
a750: 2a 20 76 69 65 77 73 2e 20 20 49 6e 69 74 69 61  * views.  Initia
a760: 6c 69 7a 65 20 7a 54 79 70 65 20 61 74 20 74 68  lize zType at th
a770: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20  e same time..   
a780: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
a790: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
a7a0: 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20     /* A regular 
a7b0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a  table */.      z
a7c0: 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a  Type = "table";.
a7d0: 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
a7e0: 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20  TABLE";.#ifndef 
a7f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
a800: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a810: 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20    /* A view */. 
a820: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69       zType = "vi
a830: 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  ew";.      zType
a840: 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64  2 = "VIEW";.#end
a850: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
a860: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52   If this is a CR
a870: 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53  EATE TABLE xx AS
a880: 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65   SELECT ..., exe
a890: 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a  cute the SELECT.
a8a0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
a8b0: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
a8c0: 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20   new table. The 
a8d0: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
a8e0: 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20   for the.    ** 
a8f0: 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6f 6e 20  new table is on 
a900: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 76  the top of the v
a910: 64 62 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a  dbe stack..    *
a920: 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68  *.    ** Once th
a930: 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65  e SELECT has bee
a940: 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74  n coded by sqlit
a950: 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69  e3Select(), it i
a960: 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75  s in a.    ** su
a970: 69 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20  itable state to 
a980: 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f  query for the co
a990: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74  lumn names and t
a9a0: 79 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a  ypes to be used.
a9b0: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65      ** by the ne
a9c0: 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  w table..    */.
a9d0: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
a9e0: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
a9f0: 70 53 65 6c 54 61 62 3b 0a 20 20 20 20 20 20 73  pSelTab;.      s
aa00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
aa10: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
aa20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
aa30: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
aa40: 6e 74 65 67 65 72 2c 20 70 2d 3e 69 44 62 2c 20  nteger, p->iDb, 
aa50: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
aa60: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
aa70: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 30  _OpenWrite, 1, 0
aa80: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
aa90: 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20  >nTab = 2;.     
aaa0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
aab0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
aac0: 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c  SRT_Table, 1, 0,
aad0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
aae0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
aaf0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31  p(v, OP_Close, 1
ab00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
ab10: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
ab20: 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  ){.        pSelT
ab30: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
ab40: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
ab50: 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 65 63 74  arse, 0, pSelect
ab60: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
ab70: 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75  SelTab==0 ) retu
ab80: 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rn;.        asse
ab90: 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29  rt( p->aCol==0 )
aba0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f  ;.        p->nCo
abb0: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
abc0: 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43  l;.        p->aC
abd0: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
abe0: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c  ol;.        pSel
abf0: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
ac00: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
ac10: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
ac20: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
ac30: 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29  able(0, pSelTab)
ac40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ac50: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
ac60: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
ac70: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
ac80: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
ac90: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
aca0: 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72        zStmt = cr
acb0: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 70 29  eateTableStmt(p)
acc0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
acd0: 20 20 20 6e 20 3d 20 70 45 6e 64 2d 3e 7a 20 2d     n = pEnd->z -
ace0: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
acf0: 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20 20 20 20 20  ken.z + 1;.     
ad00: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
ad10: 4d 50 72 69 6e 74 66 28 22 43 52 45 41 54 45 20  MPrintf("CREATE 
ad20: 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32  %s %.*s", zType2
ad30: 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61  , n, pParse->sNa
ad40: 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20  meToken.z);.    
ad50: 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74  }..    /* A slot
ad60: 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20   for the record 
ad70: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
ad80: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68   allocated in th
ad90: 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  e .    ** SQLITE
ada0: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
adb0: 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20  We just need to 
adc0: 75 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74  update that slot
add0: 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a   with all.    **
ade0: 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
adf0: 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64   we've collected
ae00: 2e 20 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  .  The rowid for
ae10: 20 74 68 65 20 70 72 65 61 6c 6c 6f 63 61 74 65   the preallocate
ae20: 64 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73  d.    ** slot is
ae30: 20 74 68 65 20 32 6e 64 20 69 74 65 6d 20 6f 6e   the 2nd item on
ae40: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54 68 65   the stack.  The
ae50: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
ae60: 6b 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  k is the.    ** 
ae70: 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20 74 68  root page for th
ae80: 65 20 6e 65 77 20 74 61 62 6c 65 20 28 6f 72 20  e new table (or 
ae90: 61 20 30 20 69 66 20 74 68 69 73 20 69 73 20 61  a 0 if this is a
aea0: 20 76 69 65 77 29 2e 0a 20 20 20 20 2a 2f 0a 20   view)..    */. 
aeb0: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
aec0: 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
aed0: 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
aee0: 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45  s ".         "SE
aef0: 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d  T type='%s', nam
af00: 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25  e=%Q, tbl_name=%
af10: 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 30 2c 20  Q, rootpage=#0, 
af20: 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20  sql=%Q ".       
af30: 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 31 22  "WHERE rowid=#1"
af40: 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
af50: 70 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  p->iDb].zName, S
af60: 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 2d 3e 69  CHEMA_TABLE(p->i
af70: 44 62 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65  Db),.      zType
af80: 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65  ,.      p->zName
af90: 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65  ,.      p->zName
afa0: 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20  ,.      zStmt.  
afb0: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46    );.    sqliteF
afc0: 72 65 65 28 7a 53 74 6d 74 29 3b 0a 20 20 20 20  ree(zStmt);.    
afd0: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
afe0: 6b 69 65 28 64 62 2c 20 76 2c 20 70 2d 3e 69 44  kie(db, v, p->iD
aff0: 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
b000: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
b010: 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68  REMENT.    /* Ch
b020: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
b030: 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
b040: 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  an sqlite_sequen
b050: 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20  ce table for.   
b060: 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63   ** keeping trac
b070: 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65  k of autoincreme
b080: 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a  nt keys..    */.
b090: 20 20 20 20 69 66 28 20 70 2d 3e 61 75 74 6f 49      if( p->autoI
b0a0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a  nc ){.      Db *
b0b0: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70  pDb = &db->aDb[p
b0c0: 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 20 20 69 66  ->iDb];.      if
b0d0: 28 20 70 44 62 2d 3e 70 53 65 71 54 61 62 3d 3d  ( pDb->pSeqTab==
b0e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
b0f0: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
b100: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
b110: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
b120: 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
b130: 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20  ce(name,seq)",. 
b140: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e           pDb->zN
b150: 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ame.        );. 
b160: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
b170: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61  dif..    /* Repa
b180: 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74  rse everything t
b190: 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74  o update our int
b1a0: 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63  ernal data struc
b1b0: 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c  tures */.    sql
b1c0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
b1d0: 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 70  P_ParseSchema, p
b1e0: 2d 3e 69 44 62 2c 20 30 2c 0a 20 20 20 20 20 20  ->iDb, 0,.      
b1f0: 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
b200: 28 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22  ("tbl_name='%q'"
b210: 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44  ,p->zName), P3_D
b220: 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20  YNAMIC);.  }... 
b230: 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c   /* Add the tabl
b240: 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e to the in-memo
b250: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
b260: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
b270: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  e..  */.  if( db
b280: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
b290: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
b2a0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c  {.    Table *pOl
b2b0: 64 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b  d;.    FKey *pFK
b2c0: 65 79 3b 20 0a 20 20 20 20 44 62 20 2a 70 44 62  ey; .    Db *pDb
b2d0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69   = &db->aDb[p->i
b2e0: 44 62 5d 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20  Db];.    pOld = 
b2f0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
b300: 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c  t(&pDb->tblHash,
b310: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   p->zName, strle
b320: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70  n(p->zName)+1, p
b330: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20  );.    if( pOld 
b340: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
b350: 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20   p==pOld );  /* 
b360: 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
b370: 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48   failed inside H
b380: 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20  ashInsert() */. 
b390: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
b3a0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
b3b0: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
b3c0: 45 59 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79  EY.    for(pFKey
b3d0: 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79  =p->pFKey; pFKey
b3e0: 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70  ; pFKey=pFKey->p
b3f0: 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20  NextFrom){.     
b400: 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65   int nTo = strle
b410: 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20  n(pFKey->zTo) + 
b420: 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  1;.      pFKey->
b430: 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74 65  pNextTo = sqlite
b440: 33 48 61 73 68 46 69 6e 64 28 26 70 44 62 2d 3e  3HashFind(&pDb->
b450: 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54  aFKey, pFKey->zT
b460: 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73  o, nTo);.      s
b470: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
b480: 28 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46  (&pDb->aFKey, pF
b490: 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70  Key->zTo, nTo, p
b4a0: 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  FKey);.    }.#en
b4b0: 64 69 66 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  dif.    pParse->
b4c0: 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20  pNewTable = 0;. 
b4d0: 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b     db->nTable++;
b4e0: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
b4f0: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
b500: 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66  hanges;..#ifndef
b510: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54   SQLITE_OMIT_ALT
b520: 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ERTABLE.    if( 
b530: 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  !p->pSelect ){. 
b540: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
b550: 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26  elect && pCons &
b560: 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  & pEnd );.      
b570: 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20  if( pCons->z==0 
b580: 29 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a  ) pCons = pEnd;.
b590: 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f        p->addColO
b5a0: 66 66 73 65 74 20 3d 20 31 33 20 2b 20 28 70 43  ffset = 13 + (pC
b5b0: 6f 6e 73 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d  ons->z - pParse-
b5c0: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a  >sNameToken.z);.
b5d0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
b5e0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
b5f0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
b600: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
b610: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
b620: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
b630: 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
b640: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
b650: 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73  eateView(.  Pars
b660: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
b670: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
b680: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
b690: 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a   *pBegin,     /*
b6a0: 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
b6b0: 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
b6c0: 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
b6d0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
b6e0: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
b6f0: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
b700: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
b710: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
b720: 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me2,     /* The 
b730: 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
b740: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
b750: 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63   view */.  Selec
b760: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a  t *pSelect,   /*
b770: 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   A SELECT statem
b780: 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ent that will be
b790: 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65  come the new vie
b7a0: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
b7b0: 70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55  p         /* TRU
b7c0: 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52  E for a TEMPORAR
b7d0: 59 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54  Y view */.){.  T
b7e0: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  able *p;.  int n
b7f0: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
b800: 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f  ed char *z;.  To
b810: 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69  ken sEnd;.  DbFi
b820: 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65  xer sFix;.  Toke
b830: 6e 20 2a 70 4e 61 6d 65 3b 0a 0a 20 20 69 66 28  n *pName;..  if(
b840: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20   pParse->nVar>0 
b850: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
b860: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
b870: 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e  parameters are n
b880: 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69  ot allowed in vi
b890: 65 77 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ews");.    sqlit
b8a0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
b8b0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74  Select);.    ret
b8c0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
b8d0: 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50 61  e3StartTable(pPa
b8e0: 72 73 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e 61  rse, pBegin, pNa
b8f0: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54  me1, pName2, isT
b900: 65 6d 70 2c 20 31 29 3b 0a 20 20 70 20 3d 20 70  emp, 1);.  p = p
b910: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
b920: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
b930: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
b940: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
b950: 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29  tDelete(pSelect)
b960: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
b970: 7d 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50 61  }.  sqlite3TwoPa
b980: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
b990: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
b9a0: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71  pName);.  if( sq
b9b0: 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
b9c0: 69 78 2c 20 70 50 61 72 73 65 2c 20 70 2d 3e 69  ix, pParse, p->i
b9d0: 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d  Db, "view", pNam
b9e0: 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65  e).    && sqlite
b9f0: 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78  3FixSelect(&sFix
ba00: 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a  , pSelect).  ){.
ba10: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
ba20: 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29  tDelete(pSelect)
ba30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
ba40: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63  }..  /* Make a c
ba50: 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72  opy of the entir
ba60: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
ba70: 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
ba80: 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54  the view..  ** T
ba90: 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  his will force a
baa0: 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65  ll the Expr.toke
bab0: 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65  n.z values to be
bac0: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a   dynamically.  *
bad0: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68  * allocated rath
bae0: 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f  er than point to
baf0: 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
bb00: 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20  g - which means 
bb10: 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77  that.  ** they w
bb20: 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65  ill persist afte
bb30: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71  r the current sq
bb40: 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c  lite3_exec() cal
bb50: 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a  l returns..  */.
bb60: 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73    p->pSelect = s
bb70: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
bb80: 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
bb90: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
bba0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20  pSelect);.  if( 
bbb0: 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69  !pParse->db->ini
bbc0: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71  t.busy ){.    sq
bbd0: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
bbe0: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
bbf0: 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  p);.  }..  /* Lo
bc00: 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  cate the end of 
bc10: 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20  the CREATE VIEW 
bc20: 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65  statement.  Make
bc30: 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20   sEnd point to. 
bc40: 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a   ** the end..  *
bc50: 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73  /.  sEnd = pPars
bc60: 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20  e->sLastToken;. 
bc70: 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d   if( sEnd.z[0]!=
bc80: 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d  0 && sEnd.z[0]!=
bc90: 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e  ';' ){.    sEnd.
bca0: 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d  z += sEnd.n;.  }
bcb0: 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20  .  sEnd.n = 0;. 
bcc0: 20 6e 20 3d 20 73 45 6e 64 2e 7a 20 2d 20 70 42   n = sEnd.z - pB
bcd0: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 28  egin->z;.  z = (
bce0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
bcf0: 68 61 72 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a  har*)pBegin->z;.
bd00: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
bd10: 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20  (z[n-1]==';' || 
bd20: 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29  isspace(z[n-1]))
bd30: 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e   ){ n--; }.  sEn
bd40: 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20  d.z = &z[n-1];. 
bd50: 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20   sEnd.n = 1;..  
bd60: 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e  /* Use sqlite3En
bd70: 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20  dTable() to add 
bd80: 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20  the view to the 
bd90: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
bda0: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
bdb0: 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  EndTable(pParse,
bdc0: 20 30 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20   0, &sEnd, 0);. 
bdd0: 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69   return;.}.#endi
bde0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
bdf0: 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65  _VIEW */..#ifnde
be00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
be10: 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62  EW./*.** The Tab
be20: 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61  le structure pTa
be30: 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ble is really a 
be40: 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74  VIEW.  Fill in t
be50: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  he names of.** t
be60: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
be70: 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54  e view in the pT
be80: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20  able structure. 
be90: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
bea0: 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e  er.** of errors.
beb0: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73    If an error is
bec0: 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65   seen leave an e
bed0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
bee0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
bef0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
bf00: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
bf10: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
bf20: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
bf30: 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61  .  Table *pSelTa
bf40: 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74  b;   /* A fake t
bf50: 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  able from which 
bf60: 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c  we get the resul
bf70: 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63  t set */.  Selec
bf80: 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20  t *pSel;     /* 
bf90: 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  Copy of the SELE
bfa0: 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  CT that implemen
bfb0: 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  ts the view */. 
bfc0: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20   int nErr = 0;  
bfd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bfe0: 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
bff0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ed */.  int n;  
c000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
c010: 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74  porarily holds t
c020: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
c030: 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f  sors assigned */
c040: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ..  assert( pTab
c050: 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f  le );..  /* A po
c060: 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e  sitive nCol mean
c070: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61  s the columns na
c080: 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65  mes for this vie
c090: 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61  w are.  ** alrea
c0a0: 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20  dy known..  */. 
c0b0: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
c0c0: 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  l>0 ) return 0;.
c0d0: 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65  .  /* A negative
c0e0: 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69   nCol is a speci
c0f0: 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e  al marker meanin
c100: 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75  g that we are cu
c110: 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79  rrently.  ** try
c120: 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  ing to compute t
c130: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  he column names.
c140: 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68    If we enter th
c150: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a  is routine with.
c160: 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20    ** a negative 
c170: 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  nCol, it means t
c180: 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73  wo or more views
c190: 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69   form a loop, li
c1a0: 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  ke this:.  **.  
c1b0: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
c1c0: 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54  EW one AS SELECT
c1d0: 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a   * FROM two;.  *
c1e0: 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
c1f0: 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20  W two AS SELECT 
c200: 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a  * FROM one;.  **
c210: 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
c220: 74 68 69 73 20 65 72 72 6f 72 20 69 73 20 63 61  this error is ca
c230: 75 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20  ught previously 
c240: 61 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  and so the follo
c250: 77 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73  wing test.  ** s
c260: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69  hould always fai
c270: 6c 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20  l.  But we will 
c280: 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63  leave it in plac
c290: 65 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66  e just to be saf
c2a0: 65 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20  e..  */.#if 0.  
c2b0: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
c2c0: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
c2d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
c2e0: 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69  , "view %s is ci
c2f0: 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64  rcularly defined
c300: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
c310: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
c320: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73  .  }.#endif.  as
c330: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43  sert( pTable->nC
c340: 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ol>=0 );..  /* I
c350: 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
c360: 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e  r, it means we n
c370: 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
c380: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a  he table names..
c390: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
c3a0: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
c3b0: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
c3c0: 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e  ect() will expan
c3d0: 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65  d any.  ** "*" e
c3e0: 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72  lements in the r
c3f0: 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68  esults set of th
c400: 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20  e view and will 
c410: 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20  assign cursors. 
c420: 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65   ** to the eleme
c430: 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  nts of the FROM 
c440: 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20  clause.  But we 
c450: 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73  do not want thes
c460: 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74  e changes.  ** t
c470: 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20  o be permanent. 
c480: 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74   So the computat
c490: 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61  ion is done on a
c4a0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
c4b0: 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  ECT.  ** stateme
c4c0: 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
c4d0: 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20  the view..  */. 
c4e0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
c4f0: 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53  >pSelect );.  pS
c500: 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  el = sqlite3Sele
c510: 63 74 44 75 70 28 70 54 61 62 6c 65 2d 3e 70 53  ctDup(pTable->pS
c520: 65 6c 65 63 74 29 3b 0a 20 20 6e 20 3d 20 70 50  elect);.  n = pP
c530: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 73 71  arse->nTab;.  sq
c540: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
c550: 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
c560: 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20  , pSel->pSrc);. 
c570: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
c580: 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d 20  -1;.  pSelTab = 
c590: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
c5a0: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
c5b0: 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 70 50 61   0, pSel);.  pPa
c5c0: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20  rse->nTab = n;. 
c5d0: 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
c5e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
c5f0: 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20  le->aCol==0 );. 
c600: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
c610: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
c620: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f  .    pTable->aCo
c630: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
c640: 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  l;.    pSelTab->
c650: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53  nCol = 0;.    pS
c660: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
c670: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
c680: 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54  teTable(0, pSelT
c690: 61 62 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72  ab);.    DbSetPr
c6a0: 6f 70 65 72 74 79 28 70 50 61 72 73 65 2d 3e 64  operty(pParse->d
c6b0: 62 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 2c 20  b, pTable->iDb, 
c6c0: 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
c6d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
c6e0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
c6f0: 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d  .    nErr++;.  }
c700: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
c710: 44 65 6c 65 74 65 28 70 53 65 6c 29 3b 0a 20 20  Delete(pSel);.  
c720: 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
c730: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
c740: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
c750: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c760: 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43  MIT_VIEW./*.** C
c770: 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
c780: 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79  names from every
c790: 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73   VIEW in databas
c7a0: 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  e idx..*/.static
c7b0: 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77   void sqliteView
c7c0: 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33  ResetAll(sqlite3
c7d0: 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a   *db, int idx){.
c7e0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
c7f0: 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65   if( !DbHasPrope
c800: 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
c810: 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20  UnresetViews) ) 
c820: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
c830: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
c840: 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62  &db->aDb[idx].tb
c850: 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c  lHash); i; i=sql
c860: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
c870: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
c880: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
c890: 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54  a(i);.    if( pT
c8a0: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
c8b0: 20 20 20 20 20 73 71 6c 69 74 65 52 65 73 65 74       sqliteReset
c8c0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62  ColumnNames(pTab
c8d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44  );.    }.  }.  D
c8e0: 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64  bClearProperty(d
c8f0: 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73  b, idx, DB_Unres
c900: 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73  etViews);.}.#els
c910: 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74  e.# define sqlit
c920: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c  eViewResetAll(A,
c930: 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  B).#endif /* SQL
c940: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
c950: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
c960: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
c970: 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20 61  by the VDBE to a
c980: 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e  djust the intern
c990: 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65  al schema.** use
c9a0: 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e  d by SQLite when
c9b0: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
c9c0: 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72   moves a table r
c9d0: 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a  oot page. The.**
c9e0: 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20   root-page of a 
c9f0: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69  table or index i
ca00: 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20 68  n database iDb h
ca10: 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  as changed from 
ca20: 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e  iFrom.** to iTo.
ca30: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
ca40: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
ca50: 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  UM.void sqlite3R
ca60: 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 44 62 20  ootPageMoved(Db 
ca70: 2a 70 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  *pDb, int iFrom,
ca80: 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73   int iTo){.  Has
ca90: 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20  hElem *pElem;.  
caa0: 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
cab0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44  iteHashFirst(&pD
cac0: 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70 45 6c  b->tblHash); pEl
cad0: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
cae0: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
caf0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
cb00: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
cb10: 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69  ta(pElem);.    i
cb20: 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69  f( pTab->tnum==i
cb30: 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54  From ){.      pT
cb40: 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a  ab->tnum = iTo;.
cb50: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
cb60: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45    }.  }.  for(pE
cb70: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
cb80: 72 73 74 28 26 70 44 62 2d 3e 69 64 78 48 61 73  rst(&pDb->idxHas
cb90: 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
cba0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
cbb0: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64  pElem)){.    Ind
cbc0: 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74  ex *pIdx = sqlit
cbd0: 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
cbe0: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  ;.    if( pIdx->
cbf0: 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  tnum==iFrom ){. 
cc00: 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20       pIdx->tnum 
cc10: 3d 20 69 54 6f 3b 0a 20 20 20 20 20 20 72 65 74  = iTo;.      ret
cc20: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
cc30: 20 61 73 73 65 72 74 28 30 29 3b 0a 7d 0a 23 65   assert(0);.}.#e
cc40: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
cc50: 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  e code to erase 
cc60: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
cc70: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
cc80: 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44  from database iD
cc90: 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65  b..** Also write
cca0: 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20   code to modify 
ccb0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
ccc0: 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65  r table and inte
ccd0: 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69  rnal schema.** i
cce0: 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  f a root-page of
ccf0: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
cd00: 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
cd10: 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73  tree-layer whils
cd20: 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61  t.** erasing iTa
cd30: 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61  ble (this can ha
cd40: 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74  ppen with an aut
cd50: 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
cd60: 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  e)..*/ .static v
cd70: 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  oid destroyRootP
cd80: 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  age(Parse *pPars
cd90: 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  e, int iTable, i
cda0: 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
cdb0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
cdc0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 73  dbe(pParse);.  s
cdd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
cde0: 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69  v, OP_Destroy, i
cdf0: 54 61 62 6c 65 2c 20 69 44 62 29 3b 0a 23 69 66  Table, iDb);.#if
ce00: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ce10: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
ce20: 20 4f 50 5f 44 65 73 74 72 6f 79 20 70 75 73 68   OP_Destroy push
ce30: 65 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 6e  es an integer on
ce40: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66  to the stack. If
ce50: 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20   this integer.  
ce60: 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ** is non-zero, 
ce70: 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
ce80: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
ce90: 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64  of a table moved
cea0: 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f   to.  ** locatio
ceb0: 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f  n iTable. The fo
cec0: 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64  llowing code mod
ced0: 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65  ifies the sqlite
cee0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f  _master table to
cef0: 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  .  ** reflect th
cf00: 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  is..  **.  ** Th
cf10: 65 20 22 23 30 22 20 69 6e 20 74 68 65 20 53 51  e "#0" in the SQ
cf20: 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 63  L is a special c
cf30: 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61  onstant that mea
cf40: 6e 73 20 77 68 61 74 65 76 65 72 20 76 61 6c 75  ns whatever valu
cf50: 65 0a 20 20 2a 2a 20 69 73 20 6f 6e 20 74 68 65  e.  ** is on the
cf60: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
cf70: 6b 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 52  k.  See sqlite3R
cf80: 65 67 69 73 74 65 72 45 78 70 72 28 29 2e 0a 20  egisterExpr().. 
cf90: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73   */.  sqlite3Nes
cfa0: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
cfb0: 20 0a 20 20 20 20 20 22 55 50 44 41 54 45 20 25   .     "UPDATE %
cfc0: 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61 67  Q.%s SET rootpag
cfd0: 65 3d 25 64 20 57 48 45 52 45 20 23 30 20 41 4e  e=%d WHERE #0 AN
cfe0: 44 20 72 6f 6f 74 70 61 67 65 3d 23 30 22 2c 0a  D rootpage=#0",.
cff0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d       pParse->db-
d000: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
d010: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
d020: 62 29 2c 20 69 54 61 62 6c 65 29 3b 0a 23 65 6e  b), iTable);.#en
d030: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  dif.}../*.** Wri
d040: 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20  te VDBE code to 
d050: 65 72 61 73 65 20 74 61 62 6c 65 20 70 54 61 62  erase table pTab
d060: 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61   and all associa
d070: 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64  ted indices on d
d080: 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20  isk..** Code to 
d090: 75 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74  update the sqlit
d0a0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20  e_master tables 
d0b0: 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  and internal sch
d0c0: 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a  ema definitions.
d0d0: 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f  ** in case a roo
d0e0: 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  t-page belonging
d0f0: 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   to another tabl
d100: 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
d110: 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a  e btree layer.**
d120: 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28   is also added (
d130: 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
d140: 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63  with an auto-vac
d150: 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  uum database)..*
d160: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
d170: 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65  stroyTable(Parse
d180: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
d190: 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20 53  *pTab){.#ifdef S
d1a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
d1b0: 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70  ACUUM.  Index *p
d1c0: 49 64 78 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f  Idx;.  destroyRo
d1d0: 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
d1e0: 54 61 62 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d  Tab->tnum, pTab-
d1f0: 3e 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64  >iDb);.  for(pId
d200: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
d210: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
d220: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73  >pNext){.    des
d230: 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
d240: 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  rse, pIdx->tnum,
d250: 20 70 49 64 78 2d 3e 69 44 62 29 3b 0a 20 20 7d   pIdx->iDb);.  }
d260: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74  .#else.  /* If t
d270: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
d280: 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  be auto-vacuum c
d290: 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54  apable (if SQLIT
d2a0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
d2b0: 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65  M.  ** is not de
d2c0: 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20  fined), then it 
d2d0: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
d2e0: 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20  call OP_Destroy 
d2f0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c  on the.  ** tabl
d300: 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74  e and index root
d310: 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c  -pages in order,
d320: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74   starting with t
d330: 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a  he numerically .
d340: 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f    ** largest roo
d350: 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54  t-page number. T
d360: 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74  his guarantees t
d370: 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hat none of the 
d380: 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20  root-pages.  ** 
d390: 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  to be destroyed 
d3a0: 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20  is relocated by 
d3b0: 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65  an earlier OP_De
d3c0: 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74  stroy. i.e. if t
d3d0: 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  he.  ** followin
d3e0: 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20  g were coded:.  
d3f0: 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72  **.  ** OP_Destr
d400: 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a  oy 4 0.  ** ....
d410: 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
d420: 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e  5 0.  **.  ** an
d430: 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61  d root page 5 ha
d440: 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65  ppened to be the
d450: 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
d460: 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  ge number in the
d470: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
d480: 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35  then root page 5
d490: 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20   would be moved 
d4a0: 74 6f 20 70 61 67 65 20 34 20 62 79 20 74 68 65  to page 4 by the
d4b0: 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72   .  ** "OP_Destr
d4c0: 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20  oy 4 0" opcode. 
d4d0: 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 22  The subsequent "
d4e0: 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20  OP_Destroy 5 0" 
d4f0: 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61  would hit.  ** a
d500: 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e   free-list page.
d510: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  .  */.  int iTab
d520: 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20   = pTab->tnum;. 
d530: 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20   int iDestroyed 
d540: 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31  = 0;..  while( 1
d550: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
d560: 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61  Idx;.    int iLa
d570: 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20  rgest = 0;..    
d580: 69 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d  if( iDestroyed==
d590: 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72  0 || iTab<iDestr
d5a0: 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c  oyed ){.      iL
d5b0: 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20  argest = iTab;. 
d5c0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64     }.    for(pId
d5d0: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
d5e0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
d5f0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
d600: 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e  nt iIdx = pIdx->
d610: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65  tnum;.      asse
d620: 72 74 28 20 70 49 64 78 2d 3e 69 44 62 3d 3d 70  rt( pIdx->iDb==p
d630: 54 61 62 2d 3e 69 44 62 20 29 3b 0a 20 20 20 20  Tab->iDb );.    
d640: 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65    if( (iDestroye
d650: 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44  d==0 || (iIdx<iD
d660: 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49  estroyed)) && iI
d670: 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20  dx>iLargest ){. 
d680: 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20         iLargest 
d690: 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a  = iIdx;.      }.
d6a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c      }.    if( iL
d6b0: 61 72 67 65 73 74 3d 3d 30 20 29 20 72 65 74 75  argest==0 ) retu
d6c0: 72 6e 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52  rn;.    destroyR
d6d0: 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
d6e0: 69 4c 61 72 67 65 73 74 2c 20 70 54 61 62 2d 3e  iLargest, pTab->
d6f0: 69 44 62 29 3b 0a 20 20 20 20 69 44 65 73 74 72  iDb);.    iDestr
d700: 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b  oyed = iLargest;
d710: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
d720: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
d730: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64  e is called to d
d740: 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20  o the work of a 
d750: 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65  DROP TABLE state
d760: 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69  ment..** pName i
d770: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
d780: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72  e table to be dr
d790: 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  opped..*/.void s
d7a0: 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28  qlite3DropTable(
d7b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
d7c0: 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69  rcList *pName, i
d7d0: 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 54 61  nt isView){.  Ta
d7e0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62  ble *pTab;.  Vdb
d7f0: 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
d800: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
d810: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
d820: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
d830: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
d840: 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f  oc_failed ) goto
d850: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
d860: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  ;.  assert( pNam
d870: 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
d880: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
d890: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
d8a0: 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
d8b0: 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
d8c0: 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20  .zDatabase);..  
d8d0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f  if( pTab==0 ) go
d8e0: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
d8f0: 6c 65 3b 0a 20 20 69 44 62 20 3d 20 70 54 61 62  le;.  iDb = pTab
d900: 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28  ->iDb;.  assert(
d910: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
d920: 62 2d 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65  b->nDb );.#ifnde
d930: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
d940: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
d950: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
d960: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
d970: 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
d980: 45 28 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20  E(pTab->iDb);.  
d990: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
d9a0: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62  b = db->aDb[pTab
d9b0: 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->iDb].zName;.  
d9c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
d9d0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
d9e0: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54  QLITE_DELETE, zT
d9f0: 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20  ab, 0, zDb)){.  
da00: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
da10: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
da20: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
da30: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
da40: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
da50: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
da60: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
da70: 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20  _TEMP_VIEW;.    
da80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
da90: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
daa0: 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  ROP_VIEW;.      
dab0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
dac0: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
dad0: 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
dae0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
daf0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
db00: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65  _TABLE;.      }e
db10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
db20: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
db30: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20  TABLE;.      }. 
db40: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
db50: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
db60: 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62  arse, code, pTab
db70: 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
db80: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
db90: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
dba0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
dbb0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
dbc0: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
dbd0: 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  LETE, pTab->zNam
dbe0: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
dbf0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
dc00: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
dc10: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
dc20: 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20   pTab->readOnly 
dc30: 7c 7c 20 70 54 61 62 3d 3d 64 62 2d 3e 61 44 62  || pTab==db->aDb
dc40: 5b 69 44 62 5d 2e 70 53 65 71 54 61 62 20 29 7b  [iDb].pSeqTab ){
dc50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
dc60: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
dc70: 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62  ble %s may not b
dc80: 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62  e dropped", pTab
dc90: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
dca0: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
dcb0: 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  le;.  }..#ifndef
dcc0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
dcd0: 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52  W.  /* Ensure DR
dce0: 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20  OP TABLE is not 
dcf0: 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20  used on a view, 
dd00: 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20 69 73  and DROP VIEW is
dd10: 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f   not used.  ** o
dd20: 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  n a table..  */.
dd30: 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20    if( isView && 
dd40: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
dd50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
dd60: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
dd70: 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20  "use DROP TABLE 
dd80: 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20  to delete table 
dd90: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
dda0: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
ddb0: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
ddc0: 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26  .  if( !isView &
ddd0: 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  & pTab->pSelect 
dde0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
ddf0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
de00: 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f  use DROP VIEW to
de10: 20 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22   delete view %s"
de20: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
de30: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
de40: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  op_table;.  }.#e
de50: 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
de60: 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
de70: 76 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  ve the table fro
de80: 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
de90: 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e  le.  ** on disk.
dea0: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
deb0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
dec0: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
ded0: 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69     Trigger *pTri
dee0: 67 67 65 72 3b 0a 20 20 20 20 69 6e 74 20 69 44  gger;.    int iD
def0: 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20  b = pTab->iDb;. 
df00: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
df10: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20  ->aDb[iDb];.    
df20: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
df30: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
df40: 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 20 20 20  e, 0, iDb);..   
df50: 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69   /* Drop all tri
df60: 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64  ggers associated
df70: 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
df80: 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43  being dropped. C
df90: 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73 20 67 65  ode.    ** is ge
dfa0: 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76  nerated to remov
dfb0: 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73  e entries from s
dfc0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64  qlite_master and
dfd0: 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  /or.    ** sqlit
dfe0: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66  e_temp_master if
dff0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
e000: 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  /.    pTrigger =
e010: 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b   pTab->pTrigger;
e020: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54 72 69  .    while( pTri
e030: 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73  gger ){.      as
e040: 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e  sert( pTrigger->
e050: 69 44 62 3d 3d 69 44 62 20 7c 7c 20 70 54 72 69  iDb==iDb || pTri
e060: 67 67 65 72 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a  gger->iDb==1 );.
e070: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f        sqlite3Dro
e080: 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72  pTriggerPtr(pPar
e090: 73 65 2c 20 70 54 72 69 67 67 65 72 2c 20 31 29  se, pTrigger, 1)
e0a0: 3b 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72  ;.      pTrigger
e0b0: 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
e0c0: 78 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  xt;.    }..#ifnd
e0d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e0e0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
e0f0: 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65   /* Remove any e
e100: 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71  ntries of the sq
e110: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
e120: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
e130: 69 74 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  ith.    ** the t
e140: 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
e150: 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  ed. This is done
e160: 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c   before the tabl
e170: 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 20  e is dropped.   
e180: 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65   ** at the btree
e190: 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20   level, in case 
e1a0: 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
e1b0: 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20  nce table needs 
e1c0: 74 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61  to.    ** move a
e1d0: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
e1e0: 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70  e drop (can happ
e1f0: 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  en in auto-vacuu
e200: 6d 20 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a  m mode)..    */.
e210: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 75      if( pTab->au
e220: 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 73  toInc ){.      s
e230: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
e240: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
e250: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
e260: 73 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  s.sqlite_sequenc
e270: 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  e WHERE name=%Q"
e280: 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  ,.        pDb->z
e290: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
e2a0: 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
e2b0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
e2c0: 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f  Drop all SQLITE_
e2d0: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64  MASTER table and
e2e0: 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74   index entries t
e2f0: 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
e300: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54  .    ** table. T
e310: 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20  he program name 
e320: 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68  loops through th
e330: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e master table a
e340: 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a  nd deletes.    *
e350: 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74  * every row that
e360: 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
e370: 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  le of the same n
e380: 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62  ame as the one b
e390: 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70  eing.    ** drop
e3a0: 70 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72  ped. Triggers ar
e3b0: 65 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61  e handled sepera
e3c0: 74 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74  tely because a t
e3d0: 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20  rigger can be.  
e3e0: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20    ** created in 
e3f0: 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
e400: 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  e that refers to
e410: 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74   a table in anot
e420: 68 65 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  her.    ** datab
e430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
e440: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
e450: 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
e460: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
e470: 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c   %Q.%s WHERE tbl
e480: 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70  _name=%Q and typ
e490: 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20  e!='trigger'",. 
e4a0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d         pDb->zNam
e4b0: 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
e4c0: 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  iDb), pTab->zNam
e4d0: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56  e);.    if( !isV
e4e0: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 64 65 73  iew ){.      des
e4f0: 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65  troyTable(pParse
e500: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 0a  , pTab);.    }..
e510: 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
e520: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72  e table entry fr
e530: 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65  om SQLite's inte
e540: 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20  rnal schema and 
e550: 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a 20 74 68  modify.    ** th
e560: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
e570: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
e580: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
e590: 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c  _DropTable, iDb,
e5a0: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   0, pTab->zName,
e5b0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
e5c0: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
e5d0: 20 76 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20   v, iDb);.  }.  
e5e0: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
e5f0: 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78  ll(db, iDb);..ex
e600: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20  it_drop_table:. 
e610: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
e620: 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a  elete(pName);.}.
e630: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
e640: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
e650: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f   create a new fo
e660: 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65  reign key on the
e670: 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e   table.** curren
e680: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
e690: 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f  uction.  pFromCo
e6a0: 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  l determines whi
e6b0: 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  ch columns.** in
e6c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
e6d0: 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  le point to the 
e6e0: 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66  foreign key.  If
e6f0: 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65   pFromCol==0 the
e700: 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65  n.** connect the
e710: 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74   key to the last
e720: 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64   column inserted
e730: 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61  .  pTo is the na
e740: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62  me of.** the tab
e750: 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20  le referred to. 
e760: 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73   pToCol is a lis
e770: 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  t of tables in t
e780: 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20  he other.** pTo 
e790: 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66  table that the f
e7a0: 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74  oreign key point
e7b0: 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e  s to.  flags con
e7c0: 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66  tains all.** inf
e7d0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
e7e0: 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  he conflict reso
e7f0: 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
e800: 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69  s specified.** i
e810: 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c  n the ON DELETE,
e820: 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f   ON UPDATE and O
e830: 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73  N INSERT clauses
e840: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20  ..**.** An FKey 
e850: 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
e860: 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74  ated and added t
e870: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
e880: 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63  ently.** under c
e890: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74  onstruction in t
e8a0: 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  he pParse->pNewT
e8b0: 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65  able field.  The
e8c0: 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20   new FKey.** is 
e8d0: 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20  not linked into 
e8e0: 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69  db->aFKey at thi
e8f0: 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64  s point - that d
e900: 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a  oes not happen.*
e910: 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 45  * until sqlite3E
e920: 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a  ndTable()..**.**
e930: 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   The foreign key
e940: 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45   is set for IMME
e950: 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67  DIATE processing
e960: 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  .  A subsequent 
e970: 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  call.** to sqlit
e980: 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
e990: 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65  y() might change
e9a0: 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45   this to DEFERRE
e9b0: 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  D..*/.void sqlit
e9c0: 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b  e3CreateForeignK
e9d0: 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
e9e0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
e9f0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
ea00: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72  .  ExprList *pFr
ea10: 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d  omCol,  /* Colum
ea20: 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65  ns in this table
ea30: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
ea40: 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
ea50: 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20  Token *pTo,     
ea60: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
ea70: 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
ea80: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
ea90: 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c  ToCol,    /* Col
eaa0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65  umns in the othe
eab0: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  r table */.  int
eac0: 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
ead0: 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
eae0: 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
eaf0: 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  hms. */.){.#ifnd
eb00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
eb10: 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65  OREIGN_KEY.  FKe
eb20: 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20  y *pFKey = 0;.  
eb30: 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73  Table *p = pPars
eb40: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
eb50: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  int nByte;.  int
eb60: 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a   i;.  int nCol;.
eb70: 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73    char *z;..  as
eb80: 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a  sert( pTo!=0 );.
eb90: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50    if( p==0 || pP
eba0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
ebb0: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20  o fk_end;.  if( 
ebc0: 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
ebd0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
ebe0: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28  >nCol-1;.    if(
ebf0: 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66   iCol<0 ) goto f
ec00: 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70  k_end;.    if( p
ec10: 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
ec20: 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
ec30: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
ec40: 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65  sg(pParse, "fore
ec50: 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20  ign key on %s". 
ec60: 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64          " should
ec70: 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20   reference only 
ec80: 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  one column of ta
ec90: 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20  ble %T",.       
eca0: 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e    p->aCol[iCol].
ecb0: 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20  zName, pTo);.   
ecc0: 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
ecd0: 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d      }.    nCol =
ece0: 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
ecf0: 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
ed00: 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f  ->nExpr!=pFromCo
ed10: 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  l->nExpr ){.    
ed20: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ed30: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
ed40: 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d  "number of colum
ed50: 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  ns in foreign ke
ed60: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
ed70: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22   the number of "
ed80: 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e  .        "column
ed90: 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e  s in the referen
eda0: 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20  ced table");.   
edb0: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
edc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20  }else{.    nCol 
edd0: 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  = pFromCol->nExp
ede0: 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  r;.  }.  nByte =
edf0: 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20   sizeof(*pFKey) 
ee00: 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46  + nCol*sizeof(pF
ee10: 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20  Key->aCol[0]) + 
ee20: 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66  pTo->n + 1;.  if
ee30: 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
ee40: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f  for(i=0; i<pToCo
ee50: 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  l->nExpr; i++){.
ee60: 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73        nByte += s
ee70: 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b  trlen(pToCol->a[
ee80: 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
ee90: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
eea0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
eeb0: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
eec0: 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20  pFKey==0 ) goto 
eed0: 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d  fk_end;.  pFKey-
eee0: 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46  >pFrom = p;.  pF
eef0: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d  Key->pNextFrom =
ef00: 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d   p->pFKey;.  z =
ef10: 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31   (char*)&pFKey[1
ef20: 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  ];.  pFKey->aCol
ef30: 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d   = (struct sColM
ef40: 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69  ap*)z;.  z += si
ef50: 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c  zeof(struct sCol
ef60: 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b  Map)*nCol;.  pFK
ef70: 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d  ey->zTo = z;.  m
ef80: 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c  emcpy(z, pTo->z,
ef90: 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54   pTo->n);.  z[pT
efa0: 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b  o->n] = 0;.  z +
efb0: 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46  = pTo->n+1;.  pF
efc0: 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30  Key->pNextTo = 0
efd0: 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20  ;.  pFKey->nCol 
efe0: 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46  = nCol;.  if( pF
eff0: 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
f000: 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e   pFKey->aCol[0].
f010: 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  iFrom = p->nCol-
f020: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
f030: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
f040: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
f050: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
f060: 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b  0; j<p->nCol; j+
f070: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
f080: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
f090: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
f0a0: 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
f0b0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
f0c0: 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43         pFKey->aC
f0d0: 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b  ol[i].iFrom = j;
f0e0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
f0f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f100: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e    }.      if( j>
f110: 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  =p->nCol ){.    
f120: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f130: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
f140: 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20         "unknown 
f150: 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e  column \"%s\" in
f160: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
f170: 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20  inition", .     
f180: 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61       pFromCol->a
f190: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
f1a0: 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
f1b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f1c0: 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20   }.  if( pToCol 
f1d0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
f1e0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
f1f0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
f200: 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  en(pToCol->a[i].
f210: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
f220: 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
f230: 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d  l = z;.      mem
f240: 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  cpy(z, pToCol->a
f250: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  [i].zName, n);. 
f260: 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20       z[n] = 0;. 
f270: 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20       z += n+1;. 
f280: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
f290: 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30  ->isDeferred = 0
f2a0: 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74  ;.  pFKey->delet
f2b0: 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20  eConf = flags & 
f2c0: 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75  0xff;.  pFKey->u
f2d0: 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61  pdateConf = (fla
f2e0: 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66  gs >> 8 ) & 0xff
f2f0: 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72  ;.  pFKey->inser
f300: 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e  tConf = (flags >
f310: 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a  > 16 ) & 0xff;..
f320: 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
f330: 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
f340: 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
f350: 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
f360: 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
f370: 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
f380: 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
f390: 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 23 65 6e  Free(pFKey);.#en
f3a0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
f3b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
f3c0: 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71  IGN_KEY) */.  sq
f3d0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
f3e0: 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20  ete(pFromCol);. 
f3f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
f400: 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a  Delete(pToCol);.
f410: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
f420: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
f430: 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c  when an INITIALL
f440: 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49  Y IMMEDIATE or I
f450: 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
f460: 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73  D.** clause is s
f470: 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61  een as part of a
f480: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
f490: 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73  inition.  The is
f4a0: 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61  Deferred.** para
f4b0: 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49  meter is 1 for I
f4c0: 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
f4d0: 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54  D and 0 for INIT
f4e0: 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e  IALLY IMMEDIATE.
f4f0: 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72  .** The behavior
f500: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
f510: 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f  ently created fo
f520: 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a  reign key is adj
f530: 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69  usted.** accordi
f540: 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ngly..*/.void sq
f550: 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
f560: 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72  nKey(Parse *pPar
f570: 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72  se, int isDeferr
f580: 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ed){.#ifndef SQL
f590: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
f5a0: 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54  _KEY.  Table *pT
f5b0: 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  ab;.  FKey *pFKe
f5c0: 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d  y;.  if( (pTab =
f5d0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
f5e0: 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79  le)==0 || (pFKey
f5f0: 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d   = pTab->pFKey)=
f600: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
f610: 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
f620: 20 3d 20 69 73 44 65 66 65 72 72 65 64 3b 0a 23   = isDeferred;.#
f630: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  endif.}../*.** G
f640: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
f650: 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64  t will erase and
f660: 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70   refill index *p
f670: 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  Idx.  This is.**
f680: 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c   used to initial
f690: 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61  ize a newly crea
f6a0: 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20  ted index or to 
f6b0: 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  recompute the.**
f6c0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69   content of an i
f6d0: 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65  ndex in response
f6e0: 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f   to a REINDEX co
f6f0: 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20  mmand..**.** if 
f700: 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e  memRootPage is n
f710: 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20  ot negative, it 
f720: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 69  means that the i
f730: 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a  ndex is newly.**
f740: 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 6d   created.  The m
f750: 65 6d 6f 72 79 20 63 65 6c 6c 20 73 70 65 63 69  emory cell speci
f760: 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50  fied by memRootP
f770: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  age contains the
f780: 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  .** root page nu
f790: 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
f7a0: 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61  x.  If memRootPa
f7b0: 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
f7c0: 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65  then.** the inde
f7d0: 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
f7e0: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65   and must be cle
f7f0: 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ared before bein
f800: 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a  g refilled and.*
f810: 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * the root page 
f820: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
f830: 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  dex is taken fro
f840: 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a  m pIndex->tnum..
f850: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
f860: 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
f870: 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
f880: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20   Index *pIndex, 
f890: 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29  int memRootPage)
f8a0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
f8b0: 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
f8c0: 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  ;  /* The table 
f8d0: 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20  that is indexed 
f8e0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
f8f0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 20 20 20  pParse->nTab;   
f900: 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
f910: 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61  sor used for pTa
f920: 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20  b */.  int iIdx 
f930: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 31  = pParse->nTab+1
f940: 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63  ;     /* Btree c
f950: 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
f960: 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61  Index */.  int a
f970: 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  ddr1;           
f980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
f990: 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c  ress of top of l
f9a0: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75  oop */.  int tnu
f9b0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
f9c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
f9d0: 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  page of index */
f9e0: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
f9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa00: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
fa10: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72  de into this vir
fa20: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a  tual machine */.
fa30: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
fa40: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
fa50: 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ON.  if( sqlite3
fa60: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
fa70: 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  , SQLITE_REINDEX
fa80: 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
fa90: 20 30 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65   0,.      pParse
faa0: 2d 3e 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78  ->db->aDb[pIndex
fab0: 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29  ->iDb].zName ) )
fac0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
fad0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45  }.#endif..  /* E
fae0: 6e 73 75 72 65 20 61 6c 6c 20 74 68 65 20 72 65  nsure all the re
faf0: 71 75 69 72 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  quired collation
fb00: 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 20 61   sequences are a
fb10: 76 61 69 6c 61 62 6c 65 2e 20 54 68 69 73 0a 20  vailable. This. 
fb20: 20 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c   ** routine will
fb30: 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6c 6c   invoke the coll
fb40: 61 74 69 6f 6e 2d 6e 65 65 64 65 64 20 63 61 6c  ation-needed cal
fb50: 6c 62 61 63 6b 20 69 66 20 6e 65 63 65 73 73 61  lback if necessa
fb60: 72 79 20 28 61 6e 64 0a 20 20 2a 2a 20 69 66 20  ry (and.  ** if 
fb70: 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 72 65 67  one has been reg
fb80: 69 73 74 65 72 65 64 29 2e 0a 20 20 2a 2f 0a 20  istered)..  */. 
fb90: 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63   if( sqlite3Chec
fba0: 6b 49 6e 64 65 78 43 6f 6c 6c 53 65 71 28 70 50  kIndexCollSeq(pP
fbb0: 61 72 73 65 2c 20 70 49 6e 64 65 78 29 20 29 7b  arse, pIndex) ){
fbc0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
fbd0: 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
fbe0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
fbf0: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
fc00: 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f  urn;.  if( memRo
fc10: 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  otPage>=0 ){.   
fc20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fc30: 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
fc40: 20 6d 65 6d 52 6f 6f 74 50 61 67 65 2c 20 30 29   memRootPage, 0)
fc50: 3b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 30 3b 0a  ;.    tnum = 0;.
fc60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75    }else{.    tnu
fc70: 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  m = pIndex->tnum
fc80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
fc90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 65  eAddOp(v, OP_Cle
fca0: 61 72 2c 20 74 6e 75 6d 2c 20 70 49 6e 64 65 78  ar, tnum, pIndex
fcb0: 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71  ->iDb);.  }.  sq
fcc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fcd0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49  , OP_Integer, pI
fce0: 6e 64 65 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20  ndex->iDb, 0);. 
fcf0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
fd00: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
fd10: 20 69 49 64 78 2c 20 74 6e 75 6d 2c 0a 20 20 20   iIdx, tnum,.   
fd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd30: 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d   (char*)&pIndex-
fd40: 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  >keyInfo, P3_KEY
fd50: 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
fd60: 4f 70 65 6e 54 61 62 6c 65 46 6f 72 52 65 61 64  OpenTableForRead
fd70: 69 6e 67 28 76 2c 20 69 54 61 62 2c 20 70 54 61  ing(v, iTab, pTa
fd80: 62 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  b);.  addr1 = sq
fd90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fda0: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  , OP_Rewind, iTa
fdb0: 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  b, 0);.  sqlite3
fdc0: 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
fdd0: 28 76 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62  (v, pIndex, iTab
fde0: 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d  );.  if( pIndex-
fdf0: 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
fe00: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 75 72  e ){.    int cur
fe10: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
fe20: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
fe30: 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 32 20  ;.    int addr2 
fe40: 3d 20 63 75 72 61 64 64 72 2b 34 3b 0a 20 20 20  = curaddr+4;.   
fe50: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
fe60: 67 65 50 32 28 76 2c 20 63 75 72 61 64 64 72 2d  geP2(v, curaddr-
fe70: 31 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 73  1, addr2);.    s
fe80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fe90: 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61  v, OP_Rowid, iTa
fea0: 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
feb0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fec0: 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 30 29 3b  P_AddImm, 1, 0);
fed0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
fee0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 55 6e  AddOp(v, OP_IsUn
fef0: 69 71 75 65 2c 20 69 49 64 78 2c 20 61 64 64 72  ique, iIdx, addr
ff00: 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  2);.    sqlite3V
ff10: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c  dbeOp3(v, OP_Hal
ff20: 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  t, SQLITE_CONSTR
ff30: 41 49 4e 54 2c 20 4f 45 5f 41 62 6f 72 74 2c 0a  AINT, OE_Abort,.
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff50: 20 20 20 20 22 69 6e 64 65 78 65 64 20 63 6f 6c      "indexed col
ff60: 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69  umns are not uni
ff70: 71 75 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29  que", P3_STATIC)
ff80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 64  ;.    assert( ad
ff90: 64 72 32 3d 3d 73 71 6c 69 74 65 33 56 64 62 65  dr2==sqlite3Vdbe
ffa0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 29  CurrentAddr(v) )
ffb0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
ffc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
ffd0: 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20  dxInsert, iIdx, 
ffe0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
fff0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
10000 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31  t, iTab, addr1+1
10010 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
10020 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
10030 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
10040 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
10050 73 65 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  se, iTab, 0);.  
10060 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10070 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
10080 64 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx, 0);.}../*.**
10090 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
100a0 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74  dex for an SQL t
100b0 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e  able.  pName1.pN
100c0 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65  ame2 is the name
100d0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
100e0 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69  * and pTblList i
100f0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
10100 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
10110 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
10120 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
10130 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
10140 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e  ary key or an in
10150 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61  dex that is crea
10160 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61  ted to satisfy a
10170 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .** UNIQUE const
10180 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c  raint.  If pTabl
10190 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65  e and pIndex are
101a0 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73   NULL, use pPars
101b0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20  e->pNewTable.** 
101c0 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  as the table to 
101d0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61  be indexed.  pPa
101e0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
101f0 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  s a table that i
10200 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62  s.** currently b
10210 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
10220 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42   by a CREATE TAB
10230 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
10240 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
10250 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
10260 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
10270 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
10280 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  L if this.** is 
10290 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
102a0 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69   unique-constrai
102b0 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
102c0 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64  ecent column add
102d0 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62  ed.** to the tab
102e0 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
102f0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
10300 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74    .*/.void sqlit
10310 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20  e3CreateIndex(. 
10320 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
10330 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72      /* All infor
10340 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69  mation about thi
10350 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b  s parse */.  Tok
10360 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
10370 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
10380 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
10390 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   be NULL */.  To
103a0 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
103b0 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
103c0 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d  of index name. M
103d0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
103e0 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d  SrcList *pTblNam
103f0 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69  e, /* Table to i
10400 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65  ndex. Use pParse
10410 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30  ->pNewTable if 0
10420 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
10430 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69  pList,   /* A li
10440 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
10450 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
10460 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
10470 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c      /* OE_Abort,
10480 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52   OE_Ignore, OE_R
10490 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f  eplace, or OE_No
104a0 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ne */.  Token *p
104b0 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68  Start,     /* Th
104c0 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
104d0 68 61 74 20 62 65 67 69 6e 73 20 61 20 43 52 45  hat begins a CRE
104e0 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
104f0 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
10500 70 45 6e 64 20 20 20 20 20 20 20 20 2f 2a 20 54  pEnd        /* T
10510 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73  he ")" that clos
10520 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49 4e  es the CREATE IN
10530 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  DEX statement */
10540 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
10550 62 20 3d 20 30 3b 20 20 20 2f 2a 20 54 61 62 6c  b = 0;   /* Tabl
10560 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
10570 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
10580 65 78 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 69  ex = 0; /* The i
10590 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74  ndex to be creat
105a0 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ed */.  char *zN
105b0 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ame = 0;.  int i
105c0 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c  , j;.  Token nul
105d0 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20  lId;    /* Fake 
105e0 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70  token for an emp
105f0 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20  ty ID list */.  
10600 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20  DbFixer sFix;   
10610 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e   /* For assignin
10620 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73  g database names
10630 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20   to pTable */.  
10640 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
10650 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 6e 74  arse->db;..  int
10660 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 2f   iDb;          /
10670 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64  * Index of the d
10680 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20  atabase that is 
10690 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
106a0 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  .  Token *pName 
106b0 3d 20 30 3b 20 2f 2a 20 55 6e 71 75 61 6c 69 66  = 0; /* Unqualif
106c0 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
106d0 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20  index to create 
106e0 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  */..  if( pParse
106f0 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
10700 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
10710 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
10720 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a  te_index;..  /*.
10730 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61    ** Find the ta
10740 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
10750 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75  e indexed.  Retu
10760 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20  rn early if not 
10770 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  found..  */.  if
10780 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
10790 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
107a0 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20   two-part index 
107b0 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  name to determin
107c0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  e the database .
107d0 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68      ** to search
107e0 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
107f0 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20  'Fix' the table 
10800 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a  name to this db.
10810 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f      ** before lo
10820 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62  oking up the tab
10830 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  le..    */.    a
10840 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26  ssert( pName1 &&
10850 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69   pName2 );.    i
10860 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
10870 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
10880 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
10890 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  &pName);.    if(
108a0 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78   iDb<0 ) goto ex
108b0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
108c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
108d0 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20  _OMIT_TEMPDB.   
108e0 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
108f0 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c   name was unqual
10900 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20  ified, check if 
10910 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  the the table.  
10920 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74    ** is a temp t
10930 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74  able. If so, set
10940 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
10950 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70   1..    */.    p
10960 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Tab = sqlite3Src
10970 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73  ListLookup(pPars
10980 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  e, pTblName);.  
10990 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20    if( pName2 && 
109a0 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20  pName2->n==0 && 
109b0 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 69 44  pTab && pTab->iD
109c0 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 44  b==1 ){.      iD
109d0 62 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  b = 1;.    }.#en
109e0 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73 71 6c  dif..    if( sql
109f0 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
10a00 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20  x, pParse, iDb, 
10a10 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20  "index", pName) 
10a20 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  &&.        sqlit
10a30 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46  e3FixSrcList(&sF
10a40 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20  ix, pTblName).  
10a50 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65    ){.      /* Be
10a60 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72  cause the parser
10a70 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c   constructs pTbl
10a80 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67  Name from a sing
10a90 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20  le identifier,. 
10aa0 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46       ** sqlite3F
10ab0 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65  ixSrcList can ne
10ac0 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20  ver fail. */.   
10ad0 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
10ae0 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73    }.    pTab = s
10af0 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
10b00 65 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61  e(pParse, pTblNa
10b10 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
10b20 0a 20 20 20 20 20 20 20 20 70 54 62 6c 4e 61 6d  .        pTblNam
10b30 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
10b40 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61  e);.    if( !pTa
10b50 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  b ) goto exit_cr
10b60 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
10b70 61 73 73 65 72 74 28 20 69 44 62 3d 3d 70 54 61  assert( iDb==pTa
10b80 62 2d 3e 69 44 62 20 29 3b 0a 20 20 7d 65 6c 73  b->iDb );.  }els
10b90 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
10ba0 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Name==0 );.    p
10bb0 54 61 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70  Tab =  pParse->p
10bc0 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 44  NewTable;.    iD
10bd0 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20  b = pTab->iDb;. 
10be0 20 7d 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   }..  if( pTab==
10bf0 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
10c00 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  r ) goto exit_cr
10c10 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66  eate_index;.  if
10c20 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79  ( pTab->readOnly
10c30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
10c40 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10c50 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f  "table %s may no
10c60 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70  t be indexed", p
10c70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
10c80 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
10c90 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66  e_index;.  }.#if
10ca0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10cb0 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62  _VIEW.  if( pTab
10cc0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
10cd0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10ce0 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20  (pParse, "views 
10cf0 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
10d00 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ed");.    goto e
10d10 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10d20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
10d30 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
10d40 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
10d50 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  ex.  Make sure t
10d60 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  here is not alre
10d70 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a  ady another.  **
10d80 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
10d90 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
10da0 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  me.  .  **.  ** 
10db0 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77  Exception:  If w
10dc0 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
10dd0 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61  e names of perma
10de0 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f  nent indices fro
10df0 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  m the.  ** sqlit
10e00 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28  e_master table (
10e10 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68  because some oth
10e20 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67  er process chang
10e30 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61  ed the schema) a
10e40 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74  nd.  ** one of t
10e50 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63  he index names c
10e60 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65  ollides with the
10e70 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f   name of a tempo
10e80 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20  rary table or.  
10e90 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77  ** index, then w
10ea0 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
10eb0 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20  to process this 
10ec0 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
10ed0 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20   If pName==0 it 
10ee0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72  means that we ar
10ef0 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77  e.  ** dealing w
10f00 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65  ith a primary ke
10f10 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  y or UNIQUE cons
10f20 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65  traint.  We have
10f30 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20   to invent our. 
10f40 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20   ** own name..  
10f50 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29  */.  if( pName )
10f60 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
10f70 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
10f80 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  en(pName);.    i
10f90 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
10fa0 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
10fb0 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65  pParse) ) goto e
10fc0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10fd0 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
10fe0 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
10ff0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
11000 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
11010 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
11020 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
11030 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67  Name) ){.      g
11040 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
11050 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
11060 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
11070 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  usy ){.      if(
11080 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
11090 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
110a0 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69  arse) ) goto exi
110b0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
110c0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
110d0 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
110e0 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44  Name, db->aDb[iD
110f0 62 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  b].zName)!=0 ){.
11100 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
11110 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11120 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64  "index %s alread
11130 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65  y exists", zName
11140 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
11150 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
11160 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
11170 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
11180 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
11190 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)!=0 ){.      
111a0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
111b0 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
111c0 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61   is already a ta
111d0 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  ble named %s", z
111e0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
111f0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
11200 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
11210 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
11220 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
11230 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
11240 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20  Index *pLoop;.  
11250 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62    for(pLoop=pTab
11260 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70  ->pIndex, n=1; p
11270 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
11280 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d  p->pNext, n++){}
11290 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
112a0 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20 20 20 20  f,"_%d",n);.    
112b0 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73  zName = 0;.    s
112c0 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
112d0 26 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  &zName, "sqlite_
112e0 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 70 54 61  autoindex_", pTa
112f0 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66 2c 20  b->zName, zBuf, 
11300 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 69  (char*)0);.    i
11310 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
11320 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
11330 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ndex;.  }..  /* 
11340 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72  Check for author
11350 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74  ization to creat
11360 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f  e an index..  */
11370 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11380 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
11390 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ON.  {.    const
113a0 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
113b0 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
113c0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
113d0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
113e0 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
113f0 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
11400 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  b), 0, zDb) ){. 
11410 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
11420 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
11430 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
11440 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
11450 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
11460 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
11470 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
11480 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
11490 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
114a0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
114b0 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
114c0 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
114d0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
114e0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
114f0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
11500 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
11510 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
11520 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
11530 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
11540 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
11550 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
11560 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
11570 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
11580 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
11590 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
115a0 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
115b0 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
115c0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
115d0 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54     nullId.z = pT
115e0 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
115f0 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col-1].zName;.  
11600 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72    nullId.n = str
11610 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20  len(nullId.z);. 
11620 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
11630 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
11640 28 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b  (0, 0, &nullId);
11650 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
11660 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
11670 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
11680 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f  .  /* .  ** Allo
11690 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73  cate the index s
116a0 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a  tructure. .  */.
116b0 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
116c0 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
116d0 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e 28  Index) + strlen(
116e0 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 20 73 69 7a  zName) + 1 + siz
116f0 65 6f 66 28 69 6e 74 29 20 2b 0a 20 20 20 20 20  eof(int) +.     
11700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11710 20 20 20 28 73 69 7a 65 6f 66 28 69 6e 74 29 2a     (sizeof(int)*
11720 32 20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  2 + sizeof(CollS
11730 65 71 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e 45 78  eq*))*pList->nEx
11740 70 72 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  pr );.  if( sqli
11750 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
11760 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  d ) goto exit_cr
11770 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49  eate_index;.  pI
11780 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  ndex->aiColumn =
11790 20 28 69 6e 74 2a 29 26 70 49 6e 64 65 78 2d 3e   (int*)&pIndex->
117a0 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 70 4c  keyInfo.aColl[pL
117b0 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 70  ist->nExpr];.  p
117c0 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20  Index->aiRowEst 
117d0 3d 20 28 75 6e 73 69 67 6e 65 64 2a 29 26 70 49  = (unsigned*)&pI
117e0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  ndex->aiColumn[p
117f0 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20  List->nExpr];.  
11800 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20  pIndex->zName = 
11810 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e  (char*)&pIndex->
11820 61 69 52 6f 77 45 73 74 5b 70 4c 69 73 74 2d 3e  aiRowEst[pList->
11830 6e 45 78 70 72 2b 31 5d 3b 0a 20 20 73 74 72 63  nExpr+1];.  strc
11840 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  py(pIndex->zName
11850 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64  , zName);.  pInd
11860 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  ex->pTable = pTa
11870 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  b;.  pIndex->nCo
11880 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  lumn = pList->nE
11890 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f  xpr;.  pIndex->o
118a0 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72  nError = onError
118b0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f  ;.  pIndex->auto
118c0 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30  Index = pName==0
118d0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44 62 20  ;.  pIndex->iDb 
118e0 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 53 63 61  = iDb;..  /* Sca
118f0 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  n the names of t
11900 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
11910 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
11920 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c  dexed and.  ** l
11930 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  oad the column i
11940 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20  ndices into the 
11950 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  Index structure.
11960 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f    Report an erro
11970 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f  r.  ** if any co
11980 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e  lumn is not foun
11990 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  d..  */.  for(i=
119a0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
119b0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  r; i++){.    for
119c0 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
119d0 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
119e0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
119f0 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
11a00 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
11a10 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [j].zName)==0 ) 
11a20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
11a30 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
11a40 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
11a50 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
11a60 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
11a70 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
11a80 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  d %s",.        p
11a90 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69 73  Tab->zName, pLis
11aa0 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
11ab0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
11ac0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11ad0 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
11ae0 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b  aiColumn[i] = j;
11af0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
11b00 61 5b 69 5d 2e 70 45 78 70 72 20 29 7b 0a 20 20  a[i].pExpr ){.  
11b10 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
11b20 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70  t->a[i].pExpr->p
11b30 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 49  Coll );.      pI
11b40 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  ndex->keyInfo.aC
11b50 6f 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73 74 2d 3e  oll[i] = pList->
11b60 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c  a[i].pExpr->pCol
11b70 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
11b80 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49      pIndex->keyI
11b90 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  nfo.aColl[i] = p
11ba0 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f  Tab->aCol[j].pCo
11bb0 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ll;.    }.    as
11bc0 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6b 65  sert( pIndex->ke
11bd0 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 29  yInfo.aColl[i] )
11be0 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  ;.    if( !db->i
11bf0 6e 69 74 2e 62 75 73 79 20 26 26 20 0a 20 20 20  nit.busy && .   
11c00 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63       sqlite3Chec
11c10 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  kCollSeq(pParse,
11c20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f   pIndex->keyInfo
11c30 2e 61 43 6f 6c 6c 5b 69 5d 29 20 0a 20 20 20 20  .aColl[i]) .    
11c40 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
11c50 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
11c60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 6e  .    }.  }.  pIn
11c70 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69  dex->keyInfo.nFi
11c80 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  eld = pList->nEx
11c90 70 72 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 66  pr;.  sqlite3Def
11ca0 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65  aultRowEst(pInde
11cb0 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  x);..  if( pTab=
11cc0 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62  =pParse->pNewTab
11cd0 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  le ){.    /* Thi
11ce0 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65  s routine has be
11cf0 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  en called to cre
11d00 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ate an automatic
11d10 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20   index as a.    
11d20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50  ** result of a P
11d30 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
11d40 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61  IQUE clause on a
11d50 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
11d60 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  on, or.    ** a 
11d70 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
11d80 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c  NIQUE clause fol
11d90 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d  lowing the colum
11da0 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20  n definitions.. 
11db0 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f     ** i.e. one o
11dc0 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
11dd0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
11de0 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  x PRIMARY KEY, y
11df0 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  );.    ** CREATE
11e00 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55   TABLE t(x, y, U
11e10 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20  NIQUE(x, y));.  
11e20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68    **.    ** Eith
11e30 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f  er way, check to
11e40 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c   see if the tabl
11e50 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75  e already has su
11e60 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a  ch an index. If.
11e70 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74      ** so, don't
11e80 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67   bother creating
11e90 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20   this one. This 
11ea0 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a  only applies to.
11eb0 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
11ec0 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ally created ind
11ed0 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20  ices. Users can 
11ee0 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20  do as they wish 
11ef0 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c  with.    ** expl
11f00 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20  icit indices..  
11f10 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a    */.    Index *
11f20 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
11f30 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
11f40 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
11f50 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
11f60 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73  int k;.      ass
11f70 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72  ert( pIdx->onErr
11f80 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20  or!=OE_None );. 
11f90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
11fa0 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a  x->autoIndex );.
11fb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
11fc0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
11fd0 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20  E_None );..     
11fe0 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
11ff0 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  mn!=pIndex->nCol
12000 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
12010 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
12020 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
12030 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  k++){.        if
12040 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
12050 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43  [k]!=pIndex->aiC
12060 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b  olumn[k] ) break
12070 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
12080 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  dx->keyInfo.aCol
12090 6c 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b 65  l[k]!=pIndex->ke
120a0 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20 29  yInfo.aColl[k] )
120b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
120c0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64        if( k==pId
120d0 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  x->nColumn ){.  
120e0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
120f0 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d  onError!=pIndex-
12100 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  >onError ){.    
12110 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f        /* This co
12120 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73  nstraint creates
12130 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20   the same index 
12140 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  as a previous.  
12150 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
12160 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20  raint specified 
12170 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65  somewhere in the
12180 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
12190 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20  atement..       
121a0 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68     ** However th
121b0 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  e ON CONFLICT cl
121c0 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72  auses are differ
121d0 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69  ent. If both thi
121e0 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
121f0 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74  constraint and t
12200 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69  he previous equi
12210 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e  valent constrain
12220 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a  t have explicit.
12230 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20            ** ON 
12240 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
12250 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f   this is an erro
12260 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  r. Otherwise, us
12270 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  e the.          
12280 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  ** explicitly sp
12290 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 75  ecified behaviou
122a0 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e  r for the index.
122b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
122c0 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49          if( !(pI
122d0 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
122e0 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65  Default || pInde
122f0 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
12300 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20  efault) ){.     
12310 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
12320 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
12330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12340 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20  "conflicting ON 
12350 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
12360 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b   specified", 0);
12370 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
12380 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
12390 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
123a0 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ault ){.        
123b0 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f      pIdx->onErro
123c0 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  r = pIndex->onEr
123d0 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ror;.          }
123e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
123f0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
12400 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
12410 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
12420 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
12430 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
12440 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64  to its table and
12450 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20   to the other.  
12460 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
12470 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73  abase structures
12480 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  . .  */.  if( db
12490 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
124a0 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
124b0 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
124c0 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b  Insert(&db->aDb[
124d0 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 69 64 78  pIndex->iDb].idx
124e0 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20  Hash, .         
124f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12500 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73  pIndex->zName, s
12510 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e  trlen(pIndex->zN
12520 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b  ame)+1, pIndex);
12530 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
12540 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
12550 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c  Index );  /* Mal
12560 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
12570 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 67 6f  iled */.      go
12580 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
12590 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
125a0 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
125b0 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
125c0 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e  s;.    if( pTblN
125d0 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame!=0 ){.      
125e0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64  pIndex->tnum = d
125f0 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
12600 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
12610 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74   If the db->init
12620 2e 62 75 73 79 20 69 73 20 30 20 74 68 65 6e 20  .busy is 0 then 
12630 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78  create the index
12640 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a   on disk.  This.
12650 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72    ** involves wr
12660 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  iting the index 
12670 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  into the master 
12680 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e  table and fillin
12690 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e  g in the.  ** in
126a0 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72  dex with the cur
126b0 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65  rent table conte
126c0 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nts..  **.  ** T
126d0 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  he db->init.busy
126e0 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20 75   is 0 when the u
126f0 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72 73  ser first enters
12700 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20   a CREATE INDEX 
12710 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20  .  ** command.  
12720 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
12730 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61   1 when a databa
12740 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64  se is opened and
12750 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e   .  ** CREATE IN
12760 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61  DEX statements a
12770 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74  re read out of t
12780 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  he master table.
12790 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61    In.  ** the la
127a0 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e  tter case the in
127b0 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
127c0 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63  ts on disk, whic
127d0 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65  h is why.  ** we
127e0 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
127f0 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a  ecreate it..  **
12800 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d  .  ** If pTblNam
12810 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
12820 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65  is index is gene
12830 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61  rated as a prima
12840 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55  ry key.  ** or U
12850 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
12860 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42   of a CREATE TAB
12870 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
12880 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
12890 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
128a0 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
128b0 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
128c0 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
128d0 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
128e0 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
128f0 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
12900 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62  e if( db->init.b
12910 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64  usy==0 ){.    Vd
12920 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
12930 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20  *zStmt;.    int 
12940 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
12950 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 76 20 3d 20  Mem++;..    v = 
12960 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
12970 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
12980 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  v==0 ) goto exit
12990 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
129a0 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
129b0 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74  e rootpage for t
129c0 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a  he index.    */.
129d0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
129e0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
129f0 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
12a00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12a10 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74  ddOp(v, OP_Creat
12a20 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 29 3b  eIndex, iDb, 0);
12a30 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12a40 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
12a50 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a  tore, iMem, 0);.
12a60 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74  .    /* Gather t
12a70 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
12a80 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49   of the CREATE I
12a90 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69  NDEX statement i
12aa0 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a  nto.    ** the z
12ab0 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20  Stmt variable.  
12ac0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74    */.    if( pSt
12ad0 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20  art && pEnd ){. 
12ae0 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20       /* A named 
12af0 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65 78  index with an ex
12b00 70 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e  plicit CREATE IN
12b10 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  DEX statement */
12b20 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73  .      zStmt = s
12b30 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 43  qlite3MPrintf("C
12b40 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e  REATE%s INDEX %.
12b50 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45  *s",.        onE
12b60 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20  rror==OE_None ? 
12b70 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a  "" : " UNIQUE",.
12b80 20 20 20 20 20 20 20 20 70 45 6e 64 2d 3e 7a 20          pEnd->z 
12b90 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c 0a  - pName->z + 1,.
12ba0 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a          pName->z
12bb0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12bc0 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61      /* An automa
12bd0 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74 65  tic index create
12be0 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b  d by a PRIMARY K
12bf0 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  EY or UNIQUE con
12c00 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20  straint */.     
12c10 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69   /* zStmt = sqli
12c20 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20  te3MPrintf(""); 
12c30 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  */.      zStmt =
12c40 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
12c50 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69  * Add an entry i
12c60 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  n sqlite_master 
12c70 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20  for this index. 
12c80 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
12c90 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
12ca0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49  rse, .        "I
12cb0 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73  NSERT INTO %Q.%s
12cc0 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c   VALUES('index',
12cd0 25 51 2c 25 51 2c 23 30 2c 25 51 29 3b 22 2c 0a  %Q,%Q,#0,%Q);",.
12ce0 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b          db->aDb[
12cf0 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
12d00 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
12d10 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
12d20 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54  Name,.        pT
12d30 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
12d40 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a     zStmt.    );.
12d50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12d60 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
12d70 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
12d80 65 46 72 65 65 28 7a 53 74 6d 74 29 3b 0a 0a 20  eFree(zStmt);.. 
12d90 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69     /* Fill the i
12da0 6e 64 65 78 20 77 69 74 68 20 64 61 74 61 20 61  ndex with data a
12db0 6e 64 20 72 65 70 61 72 73 65 20 74 68 65 20 73  nd reparse the s
12dc0 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f  chema. Code an O
12dd0 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20  P_Expire.    ** 
12de0 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  to invalidate al
12df0 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73  l pre-compiled s
12e00 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a  tatements..    *
12e10 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61  /.    if( pTblNa
12e20 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  me ){.      sqli
12e30 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
12e40 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69  Parse, pIndex, i
12e50 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Mem);.      sqli
12e60 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
12e70 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20  db, v, iDb);.   
12e80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
12e90 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  3(v, OP_ParseSch
12ea0 65 6d 61 2c 20 69 44 62 2c 20 30 2c 0a 20 20 20  ema, iDb, 0,.   
12eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
12ec0 69 6e 74 66 28 22 6e 61 6d 65 3d 27 25 71 27 22  intf("name='%q'"
12ed0 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  , pIndex->zName)
12ee0 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P3_DYNAMIC);. 
12ef0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12f00 41 64 64 4f 70 28 76 2c 20 4f 50 5f 45 78 70 69  AddOp(v, OP_Expi
12f10 72 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  re, 0, 0);.    }
12f20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
12f30 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  adding an index 
12f40 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
12f50 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62  ndices for a tab
12f60 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75  le, make.  ** su
12f70 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c  re all indices l
12f80 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63  abeled OE_Replac
12f90 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c  e come after all
12fa0 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20   those labeled. 
12fb0 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20   ** OE_Ignore.  
12fc0 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
12fd0 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63  y for the correc
12fe0 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55  t operation of U
12ff0 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49  PDATE.  ** and I
13000 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66  NSERT..  */.  if
13010 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
13020 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29  || pTblName==0 )
13030 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f  {.    if( onErro
13040 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c  r!=OE_Replace ||
13050 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30   pTab->pIndex==0
13060 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61  .         || pTa
13070 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  b->pIndex->onErr
13080 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b  or==OE_Replace){
13090 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
130a0 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
130b0 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  dex;.      pTab-
130c0 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
130d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
130e0 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72     Index *pOther
130f0 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
13100 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f  .      while( pO
13110 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70  ther->pNext && p
13120 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e  Other->pNext->on
13130 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
13140 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74  e ){.        pOt
13150 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  her = pOther->pN
13160 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
13170 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
13180 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
13190 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e  ;.      pOther->
131a0 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a  pNext = pIndex;.
131b0 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
131c0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
131d0 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20  Clean up before 
131e0 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f  exiting */.exit_
131f0 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20  create_index:.  
13200 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
13210 20 20 66 72 65 65 49 6e 64 65 78 28 70 49 6e 64    freeIndex(pInd
13220 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ex);.  }.  sqlit
13230 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
13240 28 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  (pList);.  sqlit
13250 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
13260 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  pTblName);.  sql
13270 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
13280 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
13290 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65  ** Fill the Inde
132a0 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72  x.aiRowEst[] arr
132b0 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20  ay with default 
132c0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e  information - in
132d0 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20  formation.** to 
132e0 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20  be used when we 
132f0 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65  have not run the
13300 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64   ANALYZE command
13310 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74  ..**.** aiRowEst
13320 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 20 74  [0] is suppose t
13330 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
13340 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
13350 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a   in the index..*
13360 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f  * Since we do no
13370 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20  t know, guess 1 
13380 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45  million.  aiRowE
13390 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69  st[1] is an esti
133a0 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e  mate of the.** n
133b0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
133c0 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
133d0 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
133e0 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68  ular value of th
133f0 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d  e.** first colum
13400 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  n of the index. 
13410 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20   aiRowEst[2] is 
13420 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
13430 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
13440 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20  rows that match 
13450 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63  any particular c
13460 6f 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74  ombiniation of t
13470 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d  he first 2 colum
13480 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64  ns.** of the ind
13490 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74  ex.  And so fort
134a0 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61  h.  It must alwa
134b0 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ys be the case t
134c0 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  hat.*.**        
134d0 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d     aiRowEst[N]<=
134e0 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a  aiRowEst[N-1].**
134f0 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77             aiRow
13500 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20  Est[N]>=1.**.** 
13510 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c  Apart from that,
13520 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20   we have little 
13530 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73  to go on besides
13540 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f   intuition as to
13550 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74  .** how aiRowEst
13560 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69  [] should be ini
13570 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e  tialized.  The n
13580 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64  umbers generated
13590 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73   here.** are bas
135a0 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61  ed on typical va
135b0 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63  lues found in ac
135c0 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f  tual indices..*/
135d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
135e0 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78  aultRowEst(Index
135f0 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67   *pIdx){.  unsig
13600 6e 65 64 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61  ned *a = pIdx->a
13610 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20 69  iRowEst;.  int i
13620 3b 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d 30  ;.  assert( a!=0
13630 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 31 30 30   );.  a[0] = 100
13640 30 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d 70 49  0000;.  for(i=pI
13650 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d  dx->nColumn; i>=
13660 31 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 61 5b 69  1; i--){.    a[i
13670 5d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 69 66  ] = 10;.  }.  if
13680 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
13690 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20  =OE_None ){.    
136a0 61 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d  a[pIdx->nColumn]
136b0 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
136c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
136d0 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69  will drop an exi
136e0 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65  sting named inde
136f0 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  x.  This routine
13700 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  .** implements t
13710 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74  he DROP INDEX st
13720 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
13730 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65   sqlite3DropInde
13740 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
13750 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 29   SrcList *pName)
13760 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
13770 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  x;.  Vdbe *v;.  
13780 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
13790 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
137a0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
137b0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
137c0 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  failed ){.    go
137d0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
137e0 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ex;.  }.  assert
137f0 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
13800 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   );.  if( SQLITE
13810 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
13820 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
13830 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
13840 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
13850 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
13860 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
13870 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
13880 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
13890 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
138a0 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20   pIndex==0 ){.  
138b0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
138c0 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
138d0 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70  ch index: %S", p
138e0 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50  Name, 0);.    pP
138f0 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
13900 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  a = 1;.    goto 
13910 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
13920 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
13930 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a  x->autoIndex ){.
13940 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13950 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
13960 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
13970 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20  th UNIQUE ".    
13980 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45    "or PRIMARY KE
13990 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Y constraint can
139a0 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
139b0 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78   0);.    goto ex
139c0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
139d0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
139e0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
139f0 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
13a00 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
13a10 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54  ROP_INDEX;.    T
13a20 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
13a30 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  dex->pTable;.   
13a40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
13a50 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65   = db->aDb[pInde
13a60 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  x->iDb].zName;. 
13a70 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
13a80 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
13a90 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b  LE(pIndex->iDb);
13aa0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13ab0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
13ac0 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
13ad0 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29   zTab, 0, zDb) )
13ae0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
13af0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
13b00 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49    }.    if( !OMI
13b10 54 5f 54 45 4d 50 44 42 20 26 26 20 70 49 6e 64  T_TEMPDB && pInd
13b20 65 78 2d 3e 69 44 62 20 29 20 63 6f 64 65 20 3d  ex->iDb ) code =
13b30 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
13b40 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
13b50 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
13b60 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
13b70 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70  pIndex->zName, p
13b80 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
13b90 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
13ba0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
13bb0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
13bc0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
13bd0 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
13be0 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f  he index and fro
13bf0 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
13c00 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  le */.  v = sqli
13c10 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
13c20 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
13c30 20 20 20 69 6e 74 20 69 44 62 20 3d 20 70 49 6e     int iDb = pIn
13c40 64 65 78 2d 3e 69 44 62 3b 0a 20 20 20 20 73 71  dex->iDb;.    sq
13c50 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
13c60 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
13c70 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
13c80 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  %s WHERE name=%Q
13c90 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ",.       db->aD
13ca0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
13cb0 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
13cc0 0a 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  .       pIndex->
13cd0 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20  zName.    );.   
13ce0 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
13cf0 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29  okie(db, v, iDb)
13d00 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  ;.    destroyRoo
13d10 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
13d20 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  ndex->tnum, iDb)
13d30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13d40 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 49  eOp3(v, OP_DropI
13d50 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 70 49  ndex, iDb, 0, pI
13d60 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
13d70 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  .  }..exit_drop_
13d80 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33  index:.  sqlite3
13d90 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e  SrcListDelete(pN
13da0 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  ame);.}../*.** p
13db0 70 41 72 72 61 79 20 70 6f 69 6e 74 73 20 69 6e  pArray points in
13dc0 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 77  to a structure w
13dd0 68 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e  here there is an
13de0 20 61 72 72 61 79 20 70 6f 69 6e 74 65 72 0a 2a   array pointer.*
13df0 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 77  * followed by tw
13e00 6f 20 69 6e 74 65 67 65 72 73 2e 20 54 68 65 20  o integers. The 
13e10 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 69 73  first integer is
13e20 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
13e30 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
13e40 65 20 73 74 72 75 63 74 75 72 65 20 61 72 72 61  e structure arra
13e50 79 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 69  y.  The second i
13e60 6e 74 65 67 65 72 0a 2a 2a 20 69 73 20 74 68 65  nteger.** is the
13e70 20 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 63   number of alloc
13e80 61 74 65 64 20 73 6c 6f 74 73 20 69 6e 20 74 68  ated slots in th
13e90 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  e array..**.** I
13ea0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
13eb0 68 65 20 73 74 72 75 63 74 75 72 65 20 6c 6f 6f  he structure loo
13ec0 6b 73 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b  ks something lik
13ed0 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
13ee0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 61 6d       struct Exam
13ef0 70 6c 65 31 20 7b 0a 2a 2a 20 20 20 20 20 20 20  ple1 {.**       
13f00 20 20 20 73 74 72 75 63 74 20 73 75 62 45 6c 65     struct subEle
13f10 6d 20 2a 61 45 6e 74 72 79 3b 0a 2a 2a 20 20 20  m *aEntry;.**   
13f20 20 20 20 20 20 20 20 69 6e 74 20 6e 45 6e 74 72         int nEntr
13f30 79 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  y;.**          i
13f40 6e 74 20 6e 41 6c 6c 6f 63 3b 0a 2a 2a 20 20 20  nt nAlloc;.**   
13f50 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65       }.**.** The
13f60 20 70 6e 45 6e 74 72 79 20 70 61 72 61 6d 65 74   pnEntry paramet
13f70 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  er points to the
13f80 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 45   equivalent of E
13f90 78 61 6d 70 6c 65 31 2e 6e 45 6e 74 72 79 2e 0a  xample1.nEntry..
13fa0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
13fb0 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e  ne allocates a n
13fc0 65 77 20 73 6c 6f 74 20 69 6e 20 74 68 65 20 61  ew slot in the a
13fd0 72 72 61 79 2c 20 7a 65 72 6f 73 20 69 74 20 6f  rray, zeros it o
13fe0 75 74 2c 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  ut,.** and retur
13ff0 6e 73 20 69 74 73 20 69 6e 64 65 78 2e 20 20 49  ns its index.  I
14000 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 61  f malloc fails a
14010 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
14020 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
14030 0a 2a 2a 20 73 7a 45 6e 74 72 79 20 69 73 20 74  .** szEntry is t
14040 68 65 20 73 69 7a 65 6f 66 20 6f 66 20 61 20 73  he sizeof of a s
14050 69 6e 67 6c 65 20 61 72 72 61 79 20 65 6e 74 72  ingle array entr
14060 79 2e 20 20 69 6e 69 74 53 69 7a 65 20 69 73 20  y.  initSize is 
14070 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f  the .** number o
14080 66 20 61 72 72 61 79 20 65 6e 74 72 69 65 73 20  f array entries 
14090 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  allocated on the
140a0 20 69 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61 74   initial allocat
140b0 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
140c0 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
140d0 28 76 6f 69 64 20 2a 2a 70 70 41 72 72 61 79 2c  (void **ppArray,
140e0 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 69 6e   int szEntry, in
140f0 74 20 69 6e 69 74 53 69 7a 65 29 7b 0a 20 20 63  t initSize){.  c
14100 68 61 72 20 2a 70 3b 0a 20 20 69 6e 74 20 2a 61  har *p;.  int *a
14110 6e 20 3d 20 28 69 6e 74 2a 29 26 70 70 41 72 72  n = (int*)&ppArr
14120 61 79 5b 31 5d 3b 0a 20 20 69 66 28 20 61 6e 5b  ay[1];.  if( an[
14130 30 5d 3e 3d 61 6e 5b 31 5d 20 29 7b 0a 20 20 20  0]>=an[1] ){.   
14140 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20 20   void *pNew;.   
14150 20 69 6e 74 20 6e 65 77 53 69 7a 65 3b 0a 20 20   int newSize;.  
14160 20 20 6e 65 77 53 69 7a 65 20 3d 20 61 6e 5b 31    newSize = an[1
14170 5d 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a  ]*2 + initSize;.
14180 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
14190 65 52 65 61 6c 6c 6f 63 28 2a 70 70 41 72 72 61  eRealloc(*ppArra
141a0 79 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e 74  y, newSize*szEnt
141b0 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ry);.    if( pNe
141c0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  w==0 ){.      re
141d0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
141e0 20 20 20 61 6e 5b 31 5d 20 3d 20 6e 65 77 53 69     an[1] = newSi
141f0 7a 65 3b 0a 20 20 20 20 2a 70 70 41 72 72 61 79  ze;.    *ppArray
14200 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = pNew;.  }.  p
14210 20 3d 20 2a 70 70 41 72 72 61 79 3b 0a 20 20 6d   = *ppArray;.  m
14220 65 6d 73 65 74 28 26 70 5b 61 6e 5b 30 5d 2a 73  emset(&p[an[0]*s
14230 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e  zEntry], 0, szEn
14240 74 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  try);.  return a
14250 6e 5b 30 5d 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n[0]++;.}../*.**
14260 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
14270 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
14280 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
14290 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
142a0 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
142b0 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
142c0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
142d0 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
142e0 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
142f0 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
14300 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20  stAppend(IdList 
14310 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
14320 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  Token){.  int i;
14330 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
14340 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
14350 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
14360 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
14370 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
14380 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
14390 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
143a0 30 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 73 71 6c  0;.  }.  i = sql
143b0 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
143c0 65 28 28 76 6f 69 64 2a 2a 29 26 70 4c 69 73 74  e((void**)&pList
143d0 2d 3e 61 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  ->a, sizeof(pLis
143e0 74 2d 3e 61 5b 30 5d 29 2c 20 35 29 3b 0a 20 20  t->a[0]), 5);.  
143f0 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73  if( i<0 ){.    s
14400 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
14410 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  te(pList);.    r
14420 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
14430 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
14440 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
14450 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b  omToken(pToken);
14460 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
14470 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
14480 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76   an IdList..*/.v
14490 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73  oid sqlite3IdLis
144a0 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a  tDelete(IdList *
144b0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
144c0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
144d0 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
144e0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
144f0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  d; i++){.    sql
14500 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
14510 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
14520 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
14530 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
14540 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
14550 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
14560 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20   index in pList 
14570 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  of the identifie
14580 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65  r named zId.  Re
14590 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f  turn -1.** if no
145a0 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  t found..*/.int 
145b0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
145c0 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  ex(IdList *pList
145d0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
145e0 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ame){.  int i;. 
145f0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
14600 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72  return -1;.  for
14610 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
14620 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Id; i++){.    if
14630 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
14640 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
14650 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  me, zName)==0 ) 
14660 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
14670 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
14680 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
14690 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
146a0 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
146b0 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
146c0 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65  SrcList if.** ne
146d0 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e  ed be.  A new en
146e0 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69  try is created i
146f0 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76  n the SrcList ev
14700 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20  en if pToken is 
14710 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  NULL..**.** A ne
14720 77 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74  w SrcList is ret
14730 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
14740 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
14750 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61  ..**.** If pData
14760 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  base is not null
14770 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
14780 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
14790 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74   optional.** dat
147a0 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69  abase name prefi
147b0 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20  x.  Like this:  
147c0 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22  "database.table"
147d0 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65  .  The pDatabase
147e0 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
147f0 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
14800 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e   the pTable poin
14810 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ts to the databa
14820 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20  se name..** The 
14830 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d  SrcList.a[].zNam
14840 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65  e field is fille
14850 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
14860 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68   name which migh
14870 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70  t.** come from p
14880 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62  Table (if pDatab
14890 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20  ase is NULL) or 
148a0 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20  from pDatabase. 
148b0 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d   .** SrcList.a[]
148c0 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69  .zDatabase is fi
148d0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
148e0 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d  tabase name from
148f0 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77   pTable,.** or w
14900 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64  ith NULL if no d
14910 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69  atabase is speci
14920 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  fied..**.** In o
14930 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63  ther words, if c
14940 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  all like this:.*
14950 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
14960 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
14970 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20  d(A,B,0);.**.** 
14980 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c  Then B is a tabl
14990 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  e name and the d
149a0 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
149b0 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66  unspecified.  If
149c0 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20   called.** like 
149d0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
149e0 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
149f0 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b  stAppend(A,B,C);
14a00 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73  .**.** Then C is
14a10 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
14a20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74  and B is the dat
14a30 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53  abase name..*/.S
14a40 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
14a50 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63  rcListAppend(Src
14a60 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
14a70 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65  en *pTable, Toke
14a80 6e 20 2a 70 44 61 74 61 62 61 73 65 29 7b 0a 20  n *pDatabase){. 
14a90 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
14aa0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
14ab0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
14ac0 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
14ad0 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
14ae0 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  SrcList) );.    
14af0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
14b00 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69  eturn 0;.    pLi
14b10 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a  st->nAlloc = 1;.
14b20 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
14b30 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41  >nSrc>=pList->nA
14b40 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c  lloc ){.    SrcL
14b50 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70  ist *pNew;.    p
14b60 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20  List->nAlloc *= 
14b70 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  2;.    pNew = sq
14b80 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73  liteRealloc(pLis
14b90 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
14ba0 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29    sizeof(*pList)
14bb0 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f   + (pList->nAllo
14bc0 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73  c-1)*sizeof(pLis
14bd0 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20  t->a[0]) );.    
14be0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
14bf0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
14c00 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
14c10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
14c20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
14c30 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  t = pNew;.  }.  
14c40 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
14c50 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a  a[pList->nSrc];.
14c60 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20    memset(pItem, 
14c70 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  0, sizeof(pList-
14c80 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70  >a[0]));.  if( p
14c90 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74  Database && pDat
14ca0 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  abase->z==0 ){. 
14cb0 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30     pDatabase = 0
14cc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74  ;.  }.  if( pDat
14cd0 61 62 61 73 65 20 26 26 20 70 54 61 62 6c 65 20  abase && pTable 
14ce0 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  ){.    Token *pT
14cf0 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b  emp = pDatabase;
14d00 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
14d10 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61   pTable;.    pTa
14d20 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d  ble = pTemp;.  }
14d30 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  .  pItem->zName 
14d40 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
14d50 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 29 3b 0a  mToken(pTable);.
14d60 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61    pItem->zDataba
14d70 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  se = sqlite3Name
14d80 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 61 74 61 62  FromToken(pDatab
14d90 61 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 69  ase);.  pItem->i
14da0 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70  Cursor = -1;.  p
14db0 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20  List->nSrc++;.  
14dc0 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
14dd0 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75  ./*.** Assign cu
14de0 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62  rsors to all tab
14df0 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74  les in a SrcList
14e00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14e10 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
14e20 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  sors(Parse *pPar
14e30 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  se, SrcList *pLi
14e40 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
14e50 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
14e60 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66 6f  tem *pItem;.  fo
14e70 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(i=0, pItem=pLi
14e80 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
14e90 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
14ea0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  ++){.    if( pIt
14eb0 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29  em->iCursor>=0 )
14ec0 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 74 65   break;.    pIte
14ed0 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61  m->iCursor = pPa
14ee0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
14ef0 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
14f00 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
14f10 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
14f20 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
14f30 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d   pItem->pSelect-
14f40 3e 70 53 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  >pSrc);.    }.  
14f50 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
14f60 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c  n alias to the l
14f70 61 73 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f  ast identifier o
14f80 6e 20 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e  n the given iden
14f90 74 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a  tifier list..*/.
14fa0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
14fb0 69 73 74 41 64 64 41 6c 69 61 73 28 53 72 63 4c  istAddAlias(SrcL
14fc0 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
14fd0 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
14fe0 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74  ( pList && pList
14ff0 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ->nSrc>0 ){.    
15000 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
15010 6e 53 72 63 2d 31 5d 2e 7a 41 6c 69 61 73 20 3d  nSrc-1].zAlias =
15020 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
15030 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20  Token(pToken);. 
15040 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
15050 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63  te an entire Src
15060 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61  List including a
15070 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74  ll its substruct
15080 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ure..*/.void sql
15090 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
150a0 65 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  e(SrcList *pList
150b0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
150c0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
150d0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
150e0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
150f0 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  n;.  for(pItem=p
15100 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
15110 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
15120 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
15130 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d  sqliteFree(pItem
15140 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
15150 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74    sqliteFree(pIt
15160 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
15170 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d  sqliteFree(pItem
15180 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 73  ->zAlias);.    s
15190 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
151a0 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  e(0, pItem->pTab
151b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
151c0 6c 65 63 74 44 65 6c 65 74 65 28 70 49 74 65 6d  lectDelete(pItem
151d0 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
151e0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
151f0 65 28 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20  e(pItem->pOn);. 
15200 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
15210 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 55  Delete(pItem->pU
15220 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sing);.  }.  sql
15230 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a  iteFree(pList);.
15240 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
15250 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
15260 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
15270 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  nTransaction(Par
15280 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
15290 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  type){.  sqlite3
152a0 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
152b0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
152c0 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
152d0 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
152e0 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
152f0 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
15300 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
15310 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
15320 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
15330 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
15340 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
15350 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
15360 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22  SACTION, "BEGIN"
15370 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
15380 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
15390 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
153a0 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75  .  if( !v ) retu
153b0 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d  rn;.  if( type!=
153c0 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20  TK_DEFERRED ){. 
153d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
153e0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
153f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15400 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  dOp(v, OP_Transa
15410 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d  ction, i, (type=
15420 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31  =TK_EXCLUSIVE)+1
15430 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
15440 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
15450 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
15460 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 0, 0);.}../*.*
15470 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73  * Commit a trans
15480 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
15490 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e  qlite3CommitTran
154a0 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
154b0 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
154c0 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
154d0 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
154e0 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
154f0 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
15500 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
15510 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
15520 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
15530 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
15540 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
15550 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
15560 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
15570 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
15580 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29   "COMMIT", 0, 0)
15590 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20   ) return;..  v 
155a0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
155b0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
155c0 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
155d0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
155e0 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30  AutoCommit, 1, 0
155f0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
15600 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  Rollback a trans
15610 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
15620 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72  qlite3RollbackTr
15630 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
15640 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
15650 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
15660 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  *v;..  if( pPars
15670 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
15680 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
15690 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
156a0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
156b0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
156c0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
156d0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
156e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
156f0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
15700 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
15710 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30  N, "ROLLBACK", 0
15720 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  , 0) ) return;..
15730 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
15740 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
15750 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
15760 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
15770 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
15780 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1, 1);.  }.}../*
15790 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
157a0 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
157b0 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69  is open and avai
157c0 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20  lable for use.  
157d0 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  Return.** the nu
157e0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
157f0 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
15800 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65   messages in the
15810 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
15820 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
15830 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
15840 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a  Database(Parse *
15850 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
15860 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
15870 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61  >db;.  if( db->a
15880 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20  Db[1].pBt==0 && 
15890 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
158a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
158b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 63   sqlite3BtreeFac
158c0 74 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20 4d  tory(db, 0, 0, M
158d0 41 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 61  AX_PAGES, &db->a
158e0 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[1].pBt);.    
158f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15900 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
15910 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15920 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  e, "unable to op
15930 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64  en a temporary d
15940 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20  atabase ".      
15950 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72    "file for stor
15960 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
15970 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50  bles");.      pP
15980 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
15990 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
159a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
159b0 3e 66 6c 61 67 73 20 26 20 21 64 62 2d 3e 61 75  >flags & !db->au
159c0 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
159d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
159e0 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62  reeBeginTrans(db
159f0 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 2c 20 31 29  ->aDb[1].pBt, 1)
15a00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
15a10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15a20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
15a30 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
15a40 61 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72  able to get a wr
15a50 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20  ite lock on ".  
15a60 20 20 20 20 20 20 20 20 22 74 68 65 20 74 65 6d          "the tem
15a70 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
15a80 66 69 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20  file");.        
15a90 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b  pParse->rc = rc;
15aa0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
15ab0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
15ac0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
15ad0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
15ae0 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
15af0 74 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68  t will verify th
15b00 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
15b10 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72  and start.** a r
15b20 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
15b30 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61  for all named da
15b40 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a  tabase files..**
15b50 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74  .** It is import
15b60 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68  ant that all sch
15b70 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76  ema cookies be v
15b80 65 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a  erified and all.
15b90 2a 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63 74  ** read transact
15ba0 69 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64 20  ions be started 
15bb0 62 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20  before anything 
15bc0 65 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a  else happens in.
15bd0 2a 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f 67  ** the VDBE prog
15be0 72 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72  ram.  But this r
15bf0 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61  outine can be ca
15c00 6c 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68 20  lled after much 
15c10 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61  other.** code ha
15c20 73 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64  s been generated
15c30 2e 20 20 53 6f 20 68 65 72 65 20 69 73 20 77 68  .  So here is wh
15c40 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20  at we do:.**.** 
15c50 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
15c60 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
15c70 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61  alled, we code a
15c80 6e 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a  n OP_Goto that.*
15c90 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61  * will jump to a
15ca0 20 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74   subroutine at t
15cb0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72  he end of the pr
15cc0 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a  ogram.  Then we.
15cd0 2a 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79 20  ** record every 
15ce0 64 61 74 61 62 61 73 65 20 74 68 61 74 20 6e 65  database that ne
15cf0 65 64 73 20 69 74 73 20 73 63 68 65 6d 61 20 76  eds its schema v
15d00 65 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  erified in the.*
15d10 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  * pParse->cookie
15d20 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74  Mask field.  Lat
15d30 65 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74  er, after all ot
15d40 68 65 72 20 63 6f 64 65 20 68 61 73 20 62 65 65  her code has bee
15d50 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20  n.** generated, 
15d60 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  the subroutine t
15d70 68 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f  hat does the coo
15d80 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  kie verification
15d90 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20  s and.** starts 
15da0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  the transactions
15db0 20 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61   will be coded a
15dc0 6e 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50  nd the OP_Goto P
15dd0 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  2 value.** will 
15de0 62 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74  be made to point
15df0 20 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74   to that subrout
15e00 69 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61  ine.  The genera
15e10 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63  tion of the.** c
15e20 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69  ookie verificati
15e30 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f  on subroutine co
15e40 64 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71  de happens in sq
15e50 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
15e60 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44  g()..**.** If iD
15e70 62 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68  b<0 then code th
15e80 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d  e OP_Goto only -
15e90 20 64 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20   don't set flag 
15ea0 74 6f 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a  to verify the.**
15eb0 20 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64   schema on any d
15ec0 61 74 61 62 61 73 65 73 2e 20 20 54 68 69 73 20  atabases.  This 
15ed0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70  can be used to p
15ee0 6f 73 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47  osition the OP_G
15ef0 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20  oto.** early in 
15f00 74 68 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65  the code, before
15f10 20 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20   we know if any 
15f20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 73 20  database tables 
15f30 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f  will be used..*/
15f40 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
15f50 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61  eVerifySchema(Pa
15f60 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
15f70 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33   iDb){.  sqlite3
15f80 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
15f90 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20  .  int mask;..  
15fa0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
15fb0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
15fc0 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
15fd0 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68    /* This only h
15fe0 61 70 70 65 6e 73 20 69 66 20 74 68 65 72 65 20  appens if there 
15ff0 77 61 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f  was a prior erro
16000 72 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  r */.  db = pPar
16010 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50  se->db;.  if( pP
16020 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
16030 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ==0 ){.    pPars
16040 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20  e->cookieGoto = 
16050 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16060 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
16070 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  0)+1;.  }.  if( 
16080 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73  iDb>=0 ){.    as
16090 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44  sert( iDb<db->nD
160a0 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b );.    assert(
160b0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
160c0 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29  t!=0 || iDb==1 )
160d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  ;.    assert( iD
160e0 62 3c 33 32 20 29 3b 0a 20 20 20 20 6d 61 73 6b  b<32 );.    mask
160f0 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 20 20 69   = 1<<iDb;.    i
16100 66 28 20 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  f( (pParse->cook
16110 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  ieMask & mask)==
16120 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  0 ){.      pPars
16130 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d  e->cookieMask |=
16140 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 50 61   mask;.      pPa
16150 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65  rse->cookieValue
16160 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  [iDb] = db->aDb[
16170 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b  iDb].schema_cook
16180 69 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  ie;.      if( !O
16190 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
161a0 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
161b0 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
161c0 61 74 61 62 61 73 65 28 70 50 61 72 73 65 29 3b  atabase(pParse);
161d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
161e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
161f0 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
16200 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72  hat prepares for
16210 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74   doing an operat
16220 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  ion that.** migh
16230 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74  t change the dat
16240 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abase..**.** Thi
16250 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
16260 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
16270 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  on if we are not
16280 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a   already within.
16290 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
162a0 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72  .  If we are alr
162b0 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72  eady within a tr
162c0 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
162d0 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  a checkpoint.** 
162e0 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65  is set if the se
162f0 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d  tStatement param
16300 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41  eter is true.  A
16310 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
16320 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72  ld.** be set for
16330 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74   operations that
16340 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65   might fail (due
16350 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   to a constraint
16360 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  ) part of.** the
16370 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64   way through and
16380 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64   which will need
16390 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72   to undo some wr
163a0 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76  ites without hav
163b0 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61  ing to.** rollba
163c0 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  ck the whole tra
163d0 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f  nsaction.  For o
163e0 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20  perations where 
163f0 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
16400 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65  ** can be checke
16410 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  d before any cha
16420 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
16430 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
16440 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65  t is never.** ne
16450 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
16460 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20  a write and the 
16470 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
16480 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a  d not be set..**
16490 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73  .** Only databas
164a0 65 20 69 44 62 20 61 6e 64 20 74 68 65 20 74 65  e iDb and the te
164b0 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20  mp database are 
164c0 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 62 79  made writable by
164d0 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49   this call..** I
164e0 66 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74  f iDb==0, then t
164f0 68 65 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70  he main and temp
16500 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 6d   databases are m
16510 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20  ade writable.   
16520 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65  If.** iDb==1 the
16530 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20  n only the temp 
16540 64 61 74 61 62 61 73 65 20 69 73 20 6d 61 64 65  database is made
16550 20 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69   writable.  If i
16560 44 62 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a  Db>1 then the.**
16570 20 73 70 65 63 69 66 69 65 64 20 61 75 78 69 6c   specified auxil
16580 69 61 72 79 20 64 61 74 61 62 61 73 65 20 61 6e  iary database an
16590 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  d the temp datab
165a0 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69  ase are made wri
165b0 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
165c0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
165d0 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
165e0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74  *pParse, int set
165f0 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69  Statement, int i
16600 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
16610 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
16620 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
16630 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
16640 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
16650 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
16660 69 44 62 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  iDb);.  pParse->
16670 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c  writeMask |= 1<<
16680 69 44 62 3b 0a 20 20 69 66 28 20 73 65 74 53 74  iDb;.  if( setSt
16690 61 74 65 6d 65 6e 74 20 26 26 20 70 50 61 72 73  atement && pPars
166a0 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a  e->nested==0 ){.
166b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
166c0 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74 65  ddOp(v, OP_State
166d0 6d 65 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20  ment, iDb, 0);. 
166e0 20 7d 0a 20 20 69 66 28 20 28 4f 4d 49 54 5f 54   }.  if( (OMIT_T
166f0 45 4d 50 44 42 20 7c 7c 20 69 44 62 21 3d 31 29  EMPDB || iDb!=1)
16700 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   && pParse->db->
16710 61 44 62 5b 31 5d 2e 70 42 74 21 3d 30 20 29 7b  aDb[1].pBt!=0 ){
16720 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
16730 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
16740 70 50 61 72 73 65 2c 20 73 65 74 53 74 61 74 65  pParse, setState
16750 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a  ment, 1);.  }.}.
16760 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
16770 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73  see if pIndex us
16780 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  es the collating
16790 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
167a0 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
167b0 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
167c0 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73  false if it does
167d0 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   not..*/.#ifndef
167e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
167f0 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20  NDEX.static int 
16800 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 43  collationMatch(C
16810 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 20 49  ollSeq *pColl, I
16820 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20  ndex *pIndex){. 
16830 20 69 6e 74 20 6e 20 3d 20 70 49 6e 64 65 78 2d   int n = pIndex-
16840 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 3b  >keyInfo.nField;
16850 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 70 70 20  .  CollSeq **pp 
16860 3d 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  = pIndex->keyInf
16870 6f 2e 61 43 6f 6c 6c 3b 0a 20 20 77 68 69 6c 65  o.aColl;.  while
16880 28 20 6e 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28  ( n-- ){.    if(
16890 20 2a 70 70 3d 3d 70 43 6f 6c 6c 20 29 20 72 65   *pp==pColl ) re
168a0 74 75 72 6e 20 31 3b 0a 20 20 20 20 70 70 2b 2b  turn 1;.    pp++
168b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
168c0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
168d0 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  * Recompute all 
168e0 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20  indices of pTab 
168f0 74 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c  that use the col
16900 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
16910 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f  pColl..** If pCo
16920 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d  ll==0 then recom
16930 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
16940 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66   of pTab..*/.#if
16950 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16960 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
16970 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c  void reindexTabl
16980 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
16990 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f   Table *pTab, Co
169a0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
169b0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
169c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
169d0 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
169e0 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
169f0 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70  ..  for(pIndex=p
16a00 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  Tab->pIndex; pIn
16a10 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64  dex; pIndex=pInd
16a20 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ex->pNext){.    
16a30 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 7c 7c 20  if( pColl==0 || 
16a40 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 70  collationMatch(p
16a50 43 6f 6c 6c 2c 70 49 6e 64 65 78 29 20 29 7b 0a  Coll,pIndex) ){.
16a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
16a70 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
16a80 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 61 62  (pParse, 0, pTab
16a90 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  ->iDb);.      sq
16aa0 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
16ab0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
16ac0 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   -1);.    }.  }.
16ad0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
16ae0 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
16af0 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62  dices of all tab
16b00 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  les in all datab
16b10 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a  ases where the.*
16b20 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68  * indices use th
16b30 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
16b40 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20  ence pColl.  If 
16b50 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
16b60 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69  compute.** all i
16b70 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72  ndices everywher
16b80 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
16b90 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
16ba0 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  X.static void re
16bb0 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50  indexDatabases(P
16bc0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f  arse *pParse, Co
16bd0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
16be0 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
16bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16c00 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  A single databas
16c10 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
16c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c30 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
16c40 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
16c50 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
16c60 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
16c70 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
16c80 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
16c90 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20   HashElem *k;   
16ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16cb0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
16cc0 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a   tables in pDb *
16cd0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
16ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cf0 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
16d00 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20  e database */.. 
16d10 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d   for(iDb=0, pDb=
16d20 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d  db->aDb; iDb<db-
16d30 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62  >nDb; iDb++, pDb
16d40 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 44 62  ++){.    if( pDb
16d50 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
16d60 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65      for(k=sqlite
16d70 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
16d80 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d  tblHash);  k; k=
16d90 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b  sqliteHashNext(k
16da0 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d  )){.      pTab =
16db0 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48   (Table*)sqliteH
16dc0 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20  ashData(k);.    
16dd0 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70    reindexTable(p
16de0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 43 6f  Parse, pTab, pCo
16df0 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ll);.    }.  }.}
16e00 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
16e10 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
16e20 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d   the REINDEX com
16e30 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mand..**.**     
16e40 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20     REINDEX      
16e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e60 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20        -- 1.**   
16e70 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63       REINDEX  <c
16e80 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20  ollation>       
16e90 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20          -- 2.** 
16ea0 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
16eb0 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61  ?<database>.?<ta
16ec0 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a  blename>  -- 3.*
16ed0 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
16ee0 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
16ef0 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34  indexname>  -- 4
16f00 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61  .**.** Form 1 ca
16f10 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  uses all indices
16f20 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64   in all attached
16f30 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65   databases to be
16f40 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72   rebuilt..** For
16f50 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c  m 2 rebuilds all
16f60 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
16f70 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75  databases that u
16f80 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20  se the named.** 
16f90 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
16fa0 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64  on.  Forms 3 and
16fb0 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e   4 rebuild the n
16fc0 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c  amed index or al
16fd0 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73  l.** indices ass
16fe0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
16ff0 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f   named table..*/
17000 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17010 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69  OMIT_REINDEX.voi
17020 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78  d sqlite3Reindex
17030 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
17040 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54  Token *pName1, T
17050 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20  oken *pName2){. 
17060 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17080 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
17090 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ce to be reindex
170a0 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ed, or NULL */. 
170b0 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
170c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
170d0 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20  Name of a table 
170e0 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f  or index */.  co
170f0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  nst char *zDb;  
17100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
17110 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
17120 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
17130 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
17140 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e     /* A table in
17150 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
17160 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
17170 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
17180 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
17190 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
171a0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
171b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171c0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
171d0 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
171e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
171f0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
17200 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
17210 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  onnection */.  T
17220 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20  oken *pObjName; 
17230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
17240 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
17250 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72  or index to be r
17260 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f  eindexed */..  /
17270 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
17280 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
17290 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
172a0 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
172b0 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
172c0 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
172d0 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
172e0 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
172f0 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
17300 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
17310 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
17320 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d  ..  if( pName1==
17330 30 20 7c 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d  0 || pName1->z==
17340 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78  0 ){.    reindex
17350 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65  Databases(pParse
17360 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
17370 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e  ;.  }else if( pN
17380 61 6d 65 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65  ame2==0 || pName
17390 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70  2->z==0 ){.    p
173a0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
173b0 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 64 62  ndCollSeq(db, db
173c0 2d 3e 65 6e 63 2c 20 70 4e 61 6d 65 31 2d 3e 7a  ->enc, pName1->z
173d0 2c 20 70 4e 61 6d 65 31 2d 3e 6e 2c 20 30 29 3b  , pName1->n, 0);
173e0 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
173f0 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 44  {.      reindexD
17400 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
17410 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72   pColl);.      r
17420 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
17430 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
17440 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
17450 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
17460 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a  e2, &pObjName);.
17470 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
17480 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  turn;.  z = sqli
17490 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
174a0 28 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 7a 44  (pObjName);.  zD
174b0 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
174c0 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d  .zName;.  pTab =
174d0 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
174e0 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  e(db, z, zDb);. 
174f0 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
17500 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
17510 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a  arse, pTab, 0);.
17520 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
17530 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
17540 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
17550 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
17560 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71  b, z, zDb);.  sq
17570 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 69  liteFree(z);.  i
17580 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
17590 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
175a0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
175b0 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
175c0 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
175d0 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
175e0 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  ex, -1);.    ret
175f0 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
17600 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
17610 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64  e, "unable to id
17620 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63  entify the objec
17630 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  t to be reindexe
17640 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a        d");.}.#endif.