/ Hex Artifact Content
Login

Artifact a9dc62b900e83d70ff4a065e760064ded379c5bf:


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 32 20 32 30 30 35 2f 31 31 2f 30 31  1.352 2005/11/01
02f0: 20 31 35 3a 34 38 3a 32 34 20 64 72 68 20 45 78   15:48:24 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 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
37f0: 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  able);.}../*.** 
3800: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
3810: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
3820: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
3830: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
3840: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
3850: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
3860: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
3870: 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64  gn keys..*/.void
3880: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
3890: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
38a0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
38b0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
38c0: 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c  TabName){.  Tabl
38d0: 65 20 2a 70 3b 0a 20 20 46 4b 65 79 20 2a 70 46  e *p;.  FKey *pF
38e0: 31 2c 20 2a 70 46 32 3b 0a 20 20 44 62 20 2a 70  1, *pF2;.  Db *p
38f0: 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64  Db;..  assert( d
3900: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
3910: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
3920: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
3930: 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 26 26  ert( zTabName &&
3940: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a   zTabName[0] );.
3950: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
3960: 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c  [iDb];.  p = sql
3970: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
3980: 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54  pDb->tblHash, zT
3990: 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a  abName, strlen(z
39a0: 54 61 62 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a  TabName)+1, 0);.
39b0: 20 20 69 66 28 20 70 20 29 7b 0a 23 69 66 6e 64    if( p ){.#ifnd
39c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
39d0: 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 66  OREIGN_KEY.    f
39e0: 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b  or(pF1=p->pFKey;
39f0: 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70   pF1; pF1=pF1->p
3a00: 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20  NextFrom){.     
3a10: 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65   int nTo = strle
3a20: 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b  n(pF1->zTo) + 1;
3a30: 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73 71 6c  .      pF2 = sql
3a40: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 44  ite3HashFind(&pD
3a50: 62 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a  b->aFKey, pF1->z
3a60: 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20  To, nTo);.      
3a70: 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a  if( pF2==pF1 ){.
3a80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
3a90: 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e  ashInsert(&pDb->
3aa0: 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c  aFKey, pF1->zTo,
3ab0: 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74   nTo, pF1->pNext
3ac0: 54 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  To);.      }else
3ad0: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
3ae0: 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70 4e 65   pF2 && pF2->pNe
3af0: 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70 46 32  xtTo!=pF1 ){ pF2
3b00: 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d  =pF2->pNextTo; }
3b10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 32  .        if( pF2
3b20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
3b30: 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 46 31  2->pNextTo = pF1
3b40: 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 20  ->pNextTo;.     
3b50: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3b60: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71   }.#endif.    sq
3b70: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
3b80: 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 20 20 64  (db, p);.  }.  d
3b90: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
3ba0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
3bb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
3bc0: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
3bd0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
3be0: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
3bf0: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
3c00: 6f 6b 65 6e 20 77 69 74 68 20 61 6e 79 20 71 75  oken with any qu
3c10: 6f 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76 65 64  otations removed
3c20: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
3c30: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
3c40: 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69  ring.** is obtai
3c50: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
3c60: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
3c70: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
3c80: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
3c90: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65  tion..**.** Toke
3ca0: 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73  ns are often jus
3cb0: 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20  t pointers into 
3cc0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
3cd0: 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20   text and so.** 
3ce0: 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72  are not \000 ter
3cf0: 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20  minated and are 
3d00: 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20  not persistent. 
3d10: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   The returned st
3d20: 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20  ring.** is \000 
3d30: 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69  terminated and i
3d40: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f  s persistent..*/
3d50: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61  .char *sqlite3Na
3d60: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65  meFromToken(Toke
3d70: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61  n *pName){.  cha
3d80: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20  r *zName;.  if( 
3d90: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  pName ){.    zNa
3da0: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  me = sqliteStrND
3db0: 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  up(pName->z, pNa
3dc0: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69  me->n);.    sqli
3dd0: 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  te3Dequote(zName
3de0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3df0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  zName = 0;.  }. 
3e00: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
3e10: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
3e20: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
3e30: 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64  able stored in d
3e40: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69  atabase number i
3e50: 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  Db for.** writin
3e60: 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  g. The table is 
3e70: 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72  opened using cur
3e80: 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  sor 0..*/.void s
3e90: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
3ea0: 54 61 62 6c 65 28 56 64 62 65 20 2a 76 2c 20 69  Table(Vdbe *v, i
3eb0: 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74  nt iDb){.  sqlit
3ec0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3ed0: 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20  P_Integer, iDb, 
3ee0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
3ef0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
3f00: 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45  nWrite, 0, MASTE
3f10: 52 5f 52 4f 4f 54 29 3b 0a 20 20 73 71 6c 69 74  R_ROOT);.  sqlit
3f20: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3f30: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
3f40: 20 30 2c 20 35 29 3b 20 2f 2a 20 73 71 6c 69 74   0, 5); /* sqlit
3f50: 65 5f 6d 61 73 74 65 72 20 68 61 73 20 35 20 63  e_master has 5 c
3f60: 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  olumns */.}../*.
3f70: 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e  ** The token *pN
3f80: 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ame contains the
3f90: 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62   name of a datab
3fa0: 61 73 65 20 28 65 69 74 68 65 72 20 22 6d 61 69  ase (either "mai
3fb0: 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20  n" or.** "temp" 
3fc0: 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  or the name of a
3fd0: 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20  n attached db). 
3fe0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
3ff0: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65  urns the.** inde
4000: 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64  x of the named d
4010: 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61  atabase in db->a
4020: 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74  Db[], or -1 if t
4030: 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20  he named db .** 
4040: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
4050: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  */.int sqlite3Fi
4060: 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62  ndDb(sqlite3 *db
4070: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
4080: 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20  .  int i = -1;  
4090: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
40a0: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  mber */.  int n;
40b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
40c0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
40d0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a   in the name */.
40e0: 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
40f0: 20 2f 2a 20 41 20 64 61 74 61 62 61 73 65 20 77   /* A database w
4100: 68 6f 73 65 20 6e 61 6d 65 20 73 70 61 63 65 20  hose name space 
4110: 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  is being searche
4120: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  d */.  char *zNa
4130: 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65  me;   /* Name we
4140: 20 61 72 65 20 73 65 61 72 63 68 69 6e 67 20 66   are searching f
4150: 6f 72 20 2a 2f 0a 0a 20 20 7a 4e 61 6d 65 20 3d  or */..  zName =
4160: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
4170: 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20  Token(pName);.  
4180: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
4190: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d   n = strlen(zNam
41a0: 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64  e);.    for(i=(d
41b0: 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26  b->nDb-1), pDb=&
41c0: 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30  db->aDb[i]; i>=0
41d0: 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20  ; i--, pDb--){. 
41e0: 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49 54 5f       if( (!OMIT_
41f0: 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31 20 29  TEMPDB || i!=1 )
4200: 20 26 26 20 6e 3d 3d 73 74 72 6c 65 6e 28 70 44   && n==strlen(pD
4210: 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20  b->zName) && .  
4220: 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74          0==sqlit
4230: 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a  e3StrICmp(pDb->z
4240: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  Name, zName) ){.
4250: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4260: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4270: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
4280: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
4290: 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61   i;.}../* The ta
42a0: 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74  ble or view or t
42b0: 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70  rigger name is p
42c0: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f  assed to this ro
42d0: 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73  utine via tokens
42e0: 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70  .** pName1 and p
42f0: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
4300: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
4310: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
4320: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
4330: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
4340: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20  x.yyy (...);.** 
4350: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
4360: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
4370: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
4380: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
4390: 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  and if.** the ta
43a0: 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  ble name is not 
43b0: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
43c0: 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45   i.e.:.**.** CRE
43d0: 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e  ATE TABLE yyy(..
43e0: 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70  .);.**.** Then p
43f0: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
4400: 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32  "yyy" and pName2
4410: 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68   is ""..**.** Th
4420: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
4430: 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f  the *ppUnqual po
4440: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
4450: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
4460: 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32  me1 or.** pName2
4470: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
4480: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
4490: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69  ble name.  The i
44a0: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64  ndex of the.** d
44b0: 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73  atabase "xxx" is
44c0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
44d0: 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  t sqlite3TwoPart
44e0: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
44f0: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
4500: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
4510: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
4520: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
4530: 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54  Name1,      /* T
4540: 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20  he "xxx" in the 
4550: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f  name "xxx.yyy" o
4560: 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b  r "xxx" */.  Tok
4570: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
4580: 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e   /* The "yyy" in
4590: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
45a0: 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  yy" */.  Token *
45b0: 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20  *pUnqual     /* 
45c0: 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c  Write the unqual
45d0: 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d  ified object nam
45e0: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
45f0: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
4600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
4610: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74  tabase holding t
4620: 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  he object */.  s
4630: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
4640: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
4650: 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32  pName2 && pName2
4660: 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73  ->n>0 ){.    ass
4670: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
4680: 75 73 79 20 29 3b 0a 20 20 20 20 2a 70 55 6e 71  usy );.    *pUnq
4690: 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20  ual = pName2;.  
46a0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46    iDb = sqlite3F
46b0: 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31  indDb(db, pName1
46c0: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
46d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
46e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
46f0: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62  , "unknown datab
4700: 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29  ase %T", pName1)
4710: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
4720: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
4730: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
4740: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
4750: 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  rt( db->init.iDb
4760: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e  ==0 || db->init.
4770: 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20  busy );.    iDb 
4780: 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a  = db->init.iDb;.
4790: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
47a0: 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74  Name1;.  }.  ret
47b0: 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn iDb;.}../*.*
47c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
47d0: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
47e0: 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72  if the UTF-8 str
47f0: 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c  ing zName is a l
4800: 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66  egal.** unqualif
4810: 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ied name for a n
4820: 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  ew schema object
4830: 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20   (table, index, 
4840: 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67  view or.** trigg
4850: 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61  er). All names a
4860: 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20  re legal except 
4870: 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e  those that begin
4880: 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67   with the string
4890: 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69  .** "sqlite_" (i
48a0: 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f  n upper, lower o
48b0: 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54  r mixed case). T
48c0: 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  his portion of t
48d0: 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20  he namespace.** 
48e0: 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  is reserved for 
48f0: 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f  internal use..*/
4900: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
4910: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73  kObjectName(Pars
4920: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
4930: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
4940: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62   if( !pParse->db
4950: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
4960: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
4970: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
4980: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
4990: 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65  s & SQLITE_Write
49a0: 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20  Schema)==0.     
49b0: 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
49c0: 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65  e3StrNICmp(zName
49d0: 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20  , "sqlite_", 7) 
49e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
49f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
4a00: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65  object name rese
4a10: 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61  rved for interna
4a20: 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d  l use: %s", zNam
4a30: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
4a40: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
4a50: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
4a60: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  _OK;.}../*.** Be
4a70: 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  gin constructing
4a80: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70   a new table rep
4a90: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d  resentation in m
4aa0: 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a  emory.  This is.
4ab0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  ** the first of 
4ac0: 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72  several action r
4ad0: 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74  outines that get
4ae0: 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f   called in respo
4af0: 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41  nse.** to a CREA
4b00: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
4b10: 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c  nt.  In particul
4b20: 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ar, this routine
4b30: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66   is called.** af
4b40: 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e  ter seeing token
4b50: 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22  s "CREATE" and "
4b60: 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74  TABLE" and the t
4b70: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a  able name.  The.
4b80: 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b 65 6e 20  ** pStart token 
4b90: 69 73 20 74 68 65 20 43 52 45 41 54 45 20 61 6e  is the CREATE an
4ba0: 64 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 74  d pName is the t
4bb0: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
4bc0: 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69  isTemp.** flag i
4bd0: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61  s true if the ta
4be0: 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74  ble should be st
4bf0: 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69  ored in the auxi
4c00: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a  liary database.*
4c10: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
4c20: 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  f in the main da
4c30: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
4c40: 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74  is is normally t
4c50: 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20  he case.** when 
4c60: 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54  the "TEMP" or "T
4c70: 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72  EMPORARY" keywor
4c80: 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  d occurs in betw
4c90: 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e  een.** CREATE an
4ca0: 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54  d TABLE..**.** T
4cb0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
4cc0: 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ord is initializ
4cd0: 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50  ed and put in pP
4ce0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e  arse->pNewTable.
4cf0: 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74  .** As more of t
4d00: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
4d10: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
4d20: 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  sed, additional 
4d30: 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e  action.** routin
4d40: 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  es will be calle
4d50: 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e  d to add more in
4d60: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69  formation to thi
4d70: 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20  s record..** At 
4d80: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
4d90: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
4da0: 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74  ement, the sqlit
4db0: 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75  e3EndTable() rou
4dc0: 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
4dd0: 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  d to complete th
4de0: 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f  e construction o
4df0: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
4e00: 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20  record..*/.void 
4e10: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
4e20: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
4e30: 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20  se,   /* Parser 
4e40: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
4e50: 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a  en *pStart,   /*
4e60: 20 54 68 65 20 22 43 52 45 41 54 45 22 20 74 6f   The "CREATE" to
4e70: 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ken */.  Token *
4e80: 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72  pName1,   /* Fir
4e90: 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  st part of the n
4ea0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
4eb0: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f   or view */.  To
4ec0: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f  ken *pName2,   /
4ed0: 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second 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 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
4f10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
4f20: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74  this is a TEMP t
4f30: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  able */.  int is
4f40: 56 69 65 77 20 20 20 20 20 20 20 2f 2a 20 54 72  View       /* Tr
4f50: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
4f60: 56 49 45 57 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  VIEW */.){.  Tab
4f70: 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68  le *pTable;.  ch
4f80: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f  ar *zName = 0; /
4f90: 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * The name of th
4fa0: 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
4fb0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
4fc0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
4fd0: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b  e *v;.  int iDb;
4fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
4ff0: 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63  base number to c
5000: 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  reate the table 
5010: 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  in */.  Token *p
5020: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75  Name;    /* Unqu
5030: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
5040: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65  the table to cre
5050: 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ate */..  /* The
5060: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
5070: 61 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69 73  ame to create is
5080: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
5090: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
50a0: 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61  ns.  ** pName1 a
50b0: 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68  nd pName2. If th
50c0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73  e table name was
50d0: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
50e0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20  , for example:. 
50f0: 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20   **.  ** CREATE 
5100: 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e  TABLE xxx.yyy (.
5110: 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ..);.  ** .  ** 
5120: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
5130: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
5140: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
5150: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
5160: 69 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  if.  ** the tabl
5170: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
5180: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
5190: 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  .e.:.  **.  ** C
51a0: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
51b0: 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ...);.  **.  ** 
51c0: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
51d0: 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20  et to "yyy" and 
51e0: 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20  pName2 is ""..  
51f0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  **.  ** The call
5200: 20 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20   below sets the 
5210: 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f  pName pointer to
5220: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f   point at the to
5230: 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20  ken (pName1 or. 
5240: 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74   ** pName2) that
5250: 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75   stores the unqu
5260: 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61  alified table na
5270: 6d 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65  me. The variable
5280: 20 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74   iDb is.  ** set
5290: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
52a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
52b0: 61 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  at the table or 
52c0: 76 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20  view is to be.  
52d0: 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20  ** created in.. 
52e0: 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   */.  iDb = sqli
52f0: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
5300: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
5310: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
5320: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
5330: 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49  turn;.  if( !OMI
5340: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
5350: 6d 70 20 26 26 20 69 44 62 3e 31 20 29 7b 0a 20  mp && iDb>1 ){. 
5360: 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e     /* If creatin
5370: 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20  g a temp table, 
5380: 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74  the name may not
5390: 20 62 65 20 71 75 61 6c 69 66 69 65 64 20 2a 2f   be qualified */
53a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
53b0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65  rMsg(pParse, "te
53c0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61  mporary table na
53d0: 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61  me must be unqua
53e0: 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 72 65  lified");.    re
53f0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
5400: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
5410: 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31  isTemp ) iDb = 1
5420: 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61  ;..  pParse->sNa
5430: 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65  meToken = *pName
5440: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  zName = sqli
5450: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
5460: 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  (pName);.  if( z
5470: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
5480: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
5490: 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
54a0: 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
54b0: 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
54c0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
54d0: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  _error;.  }.  if
54e0: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
54f0: 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a  1 ) isTemp = 1;.
5500: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5510: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
5520: 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 54  N.  assert( (isT
5530: 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70  emp & 1)==isTemp
5540: 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20   );.  {.    int 
5550: 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  code;.    char *
5560: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
5570: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b].zName;.    if
5580: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
5590: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
55a0: 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
55b0: 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20  _TABLE(isTemp), 
55c0: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
55d0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
55e0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
55f0: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
5600: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
5610: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
5620: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
5630: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
5640: 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  E_TEMP_VIEW;.   
5650: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5660: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
5670: 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20  CREATE_VIEW;.   
5680: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
5690: 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
56a0: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
56b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
56c0: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
56d0: 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
56e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
56f0: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
5700: 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20  CREATE_TABLE;.  
5710: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5720: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
5730: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
5740: 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  e, zName, 0, zDb
5750: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
5760: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
5770: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  r;.    }.  }.#en
5780: 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  dif..  /* Make s
5790: 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c  ure the new tabl
57a0: 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20  e name does not 
57b0: 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20  collide with an 
57c0: 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e  existing.  ** in
57d0: 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d  dex or table nam
57e0: 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  e in the same da
57f0: 74 61 62 61 73 65 2e 20 20 49 73 73 75 65 20 61  tabase.  Issue a
5800: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
5810: 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e  if.  ** it does.
5820: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
5830: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
5840: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
5850: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67   ){.    goto beg
5860: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
5870: 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73    }.  pTable = s
5880: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
5890: 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61  db, zName, db->a
58a0: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a  Db[iDb].zName);.
58b0: 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a    if( pTable ){.
58c0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
58d0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
58e0: 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78  le %T already ex
58f0: 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ists", pName);. 
5900: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
5910: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
5920: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
5930: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
5940: 20 30 29 21 3d 30 20 26 26 20 28 69 44 62 3d 3d   0)!=0 && (iDb==
5950: 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62  0 || !db->init.b
5960: 75 73 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  usy) ){.    sqli
5970: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5980: 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  se, "there is al
5990: 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e  ready an index n
59a0: 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29  amed %s", zName)
59b0: 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  ;.    goto begin
59c0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
59d0: 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  }.  pTable = sql
59e0: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
59f0: 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66  f(Table) );.  if
5a00: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20  ( pTable==0 ){. 
5a10: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
5a20: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5a30: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
5a40: 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  ;.    goto begin
5a50: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
5a60: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  }.  pTable->zNam
5a70: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61  e = zName;.  pTa
5a80: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  ble->nCol = 0;. 
5a90: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
5aa0: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b  0;.  pTable->iPK
5ab0: 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c  ey = -1;.  pTabl
5ac0: 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  e->pIndex = 0;. 
5ad0: 20 70 54 61 62 6c 65 2d 3e 69 44 62 20 3d 20 69   pTable->iDb = i
5ae0: 44 62 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52  Db;.  pTable->nR
5af0: 65 66 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50  ef = 1;.  if( pP
5b00: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
5b10: 29 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54  ) sqlite3DeleteT
5b20: 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d  able(db, pParse-
5b30: 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70  >pNewTable);.  p
5b40: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
5b50: 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a   = pTable;..  /*
5b60: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
5b70: 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71  magic sqlite_seq
5b80: 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64  uence table used
5b90: 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   by autoincremen
5ba0: 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63  t,.  ** then rec
5bb0: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
5bc0: 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74   this table in t
5bd0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
5be0: 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
5bf0: 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63  so that INSERT c
5c00: 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c  an find the tabl
5c10: 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23  e easily..  */.#
5c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5c30: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
5c40: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
5c50: 6e 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70  nested && strcmp
5c60: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
5c70: 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b  sequence")==0 ){
5c80: 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62  .    db->aDb[iDb
5c90: 5d 2e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62  ].pSeqTab = pTab
5ca0: 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
5cb0: 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
5cc0: 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74  ating the code t
5cd0: 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20  hat will insert 
5ce0: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
5cf0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53   into.  ** the S
5d00: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
5d10: 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72  le.  Note in par
5d20: 74 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20  ticular that we 
5d30: 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20  must go ahead.  
5d40: 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  ** and allocate 
5d50: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
5d60: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
5d70: 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f  entry now.  Befo
5d80: 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d  re any.  ** PRIM
5d90: 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
5da0: 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70  E keywords are p
5db0: 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65  arsed.  Those ke
5dc0: 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73  ywords will caus
5dd0: 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74  e.  ** indices t
5de0: 6f 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64  o be created and
5df0: 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72   the table recor
5e00: 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f  d must come befo
5e10: 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64  re the .  ** ind
5e20: 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68  ices.  Hence, th
5e30: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
5e40: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75  for the table mu
5e50: 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a  st be allocated.
5e60: 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20    ** now..  */. 
5e70: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
5e80: 75 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69  usy && (v = sqli
5e90: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
5ea0: 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  e))!=0 ){.    in
5eb0: 74 20 6c 62 6c 3b 0a 20 20 20 20 73 71 6c 69 74  t lbl;.    sqlit
5ec0: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
5ed0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
5ee0: 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49   iDb);..    /* I
5ef0: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
5f00: 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69  t and encoding i
5f10: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
5f20: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74  ave not been set
5f30: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
5f40: 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20  em now..    */. 
5f50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5f60: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f  dOp(v, OP_ReadCo
5f70: 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 20 20  okie, iDb, 1);  
5f80: 20 2f 2a 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20   /* file_format 
5f90: 2a 2f 0a 20 20 20 20 6c 62 6c 20 3d 20 73 71 6c  */.    lbl = sql
5fa0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
5fb0: 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l(v);.    sqlite
5fc0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5fd0: 5f 49 66 2c 20 30 2c 20 6c 62 6c 29 3b 0a 20 20  _If, 0, lbl);.  
5fe0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5ff0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
6000: 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  , db->file_forma
6010: 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
6020: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6030: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
6040: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
6050: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
6060: 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 65 6e  _Integer, db->en
6070: 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  c, 0);.    sqlit
6080: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6090: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
60a0: 2c 20 34 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 4);.    sqlite
60b0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
60c0: 6c 28 76 2c 20 6c 62 6c 29 3b 0a 0a 20 20 20 20  l(v, lbl);..    
60d0: 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65  /* This just cre
60e0: 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c  ates a place-hol
60f0: 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68  der record in th
6100: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
6110: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68  table..    ** Th
6120: 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64  e record created
6130: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
6140: 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20  n anything yet. 
6150: 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c   It will be repl
6160: 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  aced.    ** by t
6170: 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e  he real entry in
6180: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
6190: 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  at sqlite3EndTab
61a0: 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  le()..    **.   
61b0: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
61c0: 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  r the new entry 
61d0: 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 74  is left on the t
61e0: 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
61f0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  .    ** The rowi
6200: 64 20 76 61 6c 75 65 20 69 73 20 6e 65 65 64 65  d value is neede
6210: 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68  d by the code th
6220: 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  at sqlite3EndTab
6230: 6c 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67  le will.    ** g
6240: 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a  enerate..    */.
6250: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6260: 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 69 66 28  MIT_VIEW.    if(
6270: 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
6280: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6290: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
62a0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73   0, 0);.    }els
62b0: 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  e.#endif.    {. 
62c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
62d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61  AddOp(v, OP_Crea
62e0: 74 65 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 29  teTable, iDb, 0)
62f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
6300: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
6310: 6c 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  le(v, iDb);.    
6320: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6330: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
6340: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
6350: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6360: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
6370: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6380: 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  dOp(v, OP_Null, 
6390: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
63a0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
63b0: 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 30 29 3b  P_Insert, 0, 0);
63c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
63d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
63e0: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  e, 0, 0);.    sq
63f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6400: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
6410: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d  ;.  }..  /* Norm
6420: 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72  al (non-error) r
6430: 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75  eturn. */.  retu
6440: 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  rn;..  /* If an 
6450: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65  error occurs, we
6460: 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65   jump here */.be
6470: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a  gin_table_error:
6480: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e  .  sqliteFree(zN
6490: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
64a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61  }../*.** This ma
64b0: 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20 63  cro is used to c
64c0: 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69 6e  ompare two strin
64d0: 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e 73  gs in a case-ins
64e0: 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e  ensitive manner.
64f0: 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67 68 74  .** It is slight
6500: 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e 20 63  ly faster than c
6510: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 53 74  alling sqlite3St
6520: 72 49 43 6d 70 28 29 20 64 69 72 65 63 74 6c 79  rICmp() directly
6530: 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65  , but.** produce
6540: 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a  s larger code..*
6550: 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68  *.** WARNING: Th
6560: 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20  is macro is not 
6570: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
6580: 74 68 65 20 73 74 72 63 6d 70 28 29 20 66 61 6d  the strcmp() fam
6590: 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72  ily. It.** retur
65a0: 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74  ns true if the t
65b0: 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65 20 65  wo strings are e
65c0: 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73 65 20  qual, otherwise 
65d0: 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  false..*/.#defin
65e0: 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79 29 20  e STRICMP(x, y) 
65f0: 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54  (\.sqlite3UpperT
6600: 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65  oLower[*(unsigne
6610: 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20  d char *)(x)]== 
6620: 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72    \.sqlite3Upper
6630: 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e  ToLower[*(unsign
6640: 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d 20 20  ed char *)(y)]  
6650: 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65 33 53     \.&& sqlite3S
6660: 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28 79 29  trICmp((x)+1,(y)
6670: 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20  +1)==0 )../*.** 
6680: 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e  Add a new column
6690: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
66a0: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
66b0: 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a  nstructed..**.**
66c0: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
66d0: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  s this routine o
66e0: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nce for each col
66f0: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  umn declaration.
6700: 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ** in a CREATE T
6710: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
6720: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
6730: 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64  le() gets called
6740: 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74  .** first to get
6750: 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20   things going.  
6760: 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  Then this routin
6770: 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
6780: 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a  each.** column..
6790: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
67a0: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
67b0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
67c0: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
67d0: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
67e0: 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20  ar *z;.  Column 
67f0: 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20  *pCol;.  if( (p 
6800: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
6810: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
6820: 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e  ;.  z = sqlite3N
6830: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61  ameFromToken(pNa
6840: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  me);.  if( z==0 
6850: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
6860: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
6870: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 54  i++){.    if( ST
6880: 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c  RICMP(z, p->aCol
6890: 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  [i].zName) ){.  
68a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
68b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70  Msg(pParse, "dup
68c0: 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61  licate column na
68d0: 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20  me: %s", z);.   
68e0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
68f0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
6900: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
6910: 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d  (p->nCol & 0x7)=
6920: 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e  =0 ){.    Column
6930: 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77   *aNew;.    aNew
6940: 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
6950: 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e  ( p->aCol, (p->n
6960: 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d  Col+8)*sizeof(p-
6970: 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20  >aCol[0]));.    
6980: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
6990: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
69a0: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
69b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
69c0: 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a  Col = aNew;.  }.
69d0: 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f    pCol = &p->aCo
69e0: 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65  l[p->nCol];.  me
69f0: 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69  mset(pCol, 0, si
6a00: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
6a10: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  );.  pCol->zName
6a20: 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20   = z;. .  /* If 
6a30: 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65  there is no type
6a40: 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75   specified, colu
6a50: 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66  mns have the def
6a60: 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20  ault affinity.  
6a70: 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68  ** 'NONE'. If th
6a80: 65 72 65 20 69 73 20 61 20 74 79 70 65 20 73 70  ere is a type sp
6a90: 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71  ecified, then sq
6aa0: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79  lite3AddColumnTy
6ab0: 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62  pe() will.  ** b
6ac0: 65 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f  e called next to
6ad0: 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e   set pCol->affin
6ae0: 69 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20  ity correctly.. 
6af0: 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69   */.  pCol->affi
6b00: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
6b10: 46 5f 4e 4f 4e 45 3b 0a 20 20 70 43 6f 6c 2d 3e  F_NONE;.  pCol->
6b20: 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
6b30: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
6b40: 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f   p->nCol++;.}../
6b50: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6b60: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
6b70: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
6b80: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
6b90: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
6ba0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
6bb0: 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55  ment.  A "NOT NU
6bc0: 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68  LL" constraint h
6bd0: 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20  as.** been seen 
6be0: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  on a column.  Th
6bf0: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
6c00: 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67  the notNull flag
6c10: 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   on.** the colum
6c20: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
6c30: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
6c40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
6c50: 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20  ddNotNull(Parse 
6c60: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45  *pParse, int onE
6c70: 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a  rror){.  Table *
6c80: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  p;.  int i;.  if
6c90: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
6ca0: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
6cb0: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
6cc0: 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e  nCol-1;.  if( i>
6cd0: 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  =0 ) p->aCol[i].
6ce0: 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f  notNull = onErro
6cf0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e  r;.}../*.** Scan
6d00: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
6d10: 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e   name zType (len
6d20: 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72  gth nType) and r
6d30: 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73  eturn the.** ass
6d40: 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69 74 79  ociated affinity
6d50: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   type..**.** Thi
6d60: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61  s routine does a
6d70: 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e   case-independen
6d80: 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70  t search of zTyp
6d90: 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75  e for the .** su
6da0: 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20  bstrings in the 
6db0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e  following table.
6dc0: 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   If one of the s
6dd0: 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20  ubstrings is.** 
6de0: 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65  found, the corre
6df0: 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74  sponding affinit
6e00: 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  y is returned. I
6e10: 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73  f zType contains
6e20: 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  .** more than on
6e30: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
6e40: 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77  ngs, entries tow
6e50: 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a  ard the top of .
6e60: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b  ** the table tak
6e70: 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20  e priority. For 
6e80: 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70  example, if zTyp
6e90: 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20  e is 'BLOBINT', 
6ea0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  .** SQLITE_AFF_N
6eb0: 55 4d 45 52 49 43 20 69 73 20 72 65 74 75 72 6e  UMERIC is return
6ec0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72  ed..**.** Substr
6ed0: 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69  ing     | Affini
6ee0: 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ty.** ----------
6ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f00: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20  ------.** 'INT' 
6f10: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
6f20: 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20  _AFF_INTEGER.** 
6f30: 27 43 48 41 52 27 20 20 20 20 20 20 20 20 7c 20  'CHAR'        | 
6f40: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
6f50: 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20  ** 'CLOB'       
6f60: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
6f70: 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20  XT.** 'TEXT'    
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 42 4c 4f 42 27 20  _TEXT.** 'BLOB' 
6fa0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
6fb0: 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 0a 2a 2a 20 49  AFF_NONE.**.** I
6fc0: 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  f none of the su
6fd0: 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20  bstrings in the 
6fe0: 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20  above table are 
6ff0: 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  found,.** SQLITE
7000: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20  _AFF_NUMERIC is 
7010: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
7020: 54 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  The SQLITE_AFF_I
7030: 4e 54 45 47 45 52 20 74 79 70 65 20 69 73 20 6f  NTEGER type is o
7040: 6e 6c 79 20 72 65 74 75 72 6e 65 64 20 69 66 20  nly returned if 
7050: 75 73 65 49 6e 74 54 79 70 65 20 69 73 20 74 72  useIntType is tr
7060: 75 65 2e 0a 2a 2a 20 49 66 20 75 73 65 49 6e 74  ue..** If useInt
7070: 54 79 70 65 20 69 73 20 66 61 6c 73 65 2c 20 74  Type is false, t
7080: 68 65 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  hen SQLITE_AFF_I
7090: 4e 54 45 47 45 52 20 69 73 20 72 65 70 6f 72 74  NTEGER is report
70a0: 65 64 20 62 61 63 6b 0a 2a 2a 20 61 73 20 53 51  ed back.** as SQ
70b0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
70c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
70d0: 41 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e  AffinityType(con
70e0: 73 74 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 2c  st Token *pType,
70f0: 20 69 6e 74 20 75 73 65 49 6e 74 54 79 70 65 29   int useIntType)
7100: 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20  {.  u32 h = 0;. 
7110: 20 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49   char aff = SQLI
7120: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
7130: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
7140: 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 70 54 79   char *zIn = pTy
7150: 70 65 2d 3e 7a 3b 0a 20 20 63 6f 6e 73 74 20 75  pe->z;.  const u
7160: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45  nsigned char *zE
7170: 6e 64 20 3d 20 26 70 54 79 70 65 2d 3e 7a 5b 70  nd = &pType->z[p
7180: 54 79 70 65 2d 3e 6e 5d 3b 0a 0a 20 20 77 68 69  Type->n];..  whi
7190: 6c 65 28 20 7a 49 6e 21 3d 7a 45 6e 64 20 29 7b  le( zIn!=zEnd ){
71a0: 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20  .    h = (h<<8) 
71b0: 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  + sqlite3UpperTo
71c0: 4c 6f 77 65 72 5b 2a 7a 49 6e 5d 3b 0a 20 20 20  Lower[*zIn];.   
71d0: 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20   zIn++;.    if( 
71e0: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
71f0: 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  h'<<16)+('a'<<8)
7200: 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20 20 20  +'r') ){        
7210: 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a       /* CHAR */.
7220: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
7230: 54 45 5f 41 46 46 5f 54 45 58 54 3b 20 0a 20 20  TE_AFF_TEXT; .  
7240: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
7250: 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('c'<<24)+('l'<<
7260: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
7270: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c  ) ){       /* CL
7280: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  OB */.      aff 
7290: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
72a0: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
72b0: 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28   h==(('t'<<24)+(
72c0: 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38  'e'<<16)+('x'<<8
72d0: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20  )+'t') ){       
72e0: 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20  /* TEXT */.     
72f0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
7300: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
7310: 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c  e if( h==(('b'<<
7320: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
7330: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  o'<<8)+'b')     
7340: 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a       /* BLOB */.
7350: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
7360: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
7370: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
7380: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
7390: 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  E;.    }else if(
73a0: 20 28 68 26 30 78 30 30 46 46 46 46 46 46 29 3d   (h&0x00FFFFFF)=
73b0: 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27  =(('i'<<16)+('n'
73c0: 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20  <<8)+'t') ){    
73d0: 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20  /* INT */.      
73e0: 61 66 66 20 3d 20 75 73 65 49 6e 74 54 79 70 65  aff = useIntType
73f0: 20 3f 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   ? SQLITE_AFF_IN
7400: 54 45 47 45 52 20 3a 20 53 51 4c 49 54 45 5f 41  TEGER : SQLITE_A
7410: 46 46 5f 4e 55 4d 45 52 49 43 3b 20 0a 20 20 20  FF_NUMERIC; .   
7420: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7430: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 66    }..  return af
7440: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  f;.}../*.** This
7450: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
7460: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
7470: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
7480: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
7490: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
74a0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  E statement.  Th
74b0: 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69  e pFirst token i
74c0: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74  s the first.** t
74d0: 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75  oken in the sequ
74e0: 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74  ence of tokens t
74f0: 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65  hat describe the
7500: 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20   type of the.** 
7510: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
7520: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
7530: 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20  ion.   pLast is 
7540: 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a  the last token.*
7550: 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63  * in the sequenc
7560: 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66  e.  Use this inf
7570: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73  ormation to cons
7580: 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a  truct a string.*
7590: 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  * that contains 
75a0: 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20  the typename of 
75b0: 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73  the column and s
75c0: 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67  tore that string
75d0: 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f  .** in zType..*/
75e0: 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64   .void sqlite3Ad
75f0: 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73  dColumnType(Pars
7600: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
7610: 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c   *pType){.  Tabl
7620: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
7630: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a   Column *pCol;..
7640: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
7650: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
7660: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
7670: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66   p->nCol-1;.  if
7680: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  ( i<0 ) return;.
7690: 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f    pCol = &p->aCo
76a0: 6c 5b 69 5d 3b 0a 20 20 73 71 6c 69 74 65 46 72  l[i];.  sqliteFr
76b0: 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b  ee(pCol->zType);
76c0: 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d  .  pCol->zType =
76d0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
76e0: 54 6f 6b 65 6e 28 70 54 79 70 65 29 3b 0a 20 20  Token(pType);.  
76f0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
7700: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
7710: 54 79 70 65 28 70 54 79 70 65 2c 20 30 29 3b 0a  Type(pType, 0);.
7720: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70  }../*.** The exp
7730: 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64  ression is the d
7740: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
7750: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
7760: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a  ly added column.
7770: 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
7780: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
7790: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a  construction..**
77a0: 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75  .** Default valu
77b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75  e expressions mu
77c0: 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20  st be constant. 
77d0: 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70 74   Raise an except
77e0: 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ion if this.** i
77f0: 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a  s not the case..
7800: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7810: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
7820: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
7830: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
7840: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
7850: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
7860: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
7870: 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74  qlite3AddDefault
7880: 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61  Value(Parse *pPa
7890: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
78a0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
78b0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
78c0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
78d0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 21 3d 30 20  ->pNewTable)!=0 
78e0: 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28  ){.    pCol = &(
78f0: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d  p->aCol[p->nCol-
7900: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71  1]);.    if( !sq
7910: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
7920: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45  antOrFunction(pE
7930: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71  xpr) ){.      sq
7940: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7950: 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76  arse, "default v
7960: 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b  alue of column [
7970: 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  %s] is not const
7980: 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ant",.          
7990: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
79a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
79b0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
79c0: 28 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20  (pCol->pDflt);. 
79d0: 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74       pCol->pDflt
79e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
79f0: 70 28 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  p(pExpr);.    }.
7a00: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
7a10: 72 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b 0a  rDelete(pExpr);.
7a20: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61  }../*.** Designa
7a30: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
7a40: 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  EY for the table
7a50: 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  .  pList is a li
7a60: 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20  st of names .** 
7a70: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
7a80: 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79  form the primary
7a90: 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20   key.  If pList 
7aa0: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
7ab0: 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74  e.** most recent
7ac0: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20  ly added column 
7ad0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
7ae0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
7af0: 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63  .**.** A table c
7b00: 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  an have at most 
7b10: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  one primary key.
7b20: 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61    If the table a
7b30: 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20  lready has.** a 
7b40: 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64  primary key (and
7b50: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
7b60: 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29  ond primary key)
7b70: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a   then create an.
7b80: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
7b90: 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  If the PRIMARY K
7ba0: 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c  EY is on a singl
7bb0: 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64  e column whose d
7bc0: 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47  atatype is INTEG
7bd0: 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77  ER,.** then we w
7be0: 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74  ill try to use t
7bf0: 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  hat column as th
7c00: 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68  e rowid.  Set th
7c10: 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a  e Table.iPKey.**
7c20: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61   field of the ta
7c30: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
7c40: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65  uction to be the
7c50: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
7c60: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
7c70: 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61   KEY column.  Ta
7c80: 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74  ble.iPKey is set
7c90: 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20   to -1 if there 
7ca0: 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52  is.** no INTEGER
7cb0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a   PRIMARY KEY..**
7cc0: 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69  .** If the key i
7cd0: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
7ce0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
7cf0: 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  en create a uniq
7d00: 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20  ue.** index for 
7d10: 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64  the key.  No ind
7d20: 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f  ex is created fo
7d30: 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  r INTEGER PRIMAR
7d40: 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20  Y KEYs..*/.void 
7d50: 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72  sqlite3AddPrimar
7d60: 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  yKey(.  Parse *p
7d70: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
7d80: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
7d90: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
7da0: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66  t,  /* List of f
7db0: 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65  ield names to be
7dc0: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
7dd0: 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
7de0: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
7df0: 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20  th a uniqueness 
7e00: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e  conflict */.  in
7e10: 74 20 61 75 74 6f 49 6e 63 20 20 20 20 20 20 20  t autoInc       
7e20: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41  /* True if the A
7e30: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79  UTOINCREMENT key
7e40: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
7e50: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
7e60: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
7e70: 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20  ewTable;.  char 
7e80: 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e  *zType = 0;.  in
7e90: 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a  t iCol = -1, i;.
7ea0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
7eb0: 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79  goto primary_key
7ec0: 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61  _exit;.  if( pTa
7ed0: 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b  b->hasPrimKey ){
7ee0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
7ef0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
7f00: 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c      "table \"%s\
7f10: 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  " has more than 
7f20: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22  one primary key"
7f30: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
7f40: 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79      goto primary
7f50: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  _key_exit;.  }. 
7f60: 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65   pTab->hasPrimKe
7f70: 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69  y = 1;.  if( pLi
7f80: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f  st==0 ){.    iCo
7f90: 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d  l = pTab->nCol -
7fa0: 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43   1;.    pTab->aC
7fb0: 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b  ol[iCol].isPrimK
7fc0: 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ey = 1;.  }else{
7fd0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7fe0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
7ff0: 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43  +){.      for(iC
8000: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
8010: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
8020: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
8030: 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
8040: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
8050: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
8060: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
8070: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8080: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
8090: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54       if( iCol<pT
80a0: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
80b0: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
80c0: 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d  Col].isPrimKey =
80d0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
80e0: 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  }.    if( pList-
80f0: 3e 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20  >nExpr>1 ) iCol 
8100: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  = -1;.  }.  if( 
8110: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
8120: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
8130: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
8140: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
8150: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70  ;.  }.  if( zTyp
8160: 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  e && sqlite3StrI
8170: 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45  Cmp(zType, "INTE
8180: 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  GER")==0 ){.    
8190: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43  pTab->iPKey = iC
81a0: 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65  ol;.    pTab->ke
81b0: 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b  yConf = onError;
81c0: 0a 20 20 20 20 70 54 61 62 2d 3e 61 75 74 6f 49  .    pTab->autoI
81d0: 6e 63 20 3d 20 61 75 74 6f 49 6e 63 3b 0a 20 20  nc = autoInc;.  
81e0: 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e  }else if( autoIn
81f0: 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  c ){.#ifndef SQL
8200: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
8210: 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74  REMENT.    sqlit
8220: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8230: 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e  e, "AUTOINCREMEN
8240: 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65  T is only allowe
8250: 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20  d on an ".      
8260: 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52   "INTEGER PRIMAR
8270: 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a  Y KEY");.#endif.
8280: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
8290: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
82a0: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
82b0: 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c   pList, onError,
82c0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73   0, 0);.    pLis
82d0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d  t = 0;.  }..prim
82e0: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20  ary_key_exit:.  
82f0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8300: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
8310: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
8320: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
8330: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  on function of t
8340: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
8350: 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f   parsed table co
8360: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43  lumn.** to the C
8370: 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f  ollSeq given..*/
8380: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
8390: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
83a0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
83b0: 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e   char *zType, in
83c0: 74 20 6e 54 79 70 65 29 7b 0a 20 20 54 61 62 6c  t nType){.  Tabl
83d0: 65 20 2a 70 3b 0a 20 20 49 6e 64 65 78 20 2a 70  e *p;.  Index *p
83e0: 49 64 78 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Idx;.  CollSeq *
83f0: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pColl;.  int i;.
8400: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
8410: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
8420: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
8430: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20  = p->nCol-1;..  
8440: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c  pColl = sqlite3L
8450: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
8460: 72 73 65 2c 20 7a 54 79 70 65 2c 20 6e 54 79 70  rse, zType, nTyp
8470: 65 29 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d  e);.  p->aCol[i]
8480: 2e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a  .pColl = pColl;.
8490: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c  .  /* If the col
84a0: 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20  umn is declared 
84b0: 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41  as "<name> PRIMA
84c0: 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c  RY KEY COLLATE <
84d0: 74 79 70 65 3e 22 2c 0a 20 20 2a 2a 20 74 68 65  type>",.  ** the
84e0: 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68  n an index may h
84f0: 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64  ave been created
8500: 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20   on this column 
8510: 62 65 66 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20  before the.  ** 
8520: 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77  collation type w
8530: 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63  as added. Correc
8540: 74 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20  t this if it is 
8550: 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20  the case..  */. 
8560: 20 66 6f 72 28 70 49 64 78 20 3d 20 70 2d 3e 70   for(pIdx = p->p
8570: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
8580: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
8590: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
85a0: 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ->nColumn==1 );.
85b0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
85c0: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 20 70  Column[0]==i ) p
85d0: 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  Idx->keyInfo.aCo
85e0: 6c 6c 5b 30 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20  ll[0] = pColl;. 
85f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c   }.}../*.** Call
8600: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c   sqlite3CheckCol
8610: 6c 53 65 71 28 29 20 66 6f 72 20 61 6c 6c 20 63  lSeq() for all c
8620: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
8630: 65 73 20 69 6e 20 61 6e 20 69 6e 64 65 78 2c 0a  es in an index,.
8640: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 76  ** in order to v
8650: 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 74  erify that all t
8660: 68 65 20 6e 65 63 65 73 73 61 72 79 20 63 6f 6c  he necessary col
8670: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
8680: 20 61 72 65 0a 2a 2a 20 6c 6f 61 64 65 64 2e 0a   are.** loaded..
8690: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68  */.int sqlite3Ch
86a0: 65 63 6b 49 6e 64 65 78 43 6f 6c 6c 53 65 71 28  eckIndexCollSeq(
86b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
86c0: 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69  ndex *pIdx){.  i
86d0: 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 69  f( pIdx ){.    i
86e0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
86f0: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; i<pIdx->nColu
8700: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
8710: 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b  if( sqlite3Check
8720: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
8730: 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  pIdx->keyInfo.aC
8740: 6f 6c 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  oll[i]) ){.     
8750: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8760: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
8770: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
8780: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8790: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
87a0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
87b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
87c0: 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73 65  nce for database
87d0: 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20   native text.** 
87e0: 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66  encoding identif
87f0: 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69 6e  ied by the strin
8800: 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  g zName, length 
8810: 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nName..**.** If 
8820: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
8830: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
8840: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
8850: 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61  e, or not availa
8860: 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61  ble.** in the da
8870: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e  tabase native en
8880: 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c  coding, the coll
8890: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73  ation factory is
88a0: 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72   invoked to.** r
88b0: 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74 68  equest it. If th
88c0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
88d0: 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ory does not sup
88e0: 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75 65  ply such a seque
88f0: 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  nce,.** and the 
8900: 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61 69  sequence is avai
8910: 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  lable in another
8920: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20   text encoding, 
8930: 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20  then that is.** 
8940: 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
8950: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65  ..**.** If no ve
8960: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65  rsions of the re
8970: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
8980: 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65 20  ns sequence are 
8990: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a  available, or.**
89a0: 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f   another error o
89b0: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
89c0: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
89d0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69  rror message wri
89e0: 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61  tten into.** pPa
89f0: 72 73 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  rse..*/.CollSeq 
8a00: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  *sqlite3LocateCo
8a10: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
8a20: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
8a30: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d  *zName, int nNam
8a40: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
8a50: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
8a60: 20 20 75 38 20 65 6e 63 20 3d 20 64 62 2d 3e 65    u8 enc = db->e
8a70: 6e 63 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73  nc;.  u8 initbus
8a80: 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  y = db->init.bus
8a90: 79 3b 0a 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  y;..  CollSeq *p
8aa0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
8ab0: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e  ndCollSeq(db, en
8ac0: 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  c, zName, nName,
8ad0: 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66   initbusy);.  if
8ae0: 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28  ( !initbusy && (
8af0: 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c  !pColl || !pColl
8b00: 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70  ->xCmp) ){.    p
8b10: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
8b20: 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20 70 43 6f  tCollSeq(db, pCo
8b30: 6c 6c 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ll, zName, nName
8b40: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c  );.    if( !pCol
8b50: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  l ){.      if( n
8b60: 4e 61 6d 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  Name<0 ){.      
8b70: 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e    nName = strlen
8b80: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  (zName);.      }
8b90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8ba0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8bb0: 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f  no such collatio
8bc0: 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73  n sequence: %.*s
8bd0: 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  ", nName, zName)
8be0: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ;.      pColl = 
8bf0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
8c00: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
8c10: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
8c20: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
8c30: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63  increment the sc
8c40: 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a  hema cookie..**.
8c50: 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f  ** The schema co
8c60: 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20  okie is used to 
8c70: 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74  determine when t
8c80: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
8c90: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
8ca0: 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61  anges.  After ea
8cb0: 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ch schema change
8cc0: 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c  , the cookie val
8cd0: 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  ue.** changes.  
8ce0: 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66  When a process f
8cf0: 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73  irst reads the s
8d00: 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73  chema it records
8d10: 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20   the.** cookie. 
8d20: 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65   Thereafter, whe
8d30: 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f  never it goes to
8d40: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
8d50: 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63  base,.** it chec
8d60: 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  ks the cookie to
8d70: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
8d80: 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68  chema has not ch
8d90: 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69  anged.** since i
8da0: 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e  t was last read.
8db0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e  .**.** This plan
8dc0: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   is not complete
8dd0: 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e  ly bullet-proof.
8de0: 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
8df0: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65   for.** the sche
8e00: 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c  ma to change mul
8e10: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20  tiple times and 
8e20: 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  for the cookie t
8e30: 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b  o be.** set back
8e40: 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e   to prior value.
8e50: 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61    But schema cha
8e60: 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75  nges are infrequ
8e70: 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70  ent.** and the p
8e80: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69  robability of hi
8e90: 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  tting the same c
8ea0: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f  ookie value is o
8eb0: 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20  nly.** 1 chance 
8ec0: 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27  in 2^32.  So we'
8ed0: 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a  re safe enough..
8ee0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
8ef0: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69  hangeCookie(sqli
8f00: 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 76  te3 *db, Vdbe *v
8f10: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
8f20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
8f30: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
8f40: 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d  ->aDb[iDb].schem
8f50: 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 30 29 3b 0a  a_cookie+1, 0);.
8f60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8f70: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  Op(v, OP_SetCook
8f80: 69 65 2c 20 69 44 62 2c 20 30 29 3b 0a 7d 0a 0a  ie, iDb, 0);.}..
8f90: 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68  /*.** Measure th
8fa0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
8fb0: 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f  acters needed to
8fc0: 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   output the give
8fd0: 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e  n.** identifier.
8fe0: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74    The number ret
8ff0: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61  urned includes a
9000: 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a  ny quotes used.*
9010: 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69  * but does not i
9020: 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20  nclude the null 
9030: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a  terminator..**.*
9040: 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69  * The estimate i
9050: 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20  s conservative. 
9060: 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72   It might be lar
9070: 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73  ger that what is
9080: 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65  .** really neede
9090: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
90a0: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e   identLength(con
90b0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
90c0: 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b  nt n;.  for(n=0;
90d0: 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a   *z; n++, z++){.
90e0: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20      if( *z=='"' 
90f0: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  ){ n++; }.  }.  
9100: 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a  return n + 2;.}.
9110: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
9120: 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20  identifier onto 
9130: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67  the end of the g
9140: 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41 64  iven string.  Ad
9150: 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61  d.** quote chara
9160: 63 74 65 72 73 20 61 73 20 6e 65 65 64 65 64 2e  cters as needed.
9170: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9180: 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a  identPut(char *z
9190: 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61  , int *pIdx, cha
91a0: 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29  r *zSignedIdent)
91b0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
91c0: 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73  r *zIdent = (uns
91d0: 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67  igned char*)zSig
91e0: 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20  nedIdent;.  int 
91f0: 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b  i, j, needQuote;
9200: 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20  .  i = *pIdx;.  
9210: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
9220: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  j]; j++){.    if
9230: 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e  ( !isalnum(zIden
9240: 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b  t[j]) && zIdent[
9250: 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b  j]!='_' ) break;
9260: 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65  .  }.  needQuote
9270: 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30   =  zIdent[j]!=0
9280: 20 7c 7c 20 69 73 64 69 67 69 74 28 7a 49 64 65   || isdigit(zIde
9290: 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20  nt[0]).         
92a0: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
92b0: 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a  te3KeywordCode(z
92c0: 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44  Ident, j)!=TK_ID
92d0: 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  ;.  if( needQuot
92e0: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
92f0: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
9300: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
9310: 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e    z[i++] = zIden
9320: 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49  t[j];.    if( zI
9330: 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a  dent[j]=='"' ) z
9340: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d  [i++] = '"';.  }
9350: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
9360: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
9370: 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a  .  z[i] = 0;.  *
9380: 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a  pIdx = i;.}../*.
9390: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52  ** Generate a CR
93a0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
93b0: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
93c0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
93d0: 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79  * table.  Memory
93e0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78   to hold the tex
93f0: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
9400: 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  nt is obtained.*
9410: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  * from sqliteMal
9420: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
9430: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
9440: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
9450: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
9460: 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74  *createTableStmt
9470: 28 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e  (Table *p){.  in
9480: 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61  t i, k, n;.  cha
9490: 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72  r *zStmt;.  char
94a0: 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20   *zSep, *zSep2, 
94b0: 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c  *zEnd, *z;.  Col
94c0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d  umn *pCol;.  n =
94d0: 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d   0;.  for(pCol =
94e0: 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69   p->aCol, i=0; i
94f0: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
9500: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d  Col++){.    n +=
9510: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f   identLength(pCo
9520: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7a  l->zName);.    z
9530: 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a   = pCol->zType;.
9540: 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20      if( z ){.   
9550: 20 20 20 6e 20 2b 3d 20 28 73 74 72 6c 65 6e 28     n += (strlen(
9560: 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20  z) + 1);.    }. 
9570: 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c   }.  n += identL
9580: 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b  ength(p->zName);
9590: 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 0a 20  .  if( n<50 ){. 
95a0: 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20     zSep = "";.  
95b0: 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20    zSep2 = ",";. 
95c0: 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20     zEnd = ")";. 
95d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70   }else{.    zSep
95e0: 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a   = "\n  ";.    z
95f0: 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a  Sep2 = ",\n  ";.
9600: 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22      zEnd = "\n)"
9610: 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20  ;.  }.  n += 35 
9620: 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a  + 6*p->nCol;.  z
9630: 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Stmt = sqliteMal
9640: 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a 20 20 69  locRaw( n );.  i
9650: 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65  f( zStmt==0 ) re
9660: 74 75 72 6e 20 30 3b 0a 20 20 73 74 72 63 70 79  turn 0;.  strcpy
9670: 28 7a 53 74 6d 74 2c 20 21 4f 4d 49 54 5f 54 45  (zStmt, !OMIT_TE
9680: 4d 50 44 42 26 26 70 2d 3e 69 44 62 3d 3d 31 20  MPDB&&p->iDb==1 
9690: 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54  ? "CREATE TEMP T
96a0: 41 42 4c 45 20 22 3a 22 43 52 45 41 54 45 20 54  ABLE ":"CREATE T
96b0: 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73  ABLE ");.  k = s
96c0: 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20  trlen(zStmt);.  
96d0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
96e0: 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  &k, p->zName);. 
96f0: 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28   zStmt[k++] = '(
9700: 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d  ';.  for(pCol=p-
9710: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
9720: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
9730: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28  ++){.    strcpy(
9740: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29  &zStmt[k], zSep)
9750: 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65  ;.    k += strle
9760: 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20  n(&zStmt[k]);.  
9770: 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a    zSep = zSep2;.
9780: 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74      identPut(zSt
9790: 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e  mt, &k, pCol->zN
97a0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 28 7a  ame);.    if( (z
97b0: 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 21   = pCol->zType)!
97c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d  =0 ){.      zStm
97d0: 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  t[k++] = ' ';.  
97e0: 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d      strcpy(&zStm
97f0: 74 5b 6b 5d 2c 20 7a 29 3b 0a 20 20 20 20 20 20  t[k], z);.      
9800: 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a  k += strlen(z);.
9810: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 72 63      }.  }.  strc
9820: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45  py(&zStmt[k], zE
9830: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
9840: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  tmt;.}../*.** Th
9850: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9860: 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  lled to report t
9870: 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61  he final ")" tha
9880: 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20  t terminates.** 
9890: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
98a0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
98b0: 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74  The table struct
98c0: 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61  ure that other a
98d0: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68  ction routines h
98e0: 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e  ave been buildin
98f0: 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  g.** is added to
9900: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61   the internal ha
9910: 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d  sh tables, assum
9920: 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61  ing no errors ha
9930: 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a  ve.** occurred..
9940: 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66  **.** An entry f
9950: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  or the table is 
9960: 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74  made in the mast
9970: 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b  er table on disk
9980: 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73  , unless.** this
9990: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
99a0: 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69  table or db->ini
99b0: 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e  t.busy==1.  When
99c0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
99d0: 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65  1.** it means we
99e0: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
99f0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
9a00: 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20  able because we 
9a10: 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65  just.** connecte
9a20: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
9a30: 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  e or because the
9a40: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
9a50: 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65  able has.** rece
9a60: 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f  ntly changed, so
9a70: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
9a80: 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64  his table alread
9a90: 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74  y exists in.** t
9aa0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
9ab0: 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e   table.  We do n
9ac0: 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74  ot want to creat
9ad0: 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  e it again..**.*
9ae0: 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74  * If the pSelect
9af0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
9b00: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
9b10: 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
9b20: 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20  e.** was called 
9b30: 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c  to create a tabl
9b40: 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  e generated from
9b50: 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54   a .** "CREATE T
9b60: 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45  ABLE ... AS SELE
9b70: 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e  CT ..." statemen
9b80: 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e  t.  The column n
9b90: 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ames of.** the n
9ba0: 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61  ew table will ma
9bb0: 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73  tch the result s
9bc0: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
9bd0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9be0: 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72  3EndTable(.  Par
9bf0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9c00: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
9c10: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
9c20: 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20   *pCons,        
9c30: 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f     /* The ',' to
9c40: 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61  ken after the la
9c50: 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20  st column defn. 
9c60: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
9c70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
9c80: 54 68 65 20 66 69 6e 61 6c 20 27 29 27 20 74 6f  The final ')' to
9c90: 6b 65 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54  ken in the CREAT
9ca0: 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c  E TABLE */.  Sel
9cb0: 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20  ect *pSelect    
9cc0: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66       /* Select f
9cd0: 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e  rom a "CREATE ..
9ce0: 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a  . AS SELECT" */.
9cf0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
9d00: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9d10: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
9d20: 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53  ( (pEnd==0 && pS
9d30: 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61  elect==0) || pPa
9d40: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
9d50: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
9d60: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  ed ) return;.  p
9d70: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
9d80: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
9d90: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
9da0: 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
9db0: 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74  busy || !pSelect
9dc0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
9dd0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
9de0: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
9df0: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
9e00: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
9e10: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
9e20: 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70   or "sqlite_temp
9e30: 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f  _master" table o
9e40: 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a  n the disk..  **
9e50: 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
9e60: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61   to the disk aga
9e70: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
9e80: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
9e90: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74  r.  ** for the t
9ea0: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62  able from the db
9eb0: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66  ->init.newTnum f
9ec0: 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65  ield.  (The page
9ed0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f   number.  ** sho
9ee0: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75  uld have been pu
9ef0: 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73  t there by the s
9f00: 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74  qliteOpenCb rout
9f10: 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ine.).  */.  if(
9f20: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
9f30: 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  {.    p->tnum = 
9f40: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
9f50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
9f60: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
9f70: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72   then create a r
9f80: 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65  ecord for the ne
9f90: 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  w table.  ** in 
9fa0: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
9fb0: 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64  R table of the d
9fc0: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72 65  atabase.  The re
9fd0: 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  cord number.  **
9fe0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
9ff0: 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64 20  le entry should 
a000: 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74 68  already be on th
a010: 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  e stack..  **.  
a020: 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
a030: 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c  TEMPORARY table,
a040: 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79   write the entry
a050: 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69   into the auxili
a060: 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  ary.  ** file in
a070: 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68  stead of into th
a080: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
a090: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
a0a0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
a0b0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
a0c0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
a0d0: 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f  har *zType;    /
a0e0: 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62  * "view" or "tab
a0f0: 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  le" */.    char 
a100: 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56  *zType2;   /* "V
a110: 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20  IEW" or "TABLE" 
a120: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
a130: 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  mt;    /* Text o
a140: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
a150: 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45  LE or CREATE VIE
a160: 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a  W statement */..
a170: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
a180: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
a190: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
a1a0: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69  eturn;..    sqli
a1b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a1c0: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
a1d0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
a1e0: 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72  the rootpage for
a1f0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 61   the new table a
a200: 6e 64 20 70 75 73 68 20 69 74 20 6f 6e 74 6f 20  nd push it onto 
a210: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a  the stack..    *
a220: 2a 20 41 20 76 69 65 77 20 68 61 73 20 6e 6f 20  * A view has no 
a230: 72 6f 6f 74 70 61 67 65 2c 20 73 6f 20 6a 75 73  rootpage, so jus
a240: 74 20 70 75 73 68 20 61 20 7a 65 72 6f 20 6f 6e  t push a zero on
a250: 74 6f 20 74 68 65 20 73 74 61 63 6b 20 66 6f 72  to the stack for
a260: 0a 20 20 20 20 2a 2a 20 76 69 65 77 73 2e 20 20  .    ** views.  
a270: 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65  Initialize zType
a280: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
a290: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
a2a0: 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ( p->pSelect==0 
a2b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65  ){.      /* A re
a2c0: 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20  gular table */. 
a2d0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61       zType = "ta
a2e0: 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70  ble";.      zTyp
a2f0: 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69  e2 = "TABLE";.#i
a300: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a310: 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65  T_VIEW.    }else
a320: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65  {.      /* A vie
a330: 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65  w */.      zType
a340: 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20   = "view";.     
a350: 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22   zType2 = "VIEW"
a360: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
a370: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
a380: 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  s a CREATE TABLE
a390: 20 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e   xx AS SELECT ..
a3a0: 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53  ., execute the S
a3b0: 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61  ELECT.    ** sta
a3c0: 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61  tement to popula
a3d0: 74 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  te the new table
a3e0: 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  . The root-page 
a3f0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20  number for the. 
a400: 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20     ** new table 
a410: 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  is on the top of
a420: 20 74 68 65 20 76 64 62 65 20 73 74 61 63 6b 2e   the vdbe stack.
a430: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
a440: 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68  nce the SELECT h
a450: 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79  as been coded by
a460: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
a470: 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20  , it is in a.   
a480: 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61   ** suitable sta
a490: 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  te to query for 
a4a0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
a4b0: 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65   and types to be
a4c0: 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20   used.    ** by 
a4d0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20  the new table.. 
a4e0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
a4f0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 54  elect ){.      T
a500: 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20  able *pSelTab;. 
a510: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a520: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
a530: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
a540: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a550: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d  , OP_Integer, p-
a560: 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  >iDb, 0);.      
a570: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a580: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
a590: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 1, 0);.      p
a5a0: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b  Parse->nTab = 2;
a5b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
a5c0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
a5d0: 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c  lect, SRT_Table,
a5e0: 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b   1, 0, 0, 0, 0);
a5f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a600: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
a610: 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ose, 1, 0);.    
a620: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
a630: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rr==0 ){.       
a640: 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
a650: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
a660: 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ect(pParse, 0, p
a670: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
a680: 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20   if( pSelTab==0 
a690: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
a6a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
a6b0: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l==0 );.        
a6c0: 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->nCol = pSelTa
a6d0: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->nCol;.       
a6e0: 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54   p->aCol = pSelT
a6f0: 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->aCol;.      
a700: 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
a710: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65  = 0;.        pSe
a720: 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
a730: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
a740: 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53  eleteTable(0, pS
a750: 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a  elTab);.      }.
a760: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
a770: 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65  mpute the comple
a780: 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
a790: 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
a7a0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  */.    if( pSele
a7b0: 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d  ct ){.      zStm
a7c0: 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53  t = createTableS
a7d0: 74 6d 74 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73  tmt(p);.    }els
a7e0: 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 70 45 6e  e{.      n = pEn
a7f0: 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73  d->z - pParse->s
a800: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 20 2b 20 31 3b  NameToken.z + 1;
a810: 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73  .      zStmt = s
a820: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 43  qlite3MPrintf("C
a830: 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20  REATE %s %.*s", 
a840: 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73  zType2, n, pPars
a850: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29  e->sNameToken.z)
a860: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
a870: 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72  A slot for the r
a880: 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64  ecord has alread
a890: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
a8a0: 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   in the .    ** 
a8b0: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
a8c0: 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65  ble.  We just ne
a8d0: 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61  ed to update tha
a8e0: 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a  t slot with all.
a8f0: 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72      ** the infor
a900: 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c  mation we've col
a910: 6c 65 63 74 65 64 2e 20 20 54 68 65 20 72 6f 77  lected.  The row
a920: 69 64 20 66 6f 72 20 74 68 65 20 70 72 65 61 6c  id for the preal
a930: 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 73  located.    ** s
a940: 6c 6f 74 20 69 73 20 74 68 65 20 32 6e 64 20 69  lot is the 2nd i
a950: 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  tem on the stack
a960: 2e 20 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68  .  The top of th
a970: 65 20 73 74 61 63 6b 20 69 73 20 74 68 65 0a 20  e stack is the. 
a980: 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20     ** root page 
a990: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
a9a0: 65 20 28 6f 72 20 61 20 30 20 69 66 20 74 68 69  e (or a 0 if thi
a9b0: 73 20 69 73 20 61 20 76 69 65 77 29 2e 0a 20 20  s is a view)..  
a9c0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
a9d0: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
a9e0: 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54  se,.      "UPDAT
a9f0: 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20  E %Q.%s ".      
aa00: 20 20 20 22 53 45 54 20 74 79 70 65 3d 27 25 73     "SET type='%s
aa10: 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f  ', name=%Q, tbl_
aa20: 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67  name=%Q, rootpag
aa30: 65 3d 23 30 2c 20 73 71 6c 3d 25 51 20 22 0a 20  e=#0, sql=%Q ". 
aa40: 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 77        "WHERE row
aa50: 69 64 3d 23 31 22 2c 0a 20 20 20 20 20 20 64 62  id=#1",.      db
aa60: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 7a 4e  ->aDb[p->iDb].zN
aa70: 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
aa80: 45 28 70 2d 3e 69 44 62 29 2c 0a 20 20 20 20 20  E(p->iDb),.     
aa90: 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d   zType,.      p-
aaa0: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d  >zName,.      p-
aab0: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 7a 53  >zName,.      zS
aac0: 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tmt.    );.    s
aad0: 71 6c 69 74 65 46 72 65 65 28 7a 53 74 6d 74 29  qliteFree(zStmt)
aae0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
aaf0: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c  ngeCookie(db, v,
ab00: 20 70 2d 3e 69 44 62 29 3b 0a 0a 23 69 66 6e 64   p->iDb);..#ifnd
ab10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
ab20: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
ab30: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
ab40: 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63   if we need to c
ab50: 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f  reate an sqlite_
ab60: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66  sequence table f
ab70: 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e  or.    ** keepin
ab80: 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69  g track of autoi
ab90: 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20  ncrement keys.. 
aba0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
abb0: 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20  >autoInc ){.    
abc0: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
abd0: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20  >aDb[p->iDb];.  
abe0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 65      if( pDb->pSe
abf0: 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  qTab==0 ){.     
ac00: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
ac10: 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
ac20: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
ac30: 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f  TABLE %Q.sqlite_
ac40: 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65  sequence(name,se
ac50: 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  q)",.          p
ac60: 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  Db->zName.      
ac70: 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
ac80: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
ac90: 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74  * Reparse everyt
aca0: 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f  hing to update o
acb0: 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61  ur internal data
acc0: 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20   structures */. 
acd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
ace0: 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  3(v, OP_ParseSch
acf0: 65 6d 61 2c 20 70 2d 3e 69 44 62 2c 20 30 2c 0a  ema, p->iDb, 0,.
ad00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
ad10: 50 72 69 6e 74 66 28 22 74 62 6c 5f 6e 61 6d 65  Printf("tbl_name
ad20: 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29  ='%q'",p->zName)
ad30: 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P3_DYNAMIC);. 
ad40: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68   }...  /* Add th
ad50: 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69  e table to the i
ad60: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
ad70: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
ad80: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
ad90: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
ada0: 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72  y && pParse->nEr
adb0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c  r==0 ){.    Tabl
adc0: 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65  e *pOld;.    FKe
add0: 79 20 2a 70 46 4b 65 79 3b 20 0a 20 20 20 20 44  y *pFKey; .    D
ade0: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
adf0: 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 70  b[p->iDb];.    p
ae00: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
ae10: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 74 62  hInsert(&pDb->tb
ae20: 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  lHash, p->zName,
ae30: 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65   strlen(p->zName
ae40: 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  )+1, p);.    if(
ae50: 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61   pOld ){.      a
ae60: 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29  ssert( p==pOld )
ae70: 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
ae80: 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e  t have failed in
ae90: 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28  side HashInsert(
aea0: 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  ) */.      retur
aeb0: 6e 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  n;.    }.#ifndef
aec0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
aed0: 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72  EIGN_KEY.    for
aee0: 28 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b  (pFKey=p->pFKey;
aef0: 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46   pFKey; pFKey=pF
af00: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b  Key->pNextFrom){
af10: 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d  .      int nTo =
af20: 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a   strlen(pFKey->z
af30: 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  To) + 1;.      p
af40: 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20  FKey->pNextTo = 
af50: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
af60: 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 4b  &pDb->aFKey, pFK
af70: 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20  ey->zTo, nTo);. 
af80: 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68       sqlite3Hash
af90: 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 61 46 4b  Insert(&pDb->aFK
afa0: 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20  ey, pFKey->zTo, 
afb0: 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20  nTo, pFKey);.   
afc0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50   }.#endif.    pP
afd0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
afe0: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61  = 0;.    db->nTa
aff0: 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66  ble++;.    db->f
b000: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
b010: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23  nternChanges;..#
b020: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b030: 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20  IT_ALTERTABLE.  
b040: 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63    if( !p->pSelec
b050: 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
b060: 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70  t( !pSelect && p
b070: 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a  Cons && pEnd );.
b080: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d        if( pCons-
b090: 3e 7a 3d 3d 30 20 29 20 70 43 6f 6e 73 20 3d 20  >z==0 ) pCons = 
b0a0: 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61  pEnd;.      p->a
b0b0: 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33  ddColOffset = 13
b0c0: 20 2b 20 28 70 43 6f 6e 73 2d 3e 7a 20 2d 20 70   + (pCons->z - p
b0d0: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
b0e0: 6e 2e 7a 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  n.z);.    }.#end
b0f0: 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  if.  }.}..#ifnde
b100: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
b110: 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72  EW./*.** The par
b120: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
b130: 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20  outine in order 
b140: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
b150: 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  VIEW.*/.void sql
b160: 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a  ite3CreateView(.
b170: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
b180: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
b190: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
b1a0: 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20   Token *pBegin, 
b1b0: 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
b1c0: 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
b1d0: 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ins the statemen
b1e0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
b1f0: 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame1,     /* The
b200: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
b210: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
b220: 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  e view */.  Toke
b230: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
b240: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
b250: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
b260: 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
b270: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
b280: 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20  ,   /* A SELECT 
b290: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77  statement that w
b2a0: 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
b2b0: 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  ew view */.  int
b2c0: 20 69 73 54 65 6d 70 20 20 20 20 20 20 20 20 20   isTemp         
b2d0: 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45  /* TRUE for a TE
b2e0: 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a  MPORARY view */.
b2f0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
b300: 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20   int n;.  const 
b310: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
b320: 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  ;.  Token sEnd;.
b330: 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a    DbFixer sFix;.
b340: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a    Token *pName;.
b350: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
b360: 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  Var>0 ){.    sql
b370: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
b380: 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73  rse, "parameters
b390: 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
b3a0: 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20   in views");.   
b3b0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
b3c0: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
b3d0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
b3e0: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
b3f0: 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65 67 69  le(pParse, pBegi
b400: 6e 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  n, pName1, pName
b410: 32 2c 20 69 73 54 65 6d 70 2c 20 31 29 3b 0a 20  2, isTemp, 1);. 
b420: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
b430: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
b440: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
b450: 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
b460: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
b470: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
b480: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
b490: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
b4a0: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
b4b0: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
b4c0: 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e  if( sqlite3FixIn
b4d0: 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
b4e0: 2c 20 70 2d 3e 69 44 62 2c 20 22 76 69 65 77 22  , p->iDb, "view"
b4f0: 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20  , pName).    && 
b500: 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74  sqlite3FixSelect
b510: 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29  (&sFix, pSelect)
b520: 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
b530: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
b540: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
b550: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  rn;.  }..  /* Ma
b560: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
b570: 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73   entire SELECT s
b580: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
b590: 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
b5a0: 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66    ** This will f
b5b0: 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70  orce all the Exp
b5c0: 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73  r.token.z values
b5d0: 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
b5e0: 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
b5f0: 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f  d rather than po
b600: 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74  int to the input
b610: 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20   string - which 
b620: 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20  means that.  ** 
b630: 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73  they will persis
b640: 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  t after the curr
b650: 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
b660: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e  () call returns.
b670: 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65  .  */.  p->pSele
b680: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
b690: 63 74 44 75 70 28 70 53 65 6c 65 63 74 29 3b 0a  ctDup(pSelect);.
b6a0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
b6b0: 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a  elete(pSelect);.
b6c0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64    if( !pParse->d
b6d0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
b6e0: 20 20 20 20 73 71 6c 69 74 65 33 56 69 65 77 47      sqlite3ViewG
b6f0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
b700: 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20  arse, p);.  }.. 
b710: 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65   /* Locate the e
b720: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
b730: 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e   VIEW statement.
b740: 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e    Make sEnd poin
b750: 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e  t to.  ** the en
b760: 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d  d..  */.  sEnd =
b770: 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f   pParse->sLastTo
b780: 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e  ken;.  if( sEnd.
b790: 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e  z[0]!=0 && sEnd.
b7a0: 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20  z[0]!=';' ){.   
b7b0: 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e   sEnd.z += sEnd.
b7c0: 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20  n;.  }.  sEnd.n 
b7d0: 3d 20 30 3b 0a 20 20 6e 20 3d 20 73 45 6e 64 2e  = 0;.  n = sEnd.
b7e0: 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20  z - pBegin->z;. 
b7f0: 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69   z = (const unsi
b800: 67 6e 65 64 20 63 68 61 72 2a 29 70 42 65 67 69  gned char*)pBegi
b810: 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e  n->z;.  while( n
b820: 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27  >0 && (z[n-1]=='
b830: 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b  ;' || isspace(z[
b840: 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d  n-1])) ){ n--; }
b850: 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
b860: 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
b870: 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c  1;..  /* Use sql
b880: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74  ite3EndTable() t
b890: 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74  o add the view t
b8a0: 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  o the SQLITE_MAS
b8b0: 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  TER table */.  s
b8c0: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70  qlite3EndTable(p
b8d0: 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c  Parse, 0, &sEnd,
b8e0: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d   0);.  return;.}
b8f0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b900: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
b910: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b920: 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54  MIT_VIEW./*.** T
b930: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
b940: 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61  re pTable is rea
b950: 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c  lly a VIEW.  Fil
b960: 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  l in the names o
b970: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73  f.** the columns
b980: 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20   of the view in 
b990: 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63  the pTable struc
b9a0: 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68  ture.  Return th
b9b0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65  e number.** of e
b9c0: 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72  rrors.  If an er
b9d0: 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76  ror is seen leav
b9e0: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
b9f0: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
ba00: 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
ba10: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
ba20: 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70  mnNames(Parse *p
ba30: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
ba40: 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  able){.  Table *
ba50: 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20  pSelTab;   /* A 
ba60: 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20  fake table from 
ba70: 77 68 69 63 68 20 77 65 20 67 65 74 20 74 68 65  which we get the
ba80: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
ba90: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20   Select *pSel;  
baa0: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68     /* Copy of th
bab0: 65 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d  e SELECT that im
bac0: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
bad0: 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20  w */.  int nErr 
bae0: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  = 0;     /* Numb
baf0: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63  er of errors enc
bb00: 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e  ountered */.  in
bb10: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
bb20: 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68  /* Temporarily h
bb30: 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20  olds the number 
bb40: 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73 69 67  of cursors assig
bb50: 6e 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ned */..  assert
bb60: 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f  ( pTable );..  /
bb70: 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f  * A positive nCo
bb80: 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75  l means the colu
bb90: 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68  mns names for th
bba0: 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a  is view are.  **
bbb0: 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a   already known..
bbc0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
bbd0: 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75  e->nCol>0 ) retu
bbe0: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65  rn 0;..  /* A ne
bbf0: 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61  gative nCol is a
bc00: 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20   special marker 
bc10: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20  meaning that we 
bc20: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  are currently.  
bc30: 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d  ** trying to com
bc40: 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pute the column 
bc50: 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e  names.  If we en
bc60: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
bc70: 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67   with.  ** a neg
bc80: 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d  ative nCol, it m
bc90: 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65  eans two or more
bca0: 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f   views form a lo
bcb0: 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  op, like this:. 
bcc0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45   **.  **     CRE
bcd0: 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20  ATE VIEW one AS 
bce0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77  SELECT * FROM tw
bcf0: 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  o;.  **     CREA
bd00: 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53  TE VIEW two AS S
bd10: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65  ELECT * FROM one
bd20: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75  ;.  **.  ** Actu
bd30: 61 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f 72  ally, this error
bd40: 20 69 73 20 63 61 75 67 68 74 20 70 72 65 76 69   is caught previ
bd50: 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68 65  ously and so the
bd60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a   following test.
bd70: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61    ** should alwa
bd80: 79 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65  ys fail.  But we
bd90: 20 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20 69   will leave it i
bda0: 6e 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f 20  n place just to 
bdb0: 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 23 69  be safe..  */.#i
bdc0: 66 20 30 0a 20 20 69 66 28 20 70 54 61 62 6c 65  f 0.  if( pTable
bdd0: 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ->nCol<0 ){.    
bde0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
bdf0: 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73  pParse, "view %s
be00: 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64   is circularly d
be10: 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d  efined", pTable-
be20: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
be30: 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 1;.  }.#endi
be40: 66 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  f.  assert( pTab
be50: 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a  le->nCol>=0 );..
be60: 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
be70: 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
be80: 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d  s we need to com
be90: 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e  pute the table n
bea0: 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20  ames..  ** Note 
beb0: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f  that the call to
bec0: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
bed0: 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c  tOfSelect() will
bee0: 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a   expand any.  **
bef0: 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e   "*" elements in
bf00: 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65 74   the results set
bf10: 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e 64   of the view and
bf20: 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72   will assign cur
bf30: 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  sors.  ** to the
bf40: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
bf50: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42   FROM clause.  B
bf60: 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e  ut we do not wan
bf70: 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a  t these changes.
bf80: 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61    ** to be perma
bf90: 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f  nent.  So the co
bfa0: 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e  mputation is don
bfb0: 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74  e on a copy of t
bfc0: 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73  he SELECT.  ** s
bfd0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
bfe0: 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
bff0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
c000: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29  Table->pSelect )
c010: 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74  ;.  pSel = sqlit
c020: 65 33 53 65 6c 65 63 74 44 75 70 28 70 54 61 62  e3SelectDup(pTab
c030: 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  le->pSelect);.  
c040: 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  n = pParse->nTab
c050: 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  ;.  sqlite3SrcLi
c060: 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
c070: 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53  pParse, pSel->pS
c080: 72 63 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  rc);.  pTable->n
c090: 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c  Col = -1;.  pSel
c0a0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
c0b0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
c0c0: 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b  Parse, 0, pSel);
c0d0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20  .  pParse->nTab 
c0e0: 3d 20 6e 3b 0a 20 20 69 66 28 20 70 53 65 6c 54  = n;.  if( pSelT
c0f0: 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
c100: 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d  ( pTable->aCol==
c110: 30 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  0 );.    pTable-
c120: 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
c130: 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 6c  >nCol;.    pTabl
c140: 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->aCol = pSelTa
c150: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65  b->aCol;.    pSe
c160: 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
c170: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
c180: 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  l = 0;.    sqlit
c190: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  e3DeleteTable(0,
c1a0: 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 44   pSelTab);.    D
c1b0: 62 53 65 74 50 72 6f 70 65 72 74 79 28 70 50 61  bSetProperty(pPa
c1c0: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 6c 65 2d  rse->db, pTable-
c1d0: 3e 69 44 62 2c 20 44 42 5f 55 6e 72 65 73 65 74  >iDb, DB_Unreset
c1e0: 56 69 65 77 73 29 3b 0a 20 20 7d 65 6c 73 65 7b  Views);.  }else{
c1f0: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  .    pTable->nCo
c200: 6c 20 3d 20 30 3b 0a 20 20 20 20 6e 45 72 72 2b  l = 0;.    nErr+
c210: 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  +;.  }.  sqlite3
c220: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
c230: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45 72  l);.  return nEr
c240: 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  r;  .}.#endif /*
c250: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
c260: 57 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  W */..#ifndef SQ
c270: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
c280: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
c290: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
c2a0: 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64   every VIEW in d
c2b0: 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a  atabase idx..*/.
c2c0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
c2d0: 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73  teViewResetAll(s
c2e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
c2f0: 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  idx){.  HashElem
c300: 20 2a 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61   *i;.  if( !DbHa
c310: 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  sProperty(db, id
c320: 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
c330: 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ws) ) return;.  
c340: 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
c350: 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69  First(&db->aDb[i
c360: 64 78 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69 3b  dx].tblHash); i;
c370: 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   i=sqliteHashNex
c380: 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  t(i)){.    Table
c390: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
c3a0: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
c3b0: 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
c3c0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
c3d0: 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  eResetColumnName
c3e0: 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  s(pTab);.    }. 
c3f0: 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70   }.  DbClearProp
c400: 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
c410: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a  _UnresetViews);.
c420: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
c430: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
c440: 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20  All(A,B).#endif 
c450: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
c460: 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  IEW */../*.** Th
c470: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
c480: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42  alled by the VDB
c490: 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  E to adjust the 
c4a0: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a  internal schema.
c4b0: 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74  ** used by SQLit
c4c0: 65 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65  e when the btree
c4d0: 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74   layer moves a t
c4e0: 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20  able root page. 
c4f0: 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65  The.** root-page
c500: 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69   of a table or i
c510: 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65  ndex in database
c520: 20 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64   iDb has changed
c530: 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74   from iFrom.** t
c540: 6f 20 69 54 6f 2e 0a 2a 2f 0a 23 69 66 6e 64 65  o iTo..*/.#ifnde
c550: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
c560: 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71  TOVACUUM.void sq
c570: 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76  lite3RootPageMov
c580: 65 64 28 44 62 20 2a 70 44 62 2c 20 69 6e 74 20  ed(Db *pDb, int 
c590: 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
c5a0: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  .  HashElem *pEl
c5b0: 65 6d 3b 0a 20 20 0a 20 20 66 6f 72 28 70 45 6c  em;.  .  for(pEl
c5c0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
c5d0: 73 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68  st(&pDb->tblHash
c5e0: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
c5f0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
c600: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
c610: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
c620: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
c630: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74  .    if( pTab->t
c640: 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  num==iFrom ){.  
c650: 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d      pTab->tnum =
c660: 20 69 54 6f 3b 0a 20 20 20 20 20 20 72 65 74 75   iTo;.      retu
c670: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
c680: 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
c690: 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
c6a0: 69 64 78 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  idxHash); pElem;
c6b0: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
c6c0: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
c6d0: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
c6e0: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
c6f0: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  pElem);.    if( 
c700: 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f  pIdx->tnum==iFro
c710: 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  m ){.      pIdx-
c720: 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20  >tnum = iTo;.   
c730: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
c740: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 30 29  .  }.  assert(0)
c750: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
c760: 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20  * Write code to 
c770: 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65 20  erase the table 
c780: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
c790: 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62  Table from datab
c7a0: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f  ase iDb..** Also
c7b0: 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d   write code to m
c7c0: 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74 65  odify the sqlite
c7d0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e  _master table an
c7e0: 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  d internal schem
c7f0: 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70  a.** if a root-p
c800: 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74  age of another t
c810: 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79  able is moved by
c820: 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72   the btree-layer
c830: 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69   whilst.** erasi
c840: 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73 20  ng iTable (this 
c850: 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20  can happen with 
c860: 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
c870: 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74  atabase)..*/ .st
c880: 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
c890: 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20  yRootPage(Parse 
c8a0: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61  *pParse, int iTa
c8b0: 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  ble, int iDb){. 
c8c0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
c8d0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
c8e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
c8f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74  AddOp(v, OP_Dest
c900: 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 69 44 62  roy, iTable, iDb
c910: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
c920: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
c930: 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f  M.  /* OP_Destro
c940: 79 20 70 75 73 68 65 73 20 61 6e 20 69 6e 74 65  y pushes an inte
c950: 67 65 72 20 6f 6e 74 6f 20 74 68 65 20 73 74 61  ger onto the sta
c960: 63 6b 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65  ck. If this inte
c970: 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d  ger.  ** is non-
c980: 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73  zero, then it is
c990: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
c9a0: 75 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65  umber of a table
c9b0: 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c   moved to.  ** l
c9c0: 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20  ocation iTable. 
c9d0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
c9e0: 64 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20  de modifies the 
c9f0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
ca00: 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c  ble to.  ** refl
ca10: 65 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20  ect this..  **. 
ca20: 20 2a 2a 20 54 68 65 20 22 23 30 22 20 69 6e 20   ** The "#0" in 
ca30: 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65  the SQL is a spe
ca40: 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68  cial constant th
ca50: 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65  at means whateve
ca60: 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20  r value.  ** is 
ca70: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  on the top of th
ca80: 65 20 73 74 61 63 6b 2e 20 20 53 65 65 20 73 71  e stack.  See sq
ca90: 6c 69 74 65 33 52 65 67 69 73 74 65 72 45 78 70  lite3RegisterExp
caa0: 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  r()..  */.  sqli
cab0: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
cac0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50  Parse, .     "UP
cad0: 44 41 54 45 20 25 51 2e 25 73 20 53 45 54 20 72  DATE %Q.%s SET r
cae0: 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52 45  ootpage=%d WHERE
caf0: 20 23 30 20 41 4e 44 20 72 6f 6f 74 70 61 67 65   #0 AND rootpage
cb00: 3d 23 30 22 2c 0a 20 20 20 20 20 70 50 61 72 73  =#0",.     pPars
cb10: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
cb20: 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
cb30: 42 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c 65  BLE(iDb), iTable
cb40: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
cb50: 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63 6f  ** Write VDBE co
cb60: 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c  de to erase tabl
cb70: 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61  e pTab and all a
cb80: 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65  ssociated indice
cb90: 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f  s on disk..** Co
cba0: 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  de to update the
cbb0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
cbc0: 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e  ables and intern
cbd0: 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69  al schema defini
cbe0: 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65  tions.** in case
cbf0: 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c   a root-page bel
cc00: 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65  onging to anothe
cc10: 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64  r table is moved
cc20: 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c 61   by the btree la
cc30: 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61  yer.** is also a
cc40: 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20 68  dded (this can h
cc50: 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75  appen with an au
cc60: 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
cc70: 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  se)..*/.static v
cc80: 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65  oid destroyTable
cc90: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
cca0: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69  Table *pTab){.#i
ccb0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
ccc0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e  _AUTOVACUUM.  In
ccd0: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 64 65 73  dex *pIdx;.  des
cce0: 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
ccf0: 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  rse, pTab->tnum,
cd00: 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 66   pTab->iDb);.  f
cd10: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
cd20: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
cd30: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
cd40: 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61     destroyRootPa
cd50: 67 65 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d  ge(pParse, pIdx-
cd60: 3e 74 6e 75 6d 2c 20 70 49 64 78 2d 3e 69 44 62  >tnum, pIdx->iDb
cd70: 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f  );.  }.#else.  /
cd80: 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
cd90: 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61  e may be auto-va
cda0: 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66  cuum capable (if
cdb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
cdc0: 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20  OVACUUM.  ** is 
cdd0: 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68  not defined), th
cde0: 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  en it is importa
cdf0: 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65  nt to call OP_De
ce00: 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a  stroy on the.  *
ce10: 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  * table and inde
ce20: 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20  x root-pages in 
ce30: 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20  order, starting 
ce40: 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63  with the numeric
ce50: 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65  ally .  ** large
ce60: 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  st root-page num
ce70: 62 65 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e  ber. This guaran
ce80: 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f  tees that none o
ce90: 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73  f the root-pages
cea0: 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74  .  ** to be dest
ceb0: 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74  royed is relocat
cec0: 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
ced0: 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65   OP_Destroy. i.e
cee0: 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f  . if the.  ** fo
cef0: 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64  llowing were cod
cf00: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50  ed:.  **.  ** OP
cf10: 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a  _Destroy 4 0.  *
cf20: 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65  * ....  ** OP_De
cf30: 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20  stroy 5 0.  **. 
cf40: 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67   ** and root pag
cf50: 65 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20  e 5 happened to 
cf60: 62 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  be the largest r
cf70: 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20  oot-page number 
cf80: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
cf90: 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20  base, then root 
cfa0: 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20  page 5 would be 
cfb0: 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34 20  moved to page 4 
cfc0: 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50  by the .  ** "OP
cfd0: 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70  _Destroy 4 0" op
cfe0: 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65 71  code. The subseq
cff0: 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79  uent "OP_Destroy
d000: 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a   5 0" would hit.
d010: 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74    ** a free-list
d020: 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e   page..  */.  in
d030: 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74  t iTab = pTab->t
d040: 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74  num;.  int iDest
d050: 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68  royed = 0;..  wh
d060: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e  ile( 1 ){.    In
d070: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69  dex *pIdx;.    i
d080: 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b  nt iLargest = 0;
d090: 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73 74 72  ..    if( iDestr
d0a0: 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c  oyed==0 || iTab<
d0b0: 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20  iDestroyed ){.  
d0c0: 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69      iLargest = i
d0d0: 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  Tab;.    }.    f
d0e0: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
d0f0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
d100: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
d110: 20 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20       int iIdx = 
d120: 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20  pIdx->tnum;.    
d130: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
d140: 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29  iDb==pTab->iDb )
d150: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65  ;.      if( (iDe
d160: 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69  stroyed==0 || (i
d170: 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29  Idx<iDestroyed))
d180: 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73   && iIdx>iLarges
d190: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61  t ){.        iLa
d1a0: 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20  rgest = iIdx;.  
d1b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d1c0: 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20  if( iLargest==0 
d1d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 64 65  ) return;.    de
d1e0: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
d1f0: 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20  arse, iLargest, 
d200: 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20  pTab->iDb);.    
d210: 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61  iDestroyed = iLa
d220: 72 67 65 73 74 3b 0a 20 20 7d 0a 23 65 6e 64 69  rgest;.  }.#endi
d230: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  f.}../*.** This 
d240: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
d250: 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b  d to do the work
d260: 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45   of a DROP TABLE
d270: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70   statement..** p
d280: 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  Name is the name
d290: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
d2a0: 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a   be dropped..*/.
d2b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
d2c0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
d2d0: 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
d2e0: 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 29  ame, int isView)
d2f0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
d300: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
d310: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
d320: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
d330: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
d340: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
d350: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
d360: 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70  ) goto exit_drop
d370: 5f 74 61 62 6c 65 3b 0a 20 20 61 73 73 65 72 74  _table;.  assert
d380: 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
d390: 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   );.  pTab = sql
d3a0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
d3b0: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61  pParse, pName->a
d3c0: 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  [0].zName, pName
d3d0: 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
d3e0: 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  );..  if( pTab==
d3f0: 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72  0 ) goto exit_dr
d400: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69 44 62 20  op_table;.  iDb 
d410: 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 61  = pTab->iDb;.  a
d420: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
d430: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
d440: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d450: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
d460: 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
d470: 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  de;.    const ch
d480: 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
d490: 41 5f 54 41 42 4c 45 28 70 54 61 62 2d 3e 69 44  A_TABLE(pTab->iD
d4a0: 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  b);.    const ch
d4b0: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
d4c0: 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61  b[pTab->iDb].zNa
d4d0: 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
d4e0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
d4f0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
d500: 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
d510: 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  )){.      goto e
d520: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
d530: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
d540: 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66  View ){.      if
d550: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
d560: 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  & iDb==1 ){.    
d570: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
d580: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57  E_DROP_TEMP_VIEW
d590: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d5a0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
d5b0: 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a  LITE_DROP_VIEW;.
d5c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
d5d0: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  e{.      if( !OM
d5e0: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
d5f0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
d600: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
d610: 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  P_TEMP_TABLE;.  
d620: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d630: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
d640: 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _DROP_TABLE;.   
d650: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
d660: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
d670: 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
d680: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
d690: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
d6a0: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
d6b0: 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
d6c0: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
d6d0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
d6e0: 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62  ITE_DELETE, pTab
d6f0: 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
d700: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
d710: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
d720: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
d730: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61  .  if( pTab->rea
d740: 64 4f 6e 6c 79 20 7c 7c 20 70 54 61 62 3d 3d 64  dOnly || pTab==d
d750: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 65 71  b->aDb[iDb].pSeq
d760: 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Tab ){.    sqlit
d770: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
d780: 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
d790: 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22   not be dropped"
d7a0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
d7b0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
d7c0: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23  op_table;.  }..#
d7d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d7e0: 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73  IT_VIEW.  /* Ens
d7f0: 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69  ure DROP TABLE i
d800: 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20  s not used on a 
d810: 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56  view, and DROP V
d820: 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a  IEW is not used.
d830: 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e    ** on a table.
d840: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69  .  */.  if( isVi
d850: 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
d860: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
d870: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
d880: 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
d890: 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20  TABLE to delete 
d8a0: 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d  table %s", pTab-
d8b0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
d8c0: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
d8d0: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73  e;.  }.  if( !is
d8e0: 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
d8f0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
d900: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
d910: 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56  rse, "use DROP V
d920: 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69  IEW to delete vi
d930: 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  ew %s", pTab->zN
d940: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
d950: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
d960: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
d970: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
d980: 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62  o remove the tab
d990: 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  le from the mast
d9a0: 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e  er table.  ** on
d9b0: 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20   disk..  */.  v 
d9c0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
d9d0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
d9e0: 76 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72  v ){.    Trigger
d9f0: 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20   *pTrigger;.    
da00: 69 6e 74 20 69 44 62 20 3d 20 70 54 61 62 2d 3e  int iDb = pTab->
da10: 69 44 62 3b 0a 20 20 20 20 44 62 20 2a 70 44 62  iDb;.    Db *pDb
da20: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
da30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
da40: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
da50: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
da60: 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61  ;..    /* Drop a
da70: 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f  ll triggers asso
da80: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
da90: 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
daa0: 70 65 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a  ped. Code.    **
dab0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f   is generated to
dac0: 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20   remove entries 
dad0: 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74  from sqlite_mast
dae0: 65 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a  er and/or.    **
daf0: 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
db00: 74 65 72 20 69 66 20 72 65 71 75 69 72 65 64 2e  ter if required.
db10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 72 69  .    */.    pTri
db20: 67 67 65 72 20 3d 20 70 54 61 62 2d 3e 70 54 72  gger = pTab->pTr
db30: 69 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65  igger;.    while
db40: 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20  ( pTrigger ){.  
db50: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
db60: 67 67 65 72 2d 3e 69 44 62 3d 3d 69 44 62 20 7c  gger->iDb==iDb |
db70: 7c 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d  | pTrigger->iDb=
db80: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
db90: 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74  te3DropTriggerPt
dba0: 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67  r(pParse, pTrigg
dbb0: 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 54  er, 1);.      pT
dbc0: 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65  rigger = pTrigge
dbd0: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
dbe0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
dbf0: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
dc00: 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  NT.    /* Remove
dc10: 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20   any entries of 
dc20: 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
dc30: 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69  nce table associ
dc40: 61 74 65 64 20 77 69 74 68 0a 20 20 20 20 2a 2a  ated with.    **
dc50: 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
dc60: 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69   dropped. This i
dc70: 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68  s done before th
dc80: 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70  e table is dropp
dc90: 65 64 0a 20 20 20 20 2a 2a 20 61 74 20 74 68 65  ed.    ** at the
dca0: 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e   btree level, in
dcb0: 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65   case the sqlite
dcc0: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
dcd0: 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
dce0: 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74  move as a result
dcf0: 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61   of the drop (ca
dd00: 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f  n happen in auto
dd10: 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20  -vacuum mode).. 
dd20: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
dd30: 61 62 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20  ab->autoInc ){. 
dd40: 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
dd50: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
dd60: 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20          "DELETE 
dd70: 46 52 4f 4d 20 25 73 2e 73 71 6c 69 74 65 5f 73  FROM %s.sqlite_s
dd80: 65 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61  equence WHERE na
dd90: 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20  me=%Q",.        
dda0: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62  pDb->zName, pTab
ddb0: 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b  ->zName.      );
ddc0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
ddd0: 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53     /* Drop all S
dde0: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
ddf0: 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74  le and index ent
de00: 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20  ries that refer 
de10: 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 61  to the.    ** ta
de20: 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d  ble. The program
de30: 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f   name loops thro
de40: 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20 74  ugh the master t
de50: 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73  able and deletes
de60: 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 6f  .    ** every ro
de70: 77 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  w that refers to
de80: 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20   a table of the 
de90: 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
dea0: 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 20 20 2a   one being.    *
deb0: 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67  * dropped. Trigg
dec0: 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20  ers are handled 
ded0: 73 65 70 65 72 61 74 65 6c 79 20 62 65 63 61 75  seperately becau
dee0: 73 65 20 61 20 74 72 69 67 67 65 72 20 63 61 6e  se a trigger can
def0: 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74   be.    ** creat
df00: 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64  ed in the temp d
df10: 61 74 61 62 61 73 65 20 74 68 61 74 20 72 65 66  atabase that ref
df20: 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69  ers to a table i
df30: 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a  n another.    **
df40: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a   database..    *
df50: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
df60: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
df70: 20 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54   .        "DELET
df80: 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
df90: 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61  RE tbl_name=%Q a
dfa0: 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67 67 65  nd type!='trigge
dfb0: 72 27 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62  r'",.        pDb
dfc0: 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ->zName, SCHEMA_
dfd0: 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61 62  TABLE(iDb), pTab
dfe0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ->zName);.    if
dff0: 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20  ( !isView ){.   
e000: 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28     destroyTable(
e010: 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
e020: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d     }..    /* Rem
e030: 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e  ove the table en
e040: 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27  try from SQLite'
e050: 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  s internal schem
e060: 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20 20  a and modify.   
e070: 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63   ** the schema c
e080: 6f 6f 6b 69 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ookie..    */.  
e090: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
e0a0: 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65  (v, OP_DropTable
e0b0: 2c 20 69 44 62 2c 20 30 2c 20 70 54 61 62 2d 3e  , iDb, 0, pTab->
e0c0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
e0d0: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
e0e0: 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a  ie(db, v, iDb);.
e0f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77    }.  sqliteView
e100: 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62  ResetAll(db, iDb
e110: 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61  );..exit_drop_ta
e120: 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  ble:.  sqlite3Sr
e130: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d  cListDelete(pNam
e140: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  e);.}../*.** Thi
e150: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
e160: 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
e170: 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  new foreign key 
e180: 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  on the table.** 
e190: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
e1a0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70  construction.  p
e1b0: 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e  FromCol determin
e1c0: 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73  es which columns
e1d0: 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65  .** in the curre
e1e0: 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74  nt table point t
e1f0: 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  o the foreign ke
e200: 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d  y.  If pFromCol=
e210: 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65  =0 then.** conne
e220: 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68  ct the key to th
e230: 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e  e last column in
e240: 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20  serted.  pTo is 
e250: 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74  the name of.** t
e260: 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65  he table referre
e270: 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73  d to.  pToCol is
e280: 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65   a list of table
e290: 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a  s in the other.*
e2a0: 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61 74  * pTo table that
e2b0: 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
e2c0: 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61   points to.  fla
e2d0: 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  gs contains all.
e2e0: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** information a
e2f0: 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63  bout the conflic
e300: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
e310: 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65  orithms specifie
e320: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44  d.** in the ON D
e330: 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45  ELETE, ON UPDATE
e340: 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63   and ON INSERT c
e350: 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  lauses..**.** An
e360: 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20   FKey structure 
e370: 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61  is created and a
e380: 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
e390: 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75  e currently.** u
e3a0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
e3b0: 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d  n in the pParse-
e3c0: 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64  >pNewTable field
e3d0: 2e 20 20 54 68 65 20 6e 65 77 20 46 4b 65 79 0a  .  The new FKey.
e3e0: 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65 64  ** is not linked
e3f0: 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65 79 20   into db->aFKey 
e400: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 2d 20  at this point - 
e410: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 68 61  that does not ha
e420: 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73 71  ppen.** until sq
e430: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e  lite3EndTable().
e440: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69  .**.** The forei
e450: 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f  gn key is set fo
e460: 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63  r IMMEDIATE proc
e470: 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65  essing.  A subse
e480: 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f  quent call.** to
e490: 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
e4a0: 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20  eignKey() might 
e4b0: 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44  change this to D
e4c0: 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64  EFERRED..*/.void
e4d0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f   sqlite3CreateFo
e4e0: 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73  reignKey(.  Pars
e4f0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
e500: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
e510: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
e520: 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a  t *pFromCol,  /*
e530: 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73   Columns in this
e540: 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e   table that poin
e550: 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65  t to other table
e560: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f   */.  Token *pTo
e570: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ,          /* Na
e580: 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  me of the other 
e590: 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
e5a0: 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20  ist *pToCol,    
e5b0: 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
e5c0: 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
e5d0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
e5e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c          /* Confl
e5f0: 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
e600: 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b  lgorithms. */.){
e610: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e620: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
e630: 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d  .  FKey *pFKey =
e640: 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d   0;.  Table *p =
e650: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
e660: 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  le;.  int nByte;
e670: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
e680: 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nCol;.  char *z;
e690: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21  ..  assert( pTo!
e6a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
e6b0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
e6c0: 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
e6d0: 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
e6e0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  0 ){.    int iCo
e6f0: 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  l = p->nCol-1;. 
e700: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
e710: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
e720: 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
e730: 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20  ToCol->nExpr!=1 
e740: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e750: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
e760: 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e   "foreign key on
e770: 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20   %s".         " 
e780: 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65  should reference
e790: 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e   only one column
e7a0: 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20   of table %T",. 
e7b0: 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b          p->aCol[
e7c0: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f  iCol].zName, pTo
e7d0: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  );.      goto fk
e7e0: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
e7f0: 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  nCol = 1;.  }els
e800: 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20  e if( pToCol && 
e810: 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70  pToCol->nExpr!=p
e820: 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29  FromCol->nExpr )
e830: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
e840: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
e850: 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66        "number of
e860: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65   columns in fore
e870: 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ign key does not
e880: 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65   match the numbe
e890: 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22  r of ".        "
e8a0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
e8b0: 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22  eferenced table"
e8c0: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  );.    goto fk_e
e8d0: 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  nd;.  }else{.   
e8e0: 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c   nCol = pFromCol
e8f0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e  ->nExpr;.  }.  n
e900: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
e910: 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a  FKey) + nCol*siz
e920: 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  eof(pFKey->aCol[
e930: 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31  0]) + pTo->n + 1
e940: 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  ;.  if( pToCol )
e950: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
e960: 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20  <pToCol->nExpr; 
e970: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  i++){.      nByt
e980: 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43  e += strlen(pToC
e990: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20  ol->a[i].zName) 
e9a0: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  + 1;.    }.  }. 
e9b0: 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d   pFKey = sqliteM
e9c0: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a  alloc( nByte );.
e9d0: 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29    if( pFKey==0 )
e9e0: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
e9f0: 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70  pFKey->pFrom = p
ea00: 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  ;.  pFKey->pNext
ea10: 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b  From = p->pFKey;
ea20: 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70  .  z = (char*)&p
ea30: 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79  FKey[1];.  pFKey
ea40: 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75 63 74  ->aCol = (struct
ea50: 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a   sColMap*)z;.  z
ea60: 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63   += sizeof(struc
ea70: 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b  t sColMap)*nCol;
ea80: 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20  .  pFKey->zTo = 
ea90: 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70  z;.  memcpy(z, p
eaa0: 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a  To->z, pTo->n);.
eab0: 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b    z[pTo->n] = 0;
eac0: 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31  .  z += pTo->n+1
ead0: 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  ;.  pFKey->pNext
eae0: 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d  To = 0;.  pFKey-
eaf0: 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  >nCol = nCol;.  
eb00: 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
eb10: 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  ){.    pFKey->aC
eb20: 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d  ol[0].iFrom = p-
eb30: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65  >nCol-1;.  }else
eb40: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
eb50: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
eb60: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
eb70: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43  for(j=0; j<p->nC
eb80: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
eb90: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
eba0: 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ICmp(p->aCol[j].
ebb0: 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d  zName, pFromCol-
ebc0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
ebd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b  ){.          pFK
ebe0: 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f  ey->aCol[i].iFro
ebf0: 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  m = j;.         
ec00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
ec10: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
ec20: 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29  if( j>=p->nCol )
ec30: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ec40: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
ec50: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e  , .          "un
ec60: 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25  known column \"%
ec70: 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  s\" in foreign k
ec80: 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20  ey definition", 
ec90: 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d  .          pFrom
eca0: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
ecb0: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
ecc0: 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  k_end;.      }. 
ecd0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
ece0: 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
ecf0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
ed00: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  +){.      int n 
ed10: 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d  = strlen(pToCol-
ed20: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
ed30: 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
ed40: 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20  i].zCol = z;.   
ed50: 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f     memcpy(z, pTo
ed60: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  Col->a[i].zName,
ed70: 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20   n);.      z[n] 
ed80: 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  = 0;.      z += 
ed90: 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n+1;.    }.  }. 
eda0: 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
edb0: 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d  ed = 0;.  pFKey-
edc0: 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c  >deleteConf = fl
edd0: 61 67 73 20 26 20 30 78 66 66 3b 0a 20 20 70 46  ags & 0xff;.  pF
ede0: 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20  Key->updateConf 
edf0: 3d 20 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20  = (flags >> 8 ) 
ee00: 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d  & 0xff;.  pFKey-
ee10: 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 66  >insertConf = (f
ee20: 6c 61 67 73 20 3e 3e 20 31 36 20 29 20 26 20 30  lags >> 16 ) & 0
ee30: 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  xff;..  /* Link 
ee40: 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
ee50: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20  to the table as 
ee60: 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20  the last step.. 
ee70: 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d   */.  p->pFKey =
ee80: 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20   pFKey;.  pFKey 
ee90: 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20  = 0;..fk_end:.  
eea0: 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79  sqliteFree(pFKey
eeb0: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  );.#endif /* !de
eec0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
eed0: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a  T_FOREIGN_KEY) *
eee0: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  /.  sqlite3ExprL
eef0: 69 73 74 44 65 6c 65 74 65 28 70 46 72 6f 6d 43  istDelete(pFromC
ef00: 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ol);.  sqlite3Ex
ef10: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 54 6f  prListDelete(pTo
ef20: 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Col);.}../*.** T
ef30: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
ef40: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e  alled when an IN
ef50: 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
ef60: 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44  E or INITIALLY D
ef70: 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73  EFERRED.** claus
ef80: 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61 72  e is seen as par
ef90: 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b  t of a foreign k
efa0: 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20  ey definition.  
efb0: 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a  The isDeferred.*
efc0: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 31  * parameter is 1
efd0: 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44   for INITIALLY D
efe0: 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f  EFERRED and 0 fo
eff0: 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  r INITIALLY IMME
f000: 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65  DIATE..** The be
f010: 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f  havior of the mo
f020: 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61  st recently crea
f030: 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ted foreign key 
f040: 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61  is adjusted.** a
f050: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76  ccordingly..*/.v
f060: 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 65 72  oid sqlite3Defer
f070: 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65  ForeignKey(Parse
f080: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73   *pParse, int is
f090: 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64  Deferred){.#ifnd
f0a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
f0b0: 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62  OREIGN_KEY.  Tab
f0c0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79  le *pTab;.  FKey
f0d0: 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28   *pFKey;.  if( (
f0e0: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
f0f0: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20  NewTable)==0 || 
f100: 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70  (pFKey = pTab->p
f110: 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72  FKey)==0 ) retur
f120: 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65  n;.  pFKey->isDe
f130: 66 65 72 72 65 64 20 3d 20 69 73 44 65 66 65 72  ferred = isDefer
f140: 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  red;.#endif.}../
f150: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
f160: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61  de that will era
f170: 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e  se and refill in
f180: 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73  dex *pIdx.  This
f190: 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69   is.** used to i
f1a0: 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c  nitialize a newl
f1b0: 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78 20  y created index 
f1c0: 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20  or to recompute 
f1d0: 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
f1e0: 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65  f an index in re
f1f0: 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e  sponse to a REIN
f200: 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  DEX command..**.
f210: 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67  ** if memRootPag
f220: 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76  e is not negativ
f230: 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
f240: 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65   the index is ne
f250: 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20  wly.** created. 
f260: 20 54 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   The memory cell
f270: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65   specified by me
f280: 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69  mRootPage contai
f290: 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  ns the.** root p
f2a0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
f2b0: 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d  e index.  If mem
f2c0: 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61  RootPage is nega
f2d0: 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tive, then.** th
f2e0: 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
f2f0: 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20  exists and must 
f300: 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
f310: 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64  e being refilled
f320: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74   and.** the root
f330: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
f340: 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b  the index is tak
f350: 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e  en from pIndex->
f360: 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tnum..*/.static 
f370: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69  void sqlite3Refi
f380: 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  llIndex(Parse *p
f390: 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
f3a0: 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f  ndex, int memRoo
f3b0: 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20  tPage){.  Table 
f3c0: 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
f3d0: 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20  pTable;  /* The 
f3e0: 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e  table that is in
f3f0: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  dexed */.  int i
f400: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
f410: 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 42 74 72  ab;       /* Btr
f420: 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
f430: 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  or pTab */.  int
f440: 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e   iIdx = pParse->
f450: 6e 54 61 62 2b 31 3b 20 20 20 20 20 2f 2a 20 42  nTab+1;     /* B
f460: 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
f470: 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20   for pIndex */. 
f480: 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
f490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4a0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f  /* Address of to
f4b0: 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  p of loop */.  i
f4c0: 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  nt tnum;        
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f4e0: 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e   Root page of in
f4f0: 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  dex */.  Vdbe *v
f500: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f510: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
f520: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
f530: 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
f540: 6e 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ne */..#ifndef S
f550: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
f560: 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73  RIZATION.  if( s
f570: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
f580: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52  pParse, SQLITE_R
f590: 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e  EINDEX, pIndex->
f5a0: 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20  zName, 0,.      
f5b0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
f5c0: 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61  pIndex->iDb].zNa
f5d0: 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75  me ) ){.    retu
f5e0: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
f5f0: 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 6c 6c 20    /* Ensure all 
f600: 74 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c  the required col
f610: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
f620: 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20   are available. 
f630: 54 68 69 73 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  This.  ** routin
f640: 65 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68  e will invoke th
f650: 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 65 65 64  e collation-need
f660: 65 64 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 6e  ed callback if n
f670: 65 63 65 73 73 61 72 79 20 28 61 6e 64 0a 20 20  ecessary (and.  
f680: 2a 2a 20 69 66 20 6f 6e 65 20 68 61 73 20 62 65  ** if one has be
f690: 65 6e 20 72 65 67 69 73 74 65 72 65 64 29 2e 0a  en registered)..
f6a0: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
f6b0: 65 33 43 68 65 63 6b 49 6e 64 65 78 43 6f 6c 6c  e3CheckIndexColl
f6c0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 6e 64  Seq(pParse, pInd
f6d0: 65 78 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ex) ){.    retur
f6e0: 6e 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71  n;.  }..  v = sq
f6f0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
f700: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
f710: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
f720: 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20   memRootPage>=0 
f730: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
f740: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
f750: 6d 4c 6f 61 64 2c 20 6d 65 6d 52 6f 6f 74 50 61  mLoad, memRootPa
f760: 67 65 2c 20 30 29 3b 0a 20 20 20 20 74 6e 75 6d  ge, 0);.    tnum
f770: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
f780: 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78     tnum = pIndex
f790: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 73 71 6c 69  ->tnum;.    sqli
f7a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f7b0: 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20  OP_Clear, tnum, 
f7c0: 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20  pIndex->iDb);.  
f7d0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
f7e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
f7f0: 65 72 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 2c  er, pIndex->iDb,
f800: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
f810: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  beOp3(v, OP_Open
f820: 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75  Write, iIdx, tnu
f830: 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
f840: 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 70         (char*)&p
f850: 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20  Index->keyInfo, 
f860: 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73  P3_KEYINFO);.  s
f870: 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 46  qlite3OpenTableF
f880: 6f 72 52 65 61 64 69 6e 67 28 76 2c 20 69 54 61  orReading(v, iTa
f890: 62 2c 20 70 54 61 62 29 3b 0a 20 20 61 64 64 72  b, pTab);.  addr
f8a0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
f8b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
f8c0: 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 73  d, iTab, 0);.  s
f8d0: 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
f8e0: 64 65 78 4b 65 79 28 76 2c 20 70 49 6e 64 65 78  dexKey(v, pIndex
f8f0: 2c 20 69 54 61 62 29 3b 0a 20 20 69 66 28 20 70  , iTab);.  if( p
f900: 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
f910: 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 69  OE_None ){.    i
f920: 6e 74 20 63 75 72 61 64 64 72 20 3d 20 73 71 6c  nt curaddr = sql
f930: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
f940: 64 64 72 28 76 29 3b 0a 20 20 20 20 69 6e 74 20  ddr(v);.    int 
f950: 61 64 64 72 32 20 3d 20 63 75 72 61 64 64 72 2b  addr2 = curaddr+
f960: 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  4;.    sqlite3Vd
f970: 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 63 75  beChangeP2(v, cu
f980: 72 61 64 64 72 2d 31 2c 20 61 64 64 72 32 29 3b  raddr-1, addr2);
f990: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f9a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69  AddOp(v, OP_Rowi
f9b0: 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20  d, iTab, 0);.   
f9c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f9d0: 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
f9e0: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
f9f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fa00: 50 5f 49 73 55 6e 69 71 75 65 2c 20 69 49 64 78  P_IsUnique, iIdx
fa10: 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 73 71  , addr2);.    sq
fa20: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
fa30: 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
fa40: 43 4f 4e 53 54 52 41 49 4e 54 2c 20 4f 45 5f 41  CONSTRAINT, OE_A
fa50: 62 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20  bort,.          
fa60: 20 20 20 20 20 20 20 20 20 20 22 69 6e 64 65 78            "index
fa70: 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e  ed columns are n
fa80: 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33 5f 53  ot unique", P3_S
fa90: 54 41 54 49 43 29 3b 0a 20 20 20 20 61 73 73 65  TATIC);.    asse
faa0: 72 74 28 20 61 64 64 72 32 3d 3d 73 71 6c 69 74  rt( addr2==sqlit
fab0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
fac0: 72 28 76 29 20 29 3b 0a 20 20 7d 0a 20 20 73 71  r(v) );.  }.  sq
fad0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fae0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
faf0: 69 49 64 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69  iIdx, 0);.  sqli
fb00: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
fb10: 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
fb20: 64 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74  ddr1+1);.  sqlit
fb30: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
fb40: 2c 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69  , addr1);.  sqli
fb50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
fb60: 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 2c 20  OP_Close, iTab, 
fb70: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
fb80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
fb90: 73 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 7d 0a  se, iIdx, 0);.}.
fba0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
fbb0: 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e  new index for an
fbc0: 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61   SQL table.  pNa
fbd0: 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68  me1.pName2 is th
fbe0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
fbf0: 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c  dex .** and pTbl
fc00: 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65  List is the name
fc10: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68   of the table th
fc20: 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
fc30: 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20  xed.  Both will 
fc40: 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20  .** be NULL for 
fc50: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
fc60: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
fc70: 73 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74  s created to sat
fc80: 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45  isfy a.** UNIQUE
fc90: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66   constraint.  If
fca0: 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64   pTable and pInd
fcb0: 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65  ex are NULL, use
fcc0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
fcd0: 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62  le.** as the tab
fce0: 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
fcf0: 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
fd00: 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20  able is a table 
fd10: 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65  that is.** curre
fd20: 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
fd30: 72 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41  ructed by a CREA
fd40: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
fd50: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  nt..**.** pList 
fd60: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c  is a list of col
fd70: 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
fd80: 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20  ed.  pList will 
fd90: 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a  be NULL if this.
fda0: 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20  ** is a primary 
fdb0: 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f  key or unique-co
fdc0: 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
fdd0: 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75  most recent colu
fde0: 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74  mn added.** to t
fdf0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
fe00: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
fe10: 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64  ction.  .*/.void
fe20: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
fe30: 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
fe40: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c  arse,     /* All
fe50: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
fe60: 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f  ut this parse */
fe70: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
fe80: 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ,     /* First p
fe90: 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
fea0: 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
feb0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
fec0: 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64  2,     /* Second
fed0: 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
fee0: 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
fef0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
ff00: 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c  TblName, /* Tabl
ff10: 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20  e to index. Use 
ff20: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
ff30: 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72  e if 0 */.  Expr
ff40: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
ff50: 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  * A list of colu
ff60: 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
ff70: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
ff80: 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f  or,       /* OE_
ff90: 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65  Abort, OE_Ignore
ffa0: 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72  , OE_Replace, or
ffb0: 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f   OE_None */.  To
ffc0: 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20  ken *pStart,    
ffd0: 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
ffe0: 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
fff0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
10000 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
10010 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20  oken *pEnd      
10020 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61    /* The ")" tha
10030 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45  t closes the CRE
10040 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
10050 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ent */.){.  Tabl
10060 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 2f  e *pTab = 0;   /
10070 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  * Table to be in
10080 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  dexed */.  Index
10090 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 2f 2a   *pIndex = 0; /*
100a0 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
100b0 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68   created */.  ch
100c0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
100d0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b   int i, j;.  Tok
100e0 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 2f 2a  en nullId;    /*
100f0 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20   Fake token for 
10100 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74  an empty ID list
10110 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46   */.  DbFixer sF
10120 69 78 3b 20 20 20 20 2f 2a 20 46 6f 72 20 61 73  ix;    /* For as
10130 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65  signing database
10140 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65   names to pTable
10150 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
10160 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
10170 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
10180 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
10190 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
101a0 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  at is being writ
101b0 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ten */.  Token *
101c0 70 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 55 6e  pName = 0; /* Un
101d0 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f  qualified name o
101e0 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63  f the index to c
101f0 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20  reate */..  if( 
10200 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
10210 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
10220 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69  ailed ) goto exi
10230 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
10240 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
10250 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
10260 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
10270 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69    Return early i
10280 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  f not found..  *
10290 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65  /.  if( pTblName
102a0 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55  !=0 ){..    /* U
102b0 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20  se the two-part 
102c0 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65  index name to de
102d0 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61  termine the data
102e0 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20  base .    ** to 
102f0 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74  search for the t
10300 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20  able. 'Fix' the 
10310 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
10320 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66  is db.    ** bef
10330 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74  ore looking up t
10340 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  he table..    */
10350 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
10360 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b  me1 && pName2 );
10370 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
10380 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
10390 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
103a0 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
103b0 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67     if( iDb<0 ) g
103c0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
103d0 69 6e 64 65 78 3b 0a 0a 23 69 66 6e 64 65 66 20  index;..#ifndef 
103e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50  SQLITE_OMIT_TEMP
103f0 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  DB.    /* If the
10400 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20   index name was 
10410 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65  unqualified, che
10420 63 6b 20 69 66 20 74 68 65 20 74 68 65 20 74 61  ck if the the ta
10430 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  ble.    ** is a 
10440 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73  temp table. If s
10450 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  o, set the datab
10460 61 73 65 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2f  ase to 1..    */
10470 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
10480 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70  te3SrcListLookup
10490 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d  (pParse, pTblNam
104a0 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d  e);.    if( pNam
104b0 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d  e2 && pName2->n=
104c0 3d 30 20 26 26 20 70 54 61 62 20 26 26 20 70 54  =0 && pTab && pT
104d0 61 62 2d 3e 69 44 62 3d 3d 31 20 29 7b 0a 20 20  ab->iDb==1 ){.  
104e0 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20      iDb = 1;.   
104f0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69   }.#endif..    i
10500 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
10510 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
10520 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70   iDb, "index", p
10530 4e 61 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20  Name) &&.       
10540 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
10550 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61  st(&sFix, pTblNa
10560 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  me).    ){.     
10570 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   /* Because the 
10580 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74  parser construct
10590 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20  s pTblName from 
105a0 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66  a single identif
105b0 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71  ier,.      ** sq
105c0 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 20  lite3FixSrcList 
105d0 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20  can never fail. 
105e0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
105f0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  0);.    }.    pT
10600 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
10610 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
10620 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  pTblName->a[0].z
10630 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70  Name, .        p
10640 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  TblName->a[0].zD
10650 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66  atabase);.    if
10660 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65  ( !pTab ) goto e
10670 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10680 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  ;.    assert( iD
10690 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29 3b 0a  b==pTab->iDb );.
106a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
106b0 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b  ert( pName==0 );
106c0 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70 50 61  .    pTab =  pPa
106d0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
106e0 20 20 20 20 69 44 62 20 3d 20 70 54 61 62 2d 3e      iDb = pTab->
106f0 69 44 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  iDb;.  }..  if( 
10700 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73  pTab==0 || pPars
10710 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65  e->nErr ) goto e
10720 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10730 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65  ;.  if( pTab->re
10740 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71  adOnly ){.    sq
10750 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
10760 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
10770 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
10780 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
10790 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
107a0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
107b0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
107c0 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66  E_OMIT_VIEW.  if
107d0 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
107e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
107f0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
10800 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65  views may not be
10810 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
10820 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
10830 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64  _index;.  }.#end
10840 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69  if..  /*.  ** Fi
10850 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
10860 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  he index.  Make 
10870 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
10880 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65  t already anothe
10890 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  r.  ** index or 
108a0 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
108b0 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a  ame name.  .  **
108c0 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a  .  ** Exception:
108d0 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64    If we are read
108e0 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ing the names of
108f0 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63   permanent indic
10900 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  es from the.  **
10910 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
10920 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f  able (because so
10930 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
10940 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68   changed the sch
10950 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e  ema) and.  ** on
10960 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e  e of the index n
10970 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69  ames collides wi
10980 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  th the name of a
10990 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
109a0 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20   or.  ** index, 
109b0 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e  then we will con
109c0 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73  tinue to process
109d0 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a   this index..  *
109e0 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d  *.  ** If pName=
109f0 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  =0 it means that
10a00 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61   we are.  ** dea
10a10 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d  ling with a prim
10a20 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55  ary key or UNIQU
10a30 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57  E constraint.  W
10a40 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74  e have to invent
10a50 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61   our.  ** own na
10a60 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  me..  */.  if( p
10a70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  Name ){.    zNam
10a80 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
10a90 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b  romToken(pName);
10aa0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
10ab0 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
10ac0 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20  chema(pParse) ) 
10ad0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
10ae0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
10af0 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
10b00 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
10b10 78 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  x;.    if( SQLIT
10b20 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65  E_OK!=sqlite3Che
10b30 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61  ckObjectName(pPa
10b40 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  rse, zName) ){. 
10b50 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
10b60 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
10b70 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e   }.    if( !db->
10b80 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
10b90 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
10ba0 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
10bb0 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
10bc0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
10bd0 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 66 28 20  ndex;.      if( 
10be0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
10bf0 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e  (db, zName, db->
10c00 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 21  aDb[iDb].zName)!
10c10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
10c20 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
10c30 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20  arse, "index %s 
10c40 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
10c50 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
10c60 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
10c70 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
10c80 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
10c90 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
10ca0 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a  zName, 0)!=0 ){.
10cb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
10cc0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10cd0 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
10ce0 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  y a table named 
10cf0 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
10d00 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
10d10 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
10d20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
10d30 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75  se{.    char zBu
10d40 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  f[30];.    int n
10d50 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f  ;.    Index *pLo
10d60 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f  op;.    for(pLoo
10d70 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20  p=pTab->pIndex, 
10d80 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  n=1; pLoop; pLoo
10d90 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20  p=pLoop->pNext, 
10da0 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e  n++){}.    sprin
10db0 74 66 28 7a 42 75 66 2c 22 5f 25 64 22 2c 6e 29  tf(zBuf,"_%d",n)
10dc0 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  ;.    zName = 0;
10dd0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
10de0 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 73  tring(&zName, "s
10df0 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
10e00 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
10e10 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b  zBuf, (char*)0);
10e20 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
10e30 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
10e40 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
10e50 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
10e60 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f  authorization to
10e70 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78   create an index
10e80 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
10e90 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
10ea0 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
10eb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
10ec0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
10ed0 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  zName;.    if( s
10ee0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
10ef0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
10f00 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
10f10 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62  BLE(iDb), 0, zDb
10f20 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
10f30 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
10f40 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  x;.    }.    i =
10f50 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49   SQLITE_CREATE_I
10f60 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f  NDEX;.    if( !O
10f70 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
10f80 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54  b==1 ) i = SQLIT
10f90 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
10fa0 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
10fb0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
10fc0 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  arse, i, zName, 
10fd0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
10fe0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
10ff0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
11000 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
11010 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69  dif..  /* If pLi
11020 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20  st==0, it means 
11030 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
11040 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20   called to make 
11050 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b  a primary.  ** k
11060 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61  ey out of the la
11070 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20  st column added 
11080 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  to the table und
11090 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
110a0 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20  .  ** So create 
110b0 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73  a fake list to s
110c0 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20  imulate this..  
110d0 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
110e0 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  0 ){.    nullId.
110f0 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  z = pTab->aCol[p
11100 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61  Tab->nCol-1].zNa
11110 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e  me;.    nullId.n
11120 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c 49 64   = strlen(nullId
11130 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  .z);.    pList =
11140 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
11150 41 70 70 65 6e 64 28 30 2c 20 30 2c 20 26 6e 75  Append(0, 0, &nu
11160 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70  llId);.    if( p
11170 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
11180 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
11190 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ;.  }..  /* .  *
111a0 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  * Allocate the i
111b0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
111c0 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20 3d  .  */.  pIndex =
111d0 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
111e0 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 73  izeof(Index) + s
111f0 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31  trlen(zName) + 1
11200 20 2b 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b   + sizeof(int) +
11210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11220 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66           (sizeof
11230 28 69 6e 74 29 2a 32 20 2b 20 73 69 7a 65 6f 66  (int)*2 + sizeof
11240 28 43 6f 6c 6c 53 65 71 2a 29 29 2a 70 4c 69 73  (CollSeq*))*pLis
11250 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 69 66  t->nExpr );.  if
11260 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  ( sqlite3_malloc
11270 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65  _failed ) goto e
11280 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
11290 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  ;.  pIndex->aiCo
112a0 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49  lumn = (int*)&pI
112b0 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  ndex->keyInfo.aC
112c0 6f 6c 6c 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  oll[pList->nExpr
112d0 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 52  ];.  pIndex->aiR
112e0 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65  owEst = (unsigne
112f0 64 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f  d*)&pIndex->aiCo
11300 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  lumn[pList->nExp
11310 72 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e  r];.  pIndex->zN
11320 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49  ame = (char*)&pI
11330 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b 70  ndex->aiRowEst[p
11340 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31 5d 3b 0a  List->nExpr+1];.
11350 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d    strcpy(pIndex-
11360 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a  >zName, zName);.
11370 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
11380 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65   = pTab;.  pInde
11390 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69  x->nColumn = pLi
113a0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
113b0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f  dex->onError = o
113c0 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78  nError;.  pIndex
113d0 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e  ->autoIndex = pN
113e0 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78  ame==0;.  pIndex
113f0 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 0a 20 20  ->iDb = iDb;..  
11400 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65  /* Scan the name
11410 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s of the columns
11420 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
11430 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a   be indexed and.
11440 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f    ** load the co
11450 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74  lumn indices int
11460 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75  o the Index stru
11470 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61  cture.  Report a
11480 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20  n error.  ** if 
11490 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f  any column is no
114a0 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
114b0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
114c0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
114d0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
114e0 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
114f0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
11500 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
11510 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62  a[i].zName, pTab
11520 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  ->aCol[j].zName)
11530 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
11540 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54   }.    if( j>=pT
11550 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
11560 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11570 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
11580 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d   %s has no colum
11590 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20  n named %s",.   
115a0 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
115b0 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  , pList->a[i].zN
115c0 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
115d0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
115e0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
115f0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
11600 5d 20 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20 70  ] = j;.    if( p
11610 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
11620 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
11630 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ( pList->a[i].pE
11640 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20  xpr->pColl );.  
11650 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49      pIndex->keyI
11660 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  nfo.aColl[i] = p
11670 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
11680 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c  ->pColl;.    }el
11690 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  se{.      pIndex
116a0 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
116b0 69 5d 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  i] = pTab->aCol[
116c0 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  j].pColl;.    }.
116d0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
116e0 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  ex->keyInfo.aCol
116f0 6c 5b 69 5d 20 29 3b 0a 20 20 20 20 69 66 28 20  l[i] );.    if( 
11700 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
11710 26 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  & .        sqlit
11720 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70  e3CheckCollSeq(p
11730 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 6b  Parse, pIndex->k
11740 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29  eyInfo.aColl[i])
11750 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67   .    ){.      g
11760 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
11770 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
11780 0a 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  .  pIndex->keyIn
11790 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 4c 69 73  fo.nField = pLis
117a0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69  t->nExpr;.  sqli
117b0 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
117c0 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28  (pIndex);..  if(
117d0 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70   pTab==pParse->p
117e0 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  NewTable ){.    
117f0 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
11800 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  has been called 
11810 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74  to create an aut
11820 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20  omatic index as 
11830 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20  a.    ** result 
11840 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  of a PRIMARY KEY
11850 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
11860 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65  e on a column de
11870 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20  finition, or.   
11880 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45   ** a PRIMARY KE
11890 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
118a0 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  se following the
118b0 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
118c0 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e  ons..    ** i.e.
118d0 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a   one of:.    **.
118e0 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41      ** CREATE TA
118f0 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20  BLE t(x PRIMARY 
11900 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20  KEY, y);.    ** 
11910 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
11920 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79  , y, UNIQUE(x, y
11930 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ));.    **.    *
11940 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68  * Either way, ch
11950 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
11960 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
11970 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65  has such an inde
11980 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c  x. If.    ** so,
11990 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72   don't bother cr
119a0 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e  eating this one.
119b0 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69   This only appli
119c0 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74  es to.    ** aut
119d0 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74  omatically creat
119e0 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72  ed indices. User
119f0 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79  s can do as they
11a00 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a   wish with.    *
11a10 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63  * explicit indic
11a20 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49  es..    */.    I
11a30 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
11a40 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
11a50 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
11a60 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
11a70 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
11a80 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
11a90 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
11aa0 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
11ab0 74 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64  t( pIdx->autoInd
11ac0 65 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ex );.      asse
11ad0 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  rt( pIndex->onEr
11ae0 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
11af0 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
11b00 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78  >nColumn!=pIndex
11b10 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  ->nColumn ) cont
11b20 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
11b30 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f  k=0; k<pIdx->nCo
11b40 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  lumn; k++){.    
11b50 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
11b60 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65  Column[k]!=pInde
11b70 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29  x->aiColumn[k] )
11b80 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
11b90 69 66 28 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66  if( pIdx->keyInf
11ba0 6f 2e 61 43 6f 6c 6c 5b 6b 5d 21 3d 70 49 6e 64  o.aColl[k]!=pInd
11bb0 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  ex->keyInfo.aCol
11bc0 6c 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  l[k] ) break;.  
11bd0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
11be0 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  k==pIdx->nColumn
11bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
11c00 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70  pIdx->onError!=p
11c10 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29  Index->onError )
11c20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
11c30 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  his constraint c
11c40 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20  reates the same 
11c50 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69  index as a previ
11c60 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ous.          **
11c70 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63   constraint spec
11c80 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20  ified somewhere 
11c90 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41  in the CREATE TA
11ca0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  BLE statement.. 
11cb0 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65           ** Howe
11cc0 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c  ver the ON CONFL
11cd0 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20  ICT clauses are 
11ce0 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f  different. If bo
11cf0 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  th this .       
11d00 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
11d10 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75   and the previou
11d20 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e  s equivalent con
11d30 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70  straint have exp
11d40 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20  licit.          
11d50 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ** ON CONFLICT c
11d60 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61  lauses this is a
11d70 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69  n error. Otherwi
11d80 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20  se, use the.    
11d90 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69        ** explici
11da0 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65  tly specified be
11db0 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65 20  haviour for the 
11dc0 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20  index..         
11dd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
11de0 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  ( !(pIdx->onErro
11df0 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c  r==OE_Default ||
11e00 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
11e10 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b  ==OE_Default) ){
11e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
11e30 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11e40 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
11e50 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69        "conflicti
11e60 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ng ON CONFLICT c
11e70 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64  lauses specified
11e80 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 0);.         
11e90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
11ea0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d   pIdx->onError==
11eb0 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
11ec0 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
11ed0 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78  onError = pIndex
11ee0 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20  ->onError;.     
11ef0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
11f00 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
11f10 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
11f20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11f30 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
11f40 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75  e new Index stru
11f50 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62  cture to its tab
11f60 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74  le and to the ot
11f70 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f  her.  ** in-memo
11f80 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75  ry database stru
11f90 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20  ctures. .  */.  
11fa0 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
11fb0 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  y ){.    Index *
11fc0 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  p;.    p = sqlit
11fd0 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  e3HashInsert(&db
11fe0 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44  ->aDb[pIndex->iD
11ff0 62 5d 2e 69 64 78 48 61 73 68 2c 20 0a 20 20 20  b].idxHash, .   
12000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12010 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
12020 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64  ame, strlen(pInd
12030 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49  ex->zName)+1, pI
12040 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70  ndex);.    if( p
12050 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
12060 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20  ( p==pIndex );  
12070 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
12080 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
12090 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
120a0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
120b0 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  }.    db->flags 
120c0 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
120d0 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28  Changes;.    if(
120e0 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
120f0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e        pIndex->tn
12100 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
12110 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  wTnum;.    }.  }
12120 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
12130 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30  ->init.busy is 0
12140 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65   then create the
12150 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20   index on disk. 
12160 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c   This.  ** invol
12170 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20  ves writing the 
12180 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d  index into the m
12190 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
121a0 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20  filling in the. 
121b0 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74   ** index with t
121c0 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
121d0 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a   contents..  **.
121e0 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69    ** The db->ini
121f0 74 2e 62 75 73 79 20 69 73 20 30 20 77 68 65 6e  t.busy is 0 when
12200 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20   the user first 
12210 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20  enters a CREATE 
12220 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d  INDEX .  ** comm
12230 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62  and.  db->init.b
12240 75 73 79 20 69 73 20 31 20 77 68 65 6e 20 61 20  usy is 1 when a 
12250 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
12260 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45  ed and .  ** CRE
12270 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
12280 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75  ents are read ou
12290 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  t of the master 
122a0 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20  table.  In.  ** 
122b0 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20  the latter case 
122c0 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
122d0 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b  y exists on disk
122e0 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20  , which is why. 
122f0 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
12300 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74  t to recreate it
12310 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
12320 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  TblName==0 it me
12330 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69  ans this index i
12340 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61  s generated as a
12350 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a   primary key.  *
12360 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  * or UNIQUE cons
12370 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41  traint of a CREA
12380 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
12390 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74  nt.  Since the t
123a0 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75  able.  ** has ju
123b0 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  st been created,
123c0 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   it contains no 
123d0 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64  data and the ind
123e0 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ex initializatio
123f0 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20  n.  ** step can 
12400 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  be skipped..  */
12410 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62 2d 3e  .  else if( db->
12420 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
12430 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
12440 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
12450 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61    int iMem = pPa
12460 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 0a 20 20  rse->nMem++;..  
12470 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
12480 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
12490 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
124a0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
124b0 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  dex;..    /* Cre
124c0 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65  ate the rootpage
124d0 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20   for the index. 
124e0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
124f0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
12500 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
12510 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
12520 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
12530 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44  _CreateIndex, iD
12540 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
12550 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
12560 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d  P_MemStore, iMem
12570 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61  , 0);..    /* Ga
12580 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  ther the complet
12590 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
125a0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
125b0 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ment into.    **
125c0 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61   the zStmt varia
125d0 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ble.    */.    i
125e0 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e  f( pStart && pEn
125f0 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  d ){.      /* A 
12600 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68  named index with
12610 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45   an explicit CRE
12620 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
12630 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  ent */.      zSt
12640 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
12650 6e 74 66 28 22 43 52 45 41 54 45 25 73 20 49 4e  ntf("CREATE%s IN
12660 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20  DEX %.*s",.     
12670 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e     onError==OE_N
12680 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49  one ? "" : " UNI
12690 51 55 45 22 2c 0a 20 20 20 20 20 20 20 20 70 45  QUE",.        pE
126a0 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a  nd->z - pName->z
126b0 20 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 70 4e   + 1,.        pN
126c0 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c  ame->z);.    }el
126d0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
126e0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
126f0 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49  created by a PRI
12700 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
12710 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  UE constraint */
12720 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20  .      /* zStmt 
12730 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
12740 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a  (""); */.      z
12750 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Stmt = 0;.    }.
12760 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65  .    /* Add an e
12770 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d  ntry in sqlite_m
12780 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69  aster for this i
12790 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ndex.    */.    
127a0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
127b0 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
127c0 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
127d0 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69   %Q.%s VALUES('i
127e0 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 30 2c 25  ndex',%Q,%Q,#0,%
127f0 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62  Q);",.        db
12800 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
12810 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
12820 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e  Db),.        pIn
12830 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  dex->zName,.    
12840 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
12850 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20  .        zStmt. 
12860 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
12870 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
12880 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
12890 20 73 71 6c 69 74 65 46 72 65 65 28 7a 53 74 6d   sqliteFree(zStm
128a0 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c  t);..    /* Fill
128b0 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
128c0 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65  data and reparse
128d0 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64   the schema. Cod
128e0 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20  e an OP_Expire. 
128f0 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64     ** to invalid
12900 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70  ate all pre-comp
12910 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
12920 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
12930 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pTblName ){.    
12940 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
12950 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
12960 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  dex, iMem);.    
12970 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
12980 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62  ookie(db, v, iDb
12990 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
129a0 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61  VdbeOp3(v, OP_Pa
129b0 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
129c0 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  0,.         sqli
129d0 74 65 33 4d 50 72 69 6e 74 66 28 22 6e 61 6d 65  te3MPrintf("name
129e0 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e  ='%q'", pIndex->
129f0 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d  zName), P3_DYNAM
12a00 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
12a10 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
12a20 50 5f 45 78 70 69 72 65 2c 20 30 2c 20 30 29 3b  P_Expire, 0, 0);
12a30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
12a40 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20   When adding an 
12a50 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73  index to the lis
12a60 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72  t of indices for
12a70 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20   a table, make. 
12a80 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64   ** sure all ind
12a90 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f  ices labeled OE_
12aa0 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74  Replace come aft
12ab0 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62  er all those lab
12ac0 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e  eled.  ** OE_Ign
12ad0 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ore.  This is ne
12ae0 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20  cessary for the 
12af0 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
12b00 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a  n of UPDATE.  **
12b10 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a   and INSERT..  *
12b20 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
12b30 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d  .busy || pTblNam
12b40 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e==0 ){.    if( 
12b50 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
12b60 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e  ace || pTab->pIn
12b70 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  dex==0.         
12b80 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d  || pTab->pIndex-
12b90 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70  >onError==OE_Rep
12ba0 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e  lace){.      pIn
12bb0 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61  dex->pNext = pTa
12bc0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
12bd0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20   pTab->pIndex = 
12be0 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73  pIndex;.    }els
12bf0 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
12c00 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70  pOther = pTab->p
12c10 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69  Index;.      whi
12c20 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  le( pOther->pNex
12c30 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65  t && pOther->pNe
12c40 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  xt->onError!=OE_
12c50 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20  Replace ){.     
12c60 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68     pOther = pOth
12c70 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
12c80 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d   }.      pIndex-
12c90 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d  >pNext = pOther-
12ca0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f  >pNext;.      pO
12cb0 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49  ther->pNext = pI
12cc0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
12cd0 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  pIndex = 0;.  }.
12ce0 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62  .  /* Clean up b
12cf0 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
12d00 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64  .exit_create_ind
12d10 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  ex:.  if( pIndex
12d20 20 29 7b 0a 20 20 20 20 66 72 65 65 49 6e 64 65   ){.    freeInde
12d30 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20  x(pIndex);.  }. 
12d40 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
12d50 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
12d60 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
12d70 65 6c 65 74 65 28 70 54 62 6c 4e 61 6d 65 29 3b  elete(pTblName);
12d80 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e  .  sqliteFree(zN
12d90 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
12da0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68  }../*.** Fill th
12db0 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74  e Index.aiRowEst
12dc0 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 64 65  [] array with de
12dd0 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f  fault informatio
12de0 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  n - information.
12df0 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77 68  ** to be used wh
12e00 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72  en we have not r
12e10 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63  un the ANALYZE c
12e20 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69  ommand..**.** ai
12e30 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70  RowEst[0] is sup
12e40 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20  pose to contain 
12e50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
12e60 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  ements in the in
12e70 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65  dex..** Since we
12e80 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75   do not know, gu
12e90 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20  ess 1 million.  
12ea0 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61  aiRowEst[1] is a
12eb0 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
12ec0 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
12ed0 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
12ee0 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
12ef0 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65  particular value
12f00 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   of the.** first
12f10 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
12f20 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b  ndex.  aiRowEst[
12f30 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  2] is an estimat
12f40 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a  e of the number.
12f50 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  ** of rows that 
12f60 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
12f70 75 6c 61 72 20 63 6f 6d 62 69 6e 69 61 74 69 6f  ular combiniatio
12f80 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 32  n of the first 2
12f90 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74   columns.** of t
12fa0 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73  he index.  And s
12fb0 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73  o forth.  It mus
12fc0 74 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  t always be the 
12fd0 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20  case that.*.**  
12fe0 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73           aiRowEs
12ff0 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e  t[N]<=aiRowEst[N
13000 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  -1].**          
13010 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a   aiRowEst[N]>=1.
13020 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d  **.** Apart from
13030 20 74 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c   that, we have l
13040 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62  ittle to go on b
13050 65 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e  esides intuition
13060 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69   as to.** how ai
13070 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20  RowEst[] should 
13080 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
13090 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e   The numbers gen
130a0 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61  erated here.** a
130b0 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69  re based on typi
130c0 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64  cal values found
130d0 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63   in actual indic
130e0 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
130f0 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
13100 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
13110 20 75 6e 73 69 67 6e 65 64 20 2a 61 20 3d 20 70   unsigned *a = p
13120 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20  Idx->aiRowEst;. 
13130 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
13140 28 20 61 21 3d 30 20 29 3b 0a 20 20 61 5b 30 5d  ( a!=0 );.  a[0]
13150 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 66 6f   = 1000000;.  fo
13160 72 28 69 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  r(i=pIdx->nColum
13170 6e 3b 20 69 3e 3d 31 3b 20 69 2d 2d 29 7b 0a 20  n; i>=1; i--){. 
13180 20 20 20 61 5b 69 5d 20 3d 20 31 30 3b 0a 20 20     a[i] = 10;.  
13190 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e  }.  if( pIdx->on
131a0 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
131b0 7b 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e 6e 43  {.    a[pIdx->nC
131c0 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a  olumn] = 1;.  }.
131d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
131e0 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20  utine will drop 
131f0 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65  an existing name
13200 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72  d index.  This r
13210 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d  outine.** implem
13220 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e  ents the DROP IN
13230 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  DEX statement..*
13240 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
13250 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  opIndex(Parse *p
13260 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
13270 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20  pName){.  Index 
13280 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20  *pIndex;.  Vdbe 
13290 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
132a0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
132b0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
132c0 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
132d0 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a  alloc_failed ){.
132e0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
132f0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
13300 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e  assert( pName->n
13310 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  Src==1 );.  if( 
13320 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
13330 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
13340 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  rse) ){.    goto
13350 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
13360 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
13370 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
13380 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  x(db, pName->a[0
13390 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
133a0 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
133b0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
133c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
133d0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
133e0 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
133f0 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a  %S", pName, 0);.
13400 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
13410 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
13420 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
13430 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
13440 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
13450 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
13460 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13470 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61  , "index associa
13480 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20  ted with UNIQUE 
13490 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d  ".      "or PRIM
134a0 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
134b0 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f  nt cannot be dro
134c0 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67  pped", 0);.    g
134d0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
134e0 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  dex;.  }.#ifndef
134f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13500 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
13510 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51     int code = SQ
13520 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b  LITE_DROP_INDEX;
13530 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
13540 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
13550 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
13560 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
13570 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e  [pIndex->iDb].zN
13580 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
13590 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
135a0 4d 41 5f 54 41 42 4c 45 28 70 49 6e 64 65 78 2d  MA_TABLE(pIndex-
135b0 3e 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73  >iDb);.    if( s
135c0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
135d0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
135e0 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
135f0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
13600 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
13610 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
13620 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
13630 26 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 29 20  & pIndex->iDb ) 
13640 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
13650 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  OP_TEMP_INDEX;. 
13660 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
13670 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
13680 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  code, pIndex->zN
13690 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
136a0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
136b0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
136c0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
136d0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
136e0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
136f0 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
13700 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
13710 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
13720 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
13730 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
13740 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62  v ){.    int iDb
13750 20 3d 20 70 49 6e 64 65 78 2d 3e 69 44 62 3b 0a   = pIndex->iDb;.
13760 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
13770 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
13780 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
13790 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e  OM %Q.%s WHERE n
137a0 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20  ame=%Q",.       
137b0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
137c0 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
137d0 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 70 49  (iDb),.       pI
137e0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  ndex->zName.    
137f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
13800 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
13810 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74  , iDb);.    dest
13820 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
13830 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  se, pIndex->tnum
13840 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
13850 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
13860 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c  _DropIndex, iDb,
13870 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d   0, pIndex->zNam
13880 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74  e, 0);.  }..exit
13890 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73  _drop_index:.  s
138a0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
138b0 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  ete(pName);.}../
138c0 2a 0a 2a 2a 20 70 70 41 72 72 61 79 20 70 6f 69  *.** ppArray poi
138d0 6e 74 73 20 69 6e 74 6f 20 61 20 73 74 72 75 63  nts into a struc
138e0 74 75 72 65 20 77 68 65 72 65 20 74 68 65 72 65  ture where there
138f0 20 69 73 20 61 6e 20 61 72 72 61 79 20 70 6f 69   is an array poi
13900 6e 74 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 65 64  nter.** followed
13910 20 62 79 20 74 77 6f 20 69 6e 74 65 67 65 72 73   by two integers
13920 2e 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65  . The first inte
13930 67 65 72 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75  ger is the.** nu
13940 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
13950 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72   in the structur
13960 65 20 61 72 72 61 79 2e 20 20 54 68 65 20 73 65  e array.  The se
13970 63 6f 6e 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  cond integer.** 
13980 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
13990 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73   allocated slots
139a0 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 0a 2a   in the array..*
139b0 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f  *.** In other wo
139c0 72 64 73 2c 20 74 68 65 20 73 74 72 75 63 74 75  rds, the structu
139d0 72 65 20 6c 6f 6f 6b 73 20 73 6f 6d 65 74 68 69  re looks somethi
139e0 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ng like this:.**
139f0 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 72 75 63  .**        struc
13a00 74 20 45 78 61 6d 70 6c 65 31 20 7b 0a 2a 2a 20  t Example1 {.** 
13a10 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
13a20 73 75 62 45 6c 65 6d 20 2a 61 45 6e 74 72 79 3b  subElem *aEntry;
13a30 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e 74  .**          int
13a40 20 6e 45 6e 74 72 79 3b 0a 2a 2a 20 20 20 20 20   nEntry;.**     
13a50 20 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b       int nAlloc;
13a60 0a 2a 2a 20 20 20 20 20 20 20 20 7d 0a 2a 2a 0a  .**        }.**.
13a70 2a 2a 20 54 68 65 20 70 6e 45 6e 74 72 79 20 70  ** The pnEntry p
13a80 61 72 61 6d 65 74 65 72 20 70 6f 69 6e 74 73 20  arameter points 
13a90 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  to the equivalen
13aa0 74 20 6f 66 20 45 78 61 6d 70 6c 65 31 2e 6e 45  t of Example1.nE
13ab0 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ntry..**.** This
13ac0 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74   routine allocat
13ad0 65 73 20 61 20 6e 65 77 20 73 6c 6f 74 20 69 6e  es a new slot in
13ae0 20 74 68 65 20 61 72 72 61 79 2c 20 7a 65 72 6f   the array, zero
13af0 73 20 69 74 20 6f 75 74 2c 0a 2a 2a 20 61 6e 64  s it out,.** and
13b00 20 72 65 74 75 72 6e 73 20 69 74 73 20 69 6e 64   returns its ind
13b10 65 78 2e 20 20 49 66 20 6d 61 6c 6c 6f 63 20 66  ex.  If malloc f
13b20 61 69 6c 73 20 61 20 6e 65 67 61 74 69 76 65 20  ails a negative 
13b30 6e 75 6d 62 65 72 20 69 73 20 72 65 74 75 72 6e  number is return
13b40 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 7a 45 6e 74 72  ed..**.** szEntr
13b50 79 20 69 73 20 74 68 65 20 73 69 7a 65 6f 66 20  y is the sizeof 
13b60 6f 66 20 61 20 73 69 6e 67 6c 65 20 61 72 72 61  of a single arra
13b70 79 20 65 6e 74 72 79 2e 20 20 69 6e 69 74 53 69  y entry.  initSi
13b80 7a 65 20 69 73 20 74 68 65 20 0a 2a 2a 20 6e 75  ze is the .** nu
13b90 6d 62 65 72 20 6f 66 20 61 72 72 61 79 20 65 6e  mber of array en
13ba0 74 72 69 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  tries allocated 
13bb0 6f 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 20 61  on the initial a
13bc0 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  llocation..*/.in
13bd0 74 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  t sqlite3ArrayAl
13be0 6c 6f 63 61 74 65 28 76 6f 69 64 20 2a 2a 70 70  locate(void **pp
13bf0 41 72 72 61 79 2c 20 69 6e 74 20 73 7a 45 6e 74  Array, int szEnt
13c00 72 79 2c 20 69 6e 74 20 69 6e 69 74 53 69 7a 65  ry, int initSize
13c10 29 7b 0a 20 20 63 68 61 72 20 2a 70 3b 0a 20 20  ){.  char *p;.  
13c20 69 6e 74 20 2a 61 6e 20 3d 20 28 69 6e 74 2a 29  int *an = (int*)
13c30 26 70 70 41 72 72 61 79 5b 31 5d 3b 0a 20 20 69  &ppArray[1];.  i
13c40 66 28 20 61 6e 5b 30 5d 3e 3d 61 6e 5b 31 5d 20  f( an[0]>=an[1] 
13c50 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65  ){.    void *pNe
13c60 77 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77 53 69  w;.    int newSi
13c70 7a 65 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20  ze;.    newSize 
13c80 3d 20 61 6e 5b 31 5d 2a 32 20 2b 20 69 6e 69 74  = an[1]*2 + init
13c90 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 20 3d  Size;.    pNew =
13ca0 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 2a   sqliteRealloc(*
13cb0 70 70 41 72 72 61 79 2c 20 6e 65 77 53 69 7a 65  ppArray, newSize
13cc0 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69  *szEntry);.    i
13cd0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
13ce0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
13cf0 20 20 20 7d 0a 20 20 20 20 61 6e 5b 31 5d 20 3d     }.    an[1] =
13d00 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2a 70   newSize;.    *p
13d10 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20  pArray = pNew;. 
13d20 20 7d 0a 20 20 70 20 3d 20 2a 70 70 41 72 72 61   }.  p = *ppArra
13d30 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 5b 61  y;.  memset(&p[a
13d40 6e 5b 30 5d 2a 73 7a 45 6e 74 72 79 5d 2c 20 30  n[0]*szEntry], 0
13d50 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 72 65  , szEntry);.  re
13d60 74 75 72 6e 20 61 6e 5b 30 5d 2b 2b 3b 0a 7d 0a  turn an[0]++;.}.
13d70 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
13d80 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
13d90 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e  he given IdList.
13da0 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49    Create a new I
13db0 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64  dList if.** need
13dc0 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77   be..**.** A new
13dd0 20 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72   IdList is retur
13de0 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
13df0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
13e00 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  */.IdList *sqlit
13e10 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 49  e3IdListAppend(I
13e20 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  dList *pList, To
13e30 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
13e40 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
13e50 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
13e60 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  st = sqliteMallo
13e70 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74  c( sizeof(IdList
13e80 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
13e90 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
13ea0 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
13eb0 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  loc = 0;.  }.  i
13ec0 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
13ed0 6c 6c 6f 63 61 74 65 28 28 76 6f 69 64 2a 2a 29  llocate((void**)
13ee0 26 70 4c 69 73 74 2d 3e 61 2c 20 73 69 7a 65 6f  &pList->a, sizeo
13ef0 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 20  f(pList->a[0]), 
13f00 35 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b  5);.  if( i<0 ){
13f10 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
13f20 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
13f30 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
13f40 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   }.  pList->a[i]
13f50 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
13f60 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
13f70 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20  oken);.  return 
13f80 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
13f90 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74  Delete an IdList
13fa0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
13fb0 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64  3IdListDelete(Id
13fc0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
13fd0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
13fe0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
13ff0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
14000 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
14010 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
14020 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
14030 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
14040 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  ee(pList->a);.  
14050 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
14060 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
14070 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  rn the index in 
14080 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65  pList of the ide
14090 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49  ntifier named zI
140a0 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  d.  Return -1.**
140b0 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
140c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c  /.int sqlite3IdL
140d0 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20  istIndex(IdList 
140e0 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68  *pList, const ch
140f0 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
14100 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
14110 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ==0 ) return -1;
14120 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
14130 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
14140 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
14150 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
14160 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  i].zName, zName)
14170 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
14180 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
14190 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
141a0 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d   a new table nam
141b0 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53  e to the given S
141c0 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  rcList.  Create 
141d0 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66  a new SrcList if
141e0 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20  .** need be.  A 
141f0 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65  new entry is cre
14200 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c  ated in the SrcL
14210 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b  ist even if pTok
14220 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  en is NULL..**.*
14230 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74 20  * A new SrcList 
14240 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
14250 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
14260 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   fails..**.** If
14270 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f   pDatabase is no
14280 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73  t null, it means
14290 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
142a0 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a  has an optional.
142b0 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ** database name
142c0 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74   prefix.  Like t
142d0 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e  his:  "database.
142e0 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61  table".  The pDa
142f0 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73  tabase.** points
14300 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61   to the table na
14310 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c  me and the pTabl
14320 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
14330 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
14340 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b  * The SrcList.a[
14350 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73  ].zName field is
14360 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
14370 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63   table name whic
14380 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20  h might.** come 
14390 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20  from pTable (if 
143a0 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
143b0 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61  L) or from pData
143c0 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69  base.  .** SrcLi
143d0 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65  st.a[].zDatabase
143e0 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
143f0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
14400 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a  e from pTable,.*
14410 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69  * or with NULL i
14420 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73  f no database is
14430 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
14440 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
14450 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74  , if call like t
14460 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
14470 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
14480 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a  tAppend(A,B,0);.
14490 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20  **.** Then B is 
144a0 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  a table name and
144b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
144c0 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65  me is unspecifie
144d0 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a  d.  If called.**
144e0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
144f0 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
14500 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41  3SrcListAppend(A
14510 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,C);.**.** The
14520 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65  n C is the table
14530 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74   name and B is t
14540 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
14550 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
14560 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
14570 6e 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  nd(SrcList *pLis
14580 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  t, Token *pTable
14590 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61  , Token *pDataba
145a0 73 65 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  se){.  struct Sr
145b0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
145c0 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  m;.  if( pList==
145d0 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
145e0 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
145f0 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
14600 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
14610 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
14620 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
14630 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
14640 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69  pList->nSrc>=pLi
14650 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  st->nAlloc ){.  
14660 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
14670 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
14680 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65  oc *= 2;.    pNe
14690 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
146a0 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20 20  c(pList,.       
146b0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
146c0 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74 2d  pList) + (pList-
146d0 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f  >nAlloc-1)*sizeo
146e0 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
146f0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
14700 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
14710 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
14720 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
14730 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
14740 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a    pList = pNew;.
14750 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
14760 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
14770 53 72 63 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  Src];.  memset(p
14780 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
14790 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
147a0 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26   if( pDatabase &
147b0 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d  & pDatabase->z==
147c0 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61  0 ){.    pDataba
147d0 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  se = 0;.  }.  if
147e0 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70  ( pDatabase && p
147f0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b  Table ){.    Tok
14800 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74  en *pTemp = pDat
14810 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61  abase;.    pData
14820 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20  base = pTable;. 
14830 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d     pTable = pTem
14840 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e  p;.  }.  pItem->
14850 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
14860 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61  ameFromToken(pTa
14870 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a  ble);.  pItem->z
14880 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
14890 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
148a0 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 70 49  pDatabase);.  pI
148b0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 2d  tem->iCursor = -
148c0 31 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63  1;.  pList->nSrc
148d0 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  ++;.  return pLi
148e0 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  st;.}../*.** Ass
148f0 69 67 6e 20 63 75 72 73 6f 72 73 20 74 6f 20 61  ign cursors to a
14900 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53  ll tables in a S
14910 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73  rcList.*/.void s
14920 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
14930 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65  ignCursors(Parse
14940 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
14950 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
14960 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   i;.  struct Src
14970 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
14980 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74  ;.  for(i=0, pIt
14990 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
149a0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
149b0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69   pItem++){.    i
149c0 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  f( pItem->iCurso
149d0 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r>=0 ) break;.  
149e0 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
149f0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
14a00 2b 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  +;.    if( pItem
14a10 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
14a20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
14a30 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
14a40 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53  Parse, pItem->pS
14a50 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20  elect->pSrc);.  
14a60 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
14a70 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74 6f   Add an alias to
14a80 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74 69   the last identi
14a90 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76 65  fier on the give
14aa0 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69 73  n identifier lis
14ab0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
14ac0 65 33 53 72 63 4c 69 73 74 41 64 64 41 6c 69 61  e3SrcListAddAlia
14ad0 73 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  s(SrcList *pList
14ae0 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
14af0 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26 26  {.  if( pList &&
14b00 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29   pList->nSrc>0 )
14b10 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70  {.    pList->a[p
14b20 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 2e 7a 41  List->nSrc-1].zA
14b30 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61  lias = sqlite3Na
14b40 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b  meFromToken(pTok
14b50 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  en);.  }.}../*.*
14b60 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
14b70 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75  re SrcList inclu
14b80 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62  ding all its sub
14b90 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f  structure..*/.vo
14ba0 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
14bb0 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20  tDelete(SrcList 
14bc0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
14bd0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
14be0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
14bf0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
14c00 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70   return;.  for(p
14c10 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
14c20 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  =0; i<pList->nSr
14c30 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
14c40 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
14c50 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  (pItem->zDatabas
14c60 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
14c70 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  ee(pItem->zName)
14c80 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
14c90 28 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  (pItem->zAlias);
14ca0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
14cb0 74 65 54 61 62 6c 65 28 30 2c 20 70 49 74 65 6d  teTable(0, pItem
14cc0 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c  ->pTab);.    sql
14cd0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
14ce0 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29  (pItem->pSelect)
14cf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
14d00 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70  rDelete(pItem->p
14d10 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  On);.    sqlite3
14d20 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 49 74  IdListDelete(pIt
14d30 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
14d40 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
14d50 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  ist);.}../*.** B
14d60 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
14d70 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
14d80 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  e3BeginTransacti
14d90 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
14da0 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73  , int type){.  s
14db0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
14dc0 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a  be *v;.  int i;.
14dd0 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
14de0 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
14df0 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44  db)==0 || db->aD
14e00 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
14e10 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
14e20 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
14e30 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
14e40 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
14e50 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
14e60 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
14e70 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
14e80 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 20  BEGIN", 0, 0) ) 
14e90 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
14ea0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
14eb0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20  arse);.  if( !v 
14ec0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
14ed0 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45  type!=TK_DEFERRE
14ee0 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  D ){.    for(i=0
14ef0 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
14f00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14f10 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14f20 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20  Transaction, i, 
14f30 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53  (type==TK_EXCLUS
14f40 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  IVE)+1);.    }. 
14f50 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
14f60 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f  AddOp(v, OP_Auto
14f70 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d  Commit, 0, 0);.}
14f80 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
14f90 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
14fa0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d  void sqlite3Comm
14fb0 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  itTransaction(Pa
14fc0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
14fd0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
14fe0 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70  dbe *v;..  if( p
14ff0 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
15000 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
15010 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  | db->aDb[0].pBt
15020 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
15030 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
15040 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
15050 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
15060 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
15070 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
15080 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
15090 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c  CTION, "COMMIT",
150a0 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
150b0 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
150c0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
150d0 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
150e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
150f0 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
15100 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 1, 0);.  }.}..
15110 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
15120 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
15130 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
15140 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
15150 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
15160 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
15170 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
15180 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
15190 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
151a0 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
151b0 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
151c0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
151d0 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
151e0 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
151f0 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
15200 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
15210 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
15220 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41  SACTION, "ROLLBA
15230 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  CK", 0, 0) ) ret
15240 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  urn;..  v = sqli
15250 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
15260 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
15270 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15280 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  dOp(v, OP_AutoCo
15290 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d  mmit, 1, 1);.  }
152a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
152b0 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74  ure the TEMP dat
152c0 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e  abase is open an
152d0 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
152e0 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
152f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
15300 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79  rors.  Leave any
15310 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
15320 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
15330 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
15340 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 70  ic int sqlite3Op
15350 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50  enTempDatabase(P
15360 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
15370 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
15380 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
15390 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d   db->aDb[1].pBt=
153a0 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65  =0 && !pParse->e
153b0 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e  xplain ){.    in
153c0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74  t rc = sqlite3Bt
153d0 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30  reeFactory(db, 0
153e0 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20  , 0, MAX_PAGES, 
153f0 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29  &db->aDb[1].pBt)
15400 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
15410 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15420 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15430 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
15440 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
15450 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a  rary database ".
15460 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f          "file fo
15470 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72  r storing tempor
15480 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20  ary tables");.  
15490 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
154a0 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
154b0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
154c0 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 21  f( db->flags & !
154d0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
154e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
154f0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
15500 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ans(db->aDb[1].p
15510 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  Bt, 1);.      if
15520 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15530 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
15540 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15550 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65  e, "unable to ge
15560 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  t a write lock o
15570 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 74  n ".          "t
15580 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  he temporary dat
15590 61 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20 20  abase file");.  
155a0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
155b0 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72   = rc;.        r
155c0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
155d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
155e0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
155f0 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
15600 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72  de that will ver
15610 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
15620 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a  ookie and start.
15630 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  ** a read-transa
15640 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61  ction for all na
15650 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
15660 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  es..**.** It is 
15670 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
15680 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  ll schema cookie
15690 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e  s be verified an
156a0 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72  d all.** read tr
156b0 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74  ansactions be st
156c0 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79  arted before any
156d0 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65  thing else happe
156e0 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42  ns in.** the VDB
156f0 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20  E program.  But 
15700 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
15710 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
15720 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63   much other.** c
15730 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e  ode has been gen
15740 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65  erated.  So here
15750 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a   is what we do:.
15760 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
15770 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
15780 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20  e is called, we 
15790 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20  code an OP_Goto 
157a0 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d  that.** will jum
157b0 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e  p to a subroutin
157c0 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
157d0 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68  the program.  Th
157e0 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20  en we.** record 
157f0 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74  every database t
15800 68 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63  hat needs its sc
15810 68 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e  hema verified in
15820 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e   the.** pParse->
15830 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64  cookieMask field
15840 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20  .  Later, after 
15850 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68  all other code h
15860 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72  as been.** gener
15870 61 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75  ated, the subrou
15880 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74  tine that does t
15890 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
158a0 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73  cations and.** s
158b0 74 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61  tarts the transa
158c0 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63  ctions will be c
158d0 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f  oded and the OP_
158e0 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a  Goto P2 value.**
158f0 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
15900 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73   point to that s
15910 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
15920 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68  generation of th
15930 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69  e.** cookie veri
15940 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74  fication subrout
15950 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73  ine code happens
15960 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73   in sqlite3Finis
15970 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a  hCoding()..**.**
15980 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63   If iDb<0 then c
15990 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20  ode the OP_Goto 
159a0 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74  only - don't set
159b0 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20   flag to verify 
159c0 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e  the.** schema on
159d0 20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20   any databases. 
159e0 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
159f0 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68  d to position th
15a00 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72  e OP_Goto.** ear
15a10 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20  ly in the code, 
15a20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69  before we know i
15a30 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74  f any database t
15a40 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73  ables will be us
15a50 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
15a60 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
15a70 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
15a80 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73  e, int iDb){.  s
15a90 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
15aa0 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73  be *v;.  int mas
15ab0 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  k;..  v = sqlite
15ac0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
15ad0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
15ae0 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20  eturn;  /* This 
15af0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20  only happens if 
15b00 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f  there was a prio
15b10 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20  r error */.  db 
15b20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
15b30 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  if( pParse->cook
15b40 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20  ieGoto==0 ){.   
15b50 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
15b60 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oto = sqlite3Vdb
15b70 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
15b80 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a  o, 0, 0)+1;.  }.
15b90 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a    if( iDb>=0 ){.
15ba0 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c      assert( iDb<
15bb0 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61  db->nDb );.    a
15bc0 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69  ssert( db->aDb[i
15bd0 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44  Db].pBt!=0 || iD
15be0 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  b==1 );.    asse
15bf0 72 74 28 20 69 44 62 3c 33 32 20 29 3b 0a 20 20  rt( iDb<32 );.  
15c00 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b    mask = 1<<iDb;
15c10 0a 20 20 20 20 69 66 28 20 28 70 50 61 72 73 65  .    if( (pParse
15c20 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d  ->cookieMask & m
15c30 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
15c40 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
15c50 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
15c60 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
15c70 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62  eValue[iDb] = db
15c80 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d  ->aDb[iDb].schem
15c90 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20  a_cookie;.      
15ca0 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
15cb0 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
15cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
15cd0 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 50  nTempDatabase(pP
15ce0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  arse);.      }. 
15cf0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
15d00 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
15d10 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72  code that prepar
15d20 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20  es for doing an 
15d30 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a  operation that.*
15d40 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  * might change t
15d50 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
15d60 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15d70 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61  starts a new tra
15d80 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61  nsaction if we a
15d90 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77  re not already w
15da0 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73  ithin.** a trans
15db0 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61  action.  If we a
15dc0 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  re already withi
15dd0 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  n a transaction,
15de0 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69   then a checkpoi
15df0 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20  nt.** is set if 
15e00 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74  the setStatement
15e10 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72   parameter is tr
15e20 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e  ue.  A checkpoin
15e30 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
15e40 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e  et for operation
15e50 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69  s that might fai
15e60 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73  l (due to a cons
15e70 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a  traint) part of.
15e80 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75  ** the way throu
15e90 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c  gh and which wil
15ea0 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73  l need to undo s
15eb0 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f  ome writes witho
15ec0 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20  ut having to.** 
15ed0 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f  rollback the who
15ee0 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  le transaction. 
15ef0 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   For operations 
15f00 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72  where all constr
15f10 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20  aints.** can be 
15f20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61  checked before a
15f30 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  ny changes are m
15f40 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ade to the datab
15f50 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72  ase, it is never
15f60 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  .** necessary to
15f70 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e   undo a write an
15f80 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  d the checkpoint
15f90 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73   should not be s
15fa0 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64  et..**.** Only d
15fb0 61 74 61 62 61 73 65 20 69 44 62 20 61 6e 64 20  atabase iDb and 
15fc0 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
15fd0 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  e are made writa
15fe0 62 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c 6c  ble by this call
15ff0 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20  ..** If iDb==0, 
16000 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e  then the main an
16010 64 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 73  d temp databases
16020 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62   are made writab
16030 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d  le.   If.** iDb=
16040 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65  =1 then only the
16050 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 69   temp database i
16060 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e  s made writable.
16070 20 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e 20    If iDb>1 then 
16080 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  the.** specified
16090 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
160a0 61 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d 70  ase and the temp
160b0 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61   database are ma
160c0 64 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a  de writable..*/.
160d0 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
160e0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
160f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
16100 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c  nt setStatement,
16110 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
16120 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
16130 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
16140 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
16150 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64  rn;.  sqlite3Cod
16160 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
16170 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 50  arse, iDb);.  pP
16180 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20  arse->writeMask 
16190 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28  |= 1<<iDb;.  if(
161a0 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 26 26   setStatement &&
161b0 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
161c0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
161d0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
161e0 5f 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62 2c  _Statement, iDb,
161f0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28   0);.  }.  if( (
16200 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69  OMIT_TEMPDB || i
16210 44 62 21 3d 31 29 20 26 26 20 70 50 61 72 73 65  Db!=1) && pParse
16220 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ->db->aDb[1].pBt
16230 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
16240 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
16250 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 73 65  ation(pParse, se
16260 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a  tStatement, 1);.
16270 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65    }.}../*.** Che
16280 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e  ck to see if pIn
16290 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c  dex uses the col
162a0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
162b0 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a  pColl.  Return.*
162c0 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65  * true if it doe
162d0 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69  s and false if i
162e0 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23  t does not..*/.#
162f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16300 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
16310 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d  c int collationM
16320 61 74 63 68 28 43 6f 6c 6c 53 65 71 20 2a 70 43  atch(CollSeq *pC
16330 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  oll, Index *pInd
16340 65 78 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 70  ex){.  int n = p
16350 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e  Index->keyInfo.n
16360 46 69 65 6c 64 3b 0a 20 20 43 6f 6c 6c 53 65 71  Field;.  CollSeq
16370 20 2a 2a 70 70 20 3d 20 70 49 6e 64 65 78 2d 3e   **pp = pIndex->
16380 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 3b 0a 20  keyInfo.aColl;. 
16390 20 77 68 69 6c 65 28 20 6e 2d 2d 20 29 7b 0a 20   while( n-- ){. 
163a0 20 20 20 69 66 28 20 2a 70 70 3d 3d 70 43 6f 6c     if( *pp==pCol
163b0 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  l ) return 1;.  
163c0 20 20 70 70 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65    pp++;.  }.  re
163d0 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
163e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
163f0 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
16400 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20 74   pTab that use t
16410 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
16420 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20  uence pColl..** 
16430 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e  If pColl==0 then
16440 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   recompute all i
16450 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a  ndices of pTab..
16460 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
16470 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
16480 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64  tatic void reind
16490 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  exTable(Parse *p
164a0 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
164b0 61 62 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ab, CollSeq *pCo
164c0 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ll){.  Index *pI
164d0 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
164e0 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61     /* An index a
164f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
16500 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49  Tab */..  for(pI
16510 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  ndex=pTab->pInde
16520 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
16530 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29  x=pIndex->pNext)
16540 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d  {.    if( pColl=
16550 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d  =0 || collationM
16560 61 74 63 68 28 70 43 6f 6c 6c 2c 70 49 6e 64 65  atch(pColl,pInde
16570 78 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  x) ){.      sqli
16580 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
16590 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
165a0 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20  , pTab->iDb);.  
165b0 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
165c0 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
165d0 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
165e0 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
165f0 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
16600 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61  all indices of a
16610 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c  ll tables in all
16620 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65   databases where
16630 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20   the.** indices 
16640 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
16650 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
16660 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  .  If pColl==0 t
16670 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a  hen recompute.**
16680 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65   all indices eve
16690 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e  rywhere..*/.#ifn
166a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
166b0 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
166c0 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62  oid reindexDatab
166d0 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ases(Parse *pPar
166e0 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  se, CollSeq *pCo
166f0 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20  ll){.  Db *pDb; 
16700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16710 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64     /* A single d
16720 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
16730 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
16740 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16750 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
16760 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
16770 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
16780 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
16790 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
167a0 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20  n */.  HashElem 
167b0 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *k;             
167c0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
167d0 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e  g over tables in
167e0 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20   pDb */.  Table 
167f0 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
16800 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
16810 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
16820 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30   */..  for(iDb=0
16830 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69  , pDb=db->aDb; i
16840 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
16850 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 69  +, pDb++){.    i
16860 66 28 20 70 44 62 3d 3d 30 20 29 20 63 6f 6e 74  f( pDb==0 ) cont
16870 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6b 3d  inue;.    for(k=
16880 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
16890 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20  &pDb->tblHash); 
168a0 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68   k; k=sqliteHash
168b0 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20  Next(k)){.      
168c0 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73  pTab = (Table*)s
168d0 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29  qliteHashData(k)
168e0 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54  ;.      reindexT
168f0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
16900 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  b, pColl);.    }
16910 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
16920 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
16930 64 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44  de for the REIND
16940 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  EX command..**.*
16950 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
16960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16970 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31              -- 1
16980 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
16990 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20  EX  <collation> 
169a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
169b0 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   2.**        REI
169c0 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65  NDEX  ?<database
169d0 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20  >.?<tablename>  
169e0 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 3.**        R
169f0 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
16a00 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e  se>.?<indexname>
16a10 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72    -- 4.**.** For
16a20 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69  m 1 causes all i
16a30 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74  ndices in all at
16a40 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
16a50 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a   to be rebuilt..
16a60 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c  ** Form 2 rebuil
16a70 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69  ds all indices i
16a80 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  n all databases 
16a90 74 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d  that use the nam
16aa0 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20  ed.** collating 
16ab0 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73  function.  Forms
16ac0 20 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64   3 and 4 rebuild
16ad0 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
16ae0 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63   or all.** indic
16af0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
16b00 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  th the named tab
16b10 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  le..*/.#ifndef S
16b20 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
16b30 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  EX.void sqlite3R
16b40 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  eindex(Parse *pP
16b50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
16b60 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  me1, Token *pNam
16b70 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e2){.  CollSeq *
16b80 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
16b90 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
16ba0 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72  sequence to be r
16bb0 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c  eindexed, or NUL
16bc0 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  L */.  char *z; 
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16be0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20     /* Name of a 
16bf0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a  table or index *
16c00 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
16c10 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  zDb;            
16c20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
16c30 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62  atabase */.  Tab
16c40 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
16c50 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
16c60 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
16c70 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ase */.  Index *
16c80 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  pIndex;         
16c90 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
16ca0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
16cb0 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
16cc0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
16cd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
16ce0 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
16cf0 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
16d00 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
16d10 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
16d20 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
16d30 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a  */.  Token *pObj
16d40 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
16d50 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
16d60 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
16d70 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a  o be reindexed *
16d80 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  /..  /* Read the
16d90 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
16da0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
16db0 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
16dc0 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
16dd0 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
16de0 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
16df0 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
16e00 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
16e10 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
16e20 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
16e30 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e  n;.  }..  if( pN
16e40 61 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65  ame1==0 || pName
16e50 31 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72  1->z==0 ){.    r
16e60 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
16e70 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20  pParse, 0);.    
16e80 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20  return;.  }else 
16e90 69 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c  if( pName2==0 ||
16ea0 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b   pName2->z==0 ){
16eb0 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
16ec0 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
16ed0 64 62 2c 20 64 62 2d 3e 65 6e 63 2c 20 70 4e 61  db, db->enc, pNa
16ee0 6d 65 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d 3e  me1->z, pName1->
16ef0 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  n, 0);.    if( p
16f00 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
16f10 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
16f20 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20  Parse, pColl);. 
16f30 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
16f40 20 7d 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73   }.  }.  iDb = s
16f50 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
16f60 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
16f70 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e  , pName2, &pObjN
16f80 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
16f90 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20  0 ) return;.  z 
16fa0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
16fb0 6d 54 6f 6b 65 6e 28 70 4f 62 6a 4e 61 6d 65 29  mToken(pObjName)
16fc0 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  zDb = db->aD
16fd0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
16fe0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
16ff0 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a  ndTable(db, z, z
17000 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20  Db);.  if( pTab 
17010 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61  ){.    reindexTa
17020 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
17030 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
17040 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 72 65 74  Free(z);.    ret
17050 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65  urn;.  }.  pInde
17060 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
17070 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29  ndex(db, z, zDb)
17080 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
17090 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  );.  if( pIndex 
170a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
170b0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
170c0 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
170d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
170e0 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
170f0 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20  , pIndex, -1);. 
17100 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
17110 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
17120 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
17130 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65   to identify the
17140 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65   object to be re
17150 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e  indexed");.}.#en
17160 64 69 66 0a                                      dif.