/ Hex Artifact Content
Login

Artifact 8c93ae10563e8b92d3d7ea532a606424be3cb4f7:


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 35 20 32 30 30 35 2f 31 31 2f 31 34  1.355 2005/11/14
02f0: 20 32 32 3a 32 39 3a 30 35 20 64 72 68 20 45 78   22:29:05 drh Ex
0300: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0310: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0320: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
0330: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
0340: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
0350: 68 65 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74  hen a new SQL st
0360: 61 74 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e  atement is begin
0370: 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61  ning to.** be pa
0380: 72 73 65 64 2e 20 20 49 6e 69 74 69 61 6c 69 7a  rsed.  Initializ
0390: 65 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  e the pParse str
03a0: 75 63 74 75 72 65 20 61 73 20 6e 65 65 64 65 64  ucture as needed
03b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
03c0: 33 42 65 67 69 6e 50 61 72 73 65 28 50 61 72 73  3BeginParse(Pars
03d0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65  e *pParse, int e
03e0: 78 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 70  xplainFlag){.  p
03f0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d  Parse->explain =
0400: 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a 20 20   explainFlag;.  
0410: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
0420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
0430: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
0440: 64 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65  d after a single
0450: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68   SQL statement h
0460: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65  as been.** parse
0470: 64 20 61 6e 64 20 61 20 56 44 42 45 20 70 72 6f  d and a VDBE pro
0480: 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20  gram to execute 
0490: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20 68  that statement h
04a0: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65 70 61  as been.** prepa
04b0: 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  red.  This routi
04c0: 6e 65 20 70 75 74 73 20 74 68 65 20 66 69 6e 69  ne puts the fini
04d0: 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20 6f 6e  shing touches on
04e0: 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f   the.** VDBE pro
04f0: 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74 73 20  gram and resets 
0500: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
0510: 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e 65 78  ture for the nex
0520: 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a  t.** parse..**.*
0530: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61  * Note that if a
0540: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
0550: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
0560: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e  e case that.** n
0570: 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20  o VDBE code was 
0580: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f  generated..*/.vo
0590: 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  id sqlite3Finish
05a0: 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a 70 50  Coding(Parse *pP
05b0: 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
05c0: 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
05d0: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ..  if( sqlite3_
05e0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
05f0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
0600: 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20 72  arse->nested ) r
0610: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50  eturn;.  if( !pP
0620: 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20  arse->pVdbe ){. 
0630: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72     if( pParse->r
0640: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
0650: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
0660: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
0670: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
0680: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
0690: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  n;.  }..  /* Beg
06a0: 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67  in by generating
06b0: 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f   some terminatio
06c0: 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e  n code at the en
06d0: 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64  d of the.  ** vd
06e0: 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a  be program.  */.
06f0: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
0700: 62 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  b;.  v = sqlite3
0710: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
0720: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
0730: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0740: 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 30 2c 20  (v, OP_Halt, 0, 
0750: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  0);..    /* The 
0760: 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63 6f 6e 74  cookie mask cont
0770: 61 69 6e 73 20 6f 6e 65 20 62 69 74 20 66 6f 72  ains one bit for
0780: 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
0790: 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a  ile open..    **
07a0: 20 28 42 69 74 20 30 20 69 73 20 66 6f 72 20 6d   (Bit 0 is for m
07b0: 61 69 6e 2c 20 62 69 74 20 31 20 69 73 20 66 6f  ain, bit 1 is fo
07c0: 72 20 74 65 6d 70 2c 20 61 6e 64 20 73 6f 20 66  r temp, and so f
07d0: 6f 72 74 68 2e 29 20 20 42 69 74 73 20 61 72 65  orth.)  Bits are
07e0: 0a 20 20 20 20 2a 2a 20 73 65 74 20 66 6f 72 20  .    ** set for 
07f0: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 74 68  each database th
0800: 61 74 20 69 73 20 75 73 65 64 2e 20 20 47 65 6e  at is used.  Gen
0810: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 74  erate code to st
0820: 61 72 74 20 61 0a 20 20 20 20 2a 2a 20 74 72 61  art a.    ** tra
0830: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65 61 63 68  nsaction on each
0840: 20 75 73 65 64 20 64 61 74 61 62 61 73 65 20 61   used database a
0850: 6e 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 65  nd to verify the
0860: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 20   schema cookie. 
0870: 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68 20 75 73     ** on each us
0880: 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  ed database..   
0890: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72   */.    if( pPar
08a0: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3e 30  se->cookieGoto>0
08b0: 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20 6d 61   ){.      u32 ma
08c0: 73 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 44  sk;.      int iD
08d0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
08e0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
08f0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
0900: 74 6f 2d 31 29 3b 0a 20 20 20 20 20 20 66 6f 72  to-1);.      for
0910: 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20  (iDb=0, mask=1; 
0920: 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 6d 61 73  iDb<db->nDb; mas
0930: 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29 7b 0a 20  k<<=1, iDb++){. 
0940: 20 20 20 20 20 20 20 69 66 28 20 28 6d 61 73 6b         if( (mask
0950: 20 26 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69   & pParse->cooki
0960: 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63 6f 6e 74  eMask)==0 ) cont
0970: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71  inue;.        sq
0980: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
0990: 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  , OP_Transaction
09a0: 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20 26 20 70  , iDb, (mask & p
09b0: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
09c0: 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 73  )!=0);.        s
09d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
09e0: 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b  v, OP_VerifyCook
09f0: 69 65 2c 20 69 44 62 2c 20 70 50 61 72 73 65 2d  ie, iDb, pParse-
0a00: 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62  >cookieValue[iDb
0a10: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
0a20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
0a30: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
0a40: 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  , pParse->cookie
0a50: 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  Goto);.    }..#i
0a60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0a70: 54 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 41  T_TRACE.    /* A
0a80: 64 64 20 61 20 4e 6f 2d 6f 70 20 74 68 61 74 20  dd a No-op that 
0a90: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6d  contains the com
0aa0: 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
0ab0: 65 20 63 6f 6d 70 69 6c 65 64 20 53 51 4c 0a 20  e compiled SQL. 
0ac0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
0ad0: 61 73 20 69 74 73 20 50 33 20 61 72 67 75 6d 65  as its P3 argume
0ae0: 6e 74 2e 20 20 54 68 69 73 20 64 6f 65 73 20 6e  nt.  This does n
0af0: 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 66 75  ot change the fu
0b00: 6e 63 74 69 6f 6e 61 6c 69 74 79 0a 20 20 20 20  nctionality.    
0b10: 2a 2a 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  ** of the progra
0b20: 6d 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  m. .    **.    *
0b30: 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74  * This is used t
0b40: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69  o implement sqli
0b50: 74 65 33 5f 74 72 61 63 65 28 29 2e 0a 20 20 20  te3_trace()..   
0b60: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
0b70: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 6f  dbeOp3(v, OP_Noo
0b80: 70 2c 20 30 2c 20 30 2c 20 70 50 61 72 73 65 2d  p, 0, 0, pParse-
0b90: 3e 7a 53 71 6c 2c 20 70 50 61 72 73 65 2d 3e 7a  >zSql, pParse->z
0ba0: 54 61 69 6c 2d 70 50 61 72 73 65 2d 3e 7a 53 71  Tail-pParse->zSq
0bb0: 6c 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  l);.#endif /* SQ
0bc0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
0bd0: 2a 2f 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65  */.  }...  /* Ge
0be0: 74 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  t the VDBE progr
0bf0: 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65 78 65  am ready for exe
0c00: 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66  cution.  */.  if
0c10: 28 20 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ( v && pParse->n
0c20: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49  Err==0 ){.    FI
0c30: 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d  LE *trace = (db-
0c40: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
0c50: 56 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20  VdbeTrace)!=0 ? 
0c60: 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20  stdout : 0;.    
0c70: 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 63 65  sqlite3VdbeTrace
0c80: 28 76 2c 20 74 72 61 63 65 29 3b 0a 20 20 20 20  (v, trace);.    
0c90: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
0ca0: 65 61 64 79 28 76 2c 20 70 50 61 72 73 65 2d 3e  eady(v, pParse->
0cb0: 6e 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d  nVar, pParse->nM
0cc0: 65 6d 2b 33 2c 0a 20 20 20 20 20 20 20 20 20 20  em+3,.          
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0ce0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 33 2c 20 70  Parse->nTab+3, p
0cf0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b  Parse->explain);
0d00: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
0d10: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
0d20: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
0d30: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  mesSet = 0;.  }e
0d40: 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e  lse if( pParse->
0d50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
0d60: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
0d70: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
0d80: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54    }.  pParse->nT
0d90: 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ab = 0;.  pParse
0da0: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50  ->nMem = 0;.  pP
0db0: 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a  arse->nSet = 0;.
0dc0: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
0dd0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   0;.  pParse->co
0de0: 6f 6b 69 65 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  okieMask = 0;.  
0df0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
0e00: 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  to = 0;.}../*.**
0e10: 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72 20   Run the parser 
0e20: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
0e30: 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20 69  or recursively i
0e40: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72  n order to gener
0e50: 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20  ate.** code for 
0e60: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
0e70: 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65  t given onto the
0e80: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72   end of the pPar
0e90: 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75  se context.** cu
0ea0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
0eb0: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65  nstruction.  Whe
0ec0: 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20  n the parser is 
0ed0: 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a  run recursively.
0ee0: 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68 65  ** this way, the
0ef0: 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69   final OP_Halt i
0f00: 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61  s not appended a
0f10: 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c  nd other initial
0f20: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66  ization.** and f
0f30: 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70  inalization step
0f40: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65  s are omitted be
0f50: 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20  cause those are 
0f60: 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a  handling by the.
0f70: 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72  ** outermost par
0f80: 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65  ser..**.** Not e
0f90: 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73  verything is nes
0fa0: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63  table.  This fac
0fb0: 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e 65  ility is designe
0fc0: 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49  d to permit.** I
0fd0: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61  NSERT, UPDATE, a
0fe0: 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74  nd DELETE operat
0ff0: 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c  ions against SQL
1000: 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65  ITE_MASTER.  Use
1010: 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20  .** care if you 
1020: 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f  decide to try to
1030: 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   use this routin
1040: 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
1050: 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f   purposes..*/.vo
1060: 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  id sqlite3Nested
1070: 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61  Parse(Parse *pPa
1080: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
1090: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
10a0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
10b0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 23 20 64 65  char *zSql;.# de
10c0: 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73  fine SAVE_SZ  (s
10d0: 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f  izeof(Parse) - o
10e0: 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56  ffsetof(Parse,nV
10f0: 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76 65  ar)).  char save
1100: 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20  Buf[SAVE_SZ];.. 
1110: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1120: 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  r ) return;.  as
1130: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65  sert( pParse->ne
1140: 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e  sted<10 );  /* N
1150: 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e  esting should on
1160: 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64  ly be of limited
1170: 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73   depth */.  va_s
1180: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
1190: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
11a0: 74 65 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72  te3VMPrintf(zFor
11b0: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
11c0: 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 53  nd(ap);.  if( zS
11d0: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ql==0 ){.    ret
11e0: 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c  urn;   /* A mall
11f0: 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
1200: 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61  led */.  }.  pPa
1210: 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20  rse->nested++;. 
1220: 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66 2c   memcpy(saveBuf,
1230: 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20   &pParse->nVar, 
1240: 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73  SAVE_SZ);.  mems
1250: 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72  et(&pParse->nVar
1260: 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20  , 0, SAVE_SZ);. 
1270: 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65   sqlite3RunParse
1280: 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20  r(pParse, zSql, 
1290: 30 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  0);.  sqliteFree
12a0: 28 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79  (zSql);.  memcpy
12b0: 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  (&pParse->nVar, 
12c0: 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a  saveBuf, SAVE_SZ
12d0: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73  );.  pParse->nes
12e0: 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ted--;.}../*.** 
12f0: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
1300: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
1310: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20  hat describes a 
1320: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
1330: 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76  ase.** table giv
1340: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
1350: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
1360: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
1370: 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ame of the.** da
1380: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
1390: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
13a0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
13b0: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
13c0: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
13d0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
13e0: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
13f0: 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68  the table and th
1400: 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68  e.** first match
1410: 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74  ing table is ret
1420: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
1430: 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61  king for duplica
1440: 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65  te table.** name
1450: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
1460: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
1470: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
1480: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
1490: 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61  .** auxiliary da
14a0: 74 61 62 61 73 65 73 20 61 64 64 65 64 20 75 73  tabases added us
14b0: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
14c0: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65  ommand..**.** Se
14d0: 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f  e also sqlite3Lo
14e0: 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a  cateTable()..*/.
14f0: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69  Table *sqlite3Fi
1500: 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  ndTable(sqlite3 
1510: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1520: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
1530: 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a  ar *zDatabase){.
1540: 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a    Table *p = 0;.
1550: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
1560: 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20  t( zName!=0 );. 
1570: 20 61 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c   assert( (db->fl
1580: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 69  ags & SQLITE_Ini
1590: 74 69 61 6c 69 7a 65 64 29 20 7c 7c 20 64 62 2d  tialized) || db-
15a0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
15b0: 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44  for(i=OMIT_TEMPD
15c0: 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  B; i<db->nDb; i+
15d0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
15e0: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
15f0: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d     /* Search TEM
1600: 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f  P before MAIN */
1610: 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61  .    if( zDataba
1620: 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  se!=0 && sqlite3
1630: 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73  StrICmp(zDatabas
1640: 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e  e, db->aDb[j].zN
1650: 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ame) ) continue;
1660: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
1670: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
1680: 62 5b 6a 5d 2e 74 62 6c 48 61 73 68 2c 20 7a 4e  b[j].tblHash, zN
1690: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
16a0: 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70  e)+1);.    if( p
16b0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
16c0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
16d0: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
16e0: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
16f0: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
1700: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
1710: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
1720: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
1730: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
1740: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
1750: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
1760: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
1770: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
1780: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
1790: 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f  not found.  Also
17a0: 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72   leave an.** err
17b0: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
17c0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
17d0: 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
17e0: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
17f0: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c   routine and sql
1800: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20  ite3FindTable() 
1810: 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
1820: 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61  routine leaves a
1830: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
1840: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
1850: 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69  sg where.** sqli
1860: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64  te3FindTable() d
1870: 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c  oes not..*/.Tabl
1880: 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  e *sqlite3Locate
1890: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
18a0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
18b0: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
18c0: 61 72 20 2a 7a 44 62 61 73 65 29 7b 0a 20 20 54  ar *zDbase){.  T
18d0: 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52  able *p;..  /* R
18e0: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
18f0: 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
1900: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
1910: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
1920: 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
1930: 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
1940: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
1950: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
1960: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
1970: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
1980: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1990: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69  .  p = sqlite3Fi
19a0: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
19b0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73  db, zName, zDbas
19c0: 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  e);.  if( p==0 )
19d0: 7b 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73 65  {.    if( zDbase
19e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
19f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1a00: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
1a10: 3a 20 25 73 2e 25 73 22 2c 20 7a 44 62 61 73 65  : %s.%s", zDbase
1a20: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  , zName);.    }e
1a30: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1a40: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1a50: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
1a60: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
1a70: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
1a80: 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
1a90: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
1aa0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
1ab0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
1ac0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1ad0: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
1ae0: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
1af0: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
1b00: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a  of that index.**
1b10: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   and the name of
1b20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
1b30: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
1b40: 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e  index..** Return
1b50: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
1b60: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
1b70: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
1b80: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
1b90: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a  earched for the.
1ba0: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  ** table and the
1bb0: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
1bc0: 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65  index is returne
1bd0: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
1be0: 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74  .** for duplicat
1bf0: 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73  e index names is
1c00: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
1c10: 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20  rch order is.** 
1c20: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
1c30: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20   MAIN, then any 
1c40: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
1c50: 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69  ses added.** usi
1c60: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
1c70: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20  mmand..*/.Index 
1c80: 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65  *sqlite3FindInde
1c90: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  x(sqlite3 *db, c
1ca0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1cb0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
1cc0: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  b){.  Index *p =
1cd0: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61   0;.  int i;.  a
1ce0: 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c 61 67  ssert( (db->flag
1cf0: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 69 74 69  s & SQLITE_Initi
1d00: 61 6c 69 7a 65 64 29 20 7c 7c 20 64 62 2d 3e 69  alized) || db->i
1d10: 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 66 6f  nit.busy );.  fo
1d20: 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b  r(i=OMIT_TEMPDB;
1d30: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
1d40: 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69  {.    int j = (i
1d50: 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20  <2) ? i^1 : i;  
1d60: 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62  /* Search TEMP b
1d70: 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20  efore MAIN */.  
1d80: 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c    if( zDb && sql
1d90: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
1da0: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d   db->aDb[j].zNam
1db0: 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
1dc0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
1dd0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b  shFind(&db->aDb[
1de0: 6a 5d 2e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  j].idxHash, zNam
1df0: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
1e00: 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  +1);.    if( p )
1e10: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
1e20: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1e30: 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d   Reclaim the mem
1e40: 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20 69  ory used by an i
1e50: 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ndex.*/.static v
1e60: 6f 69 64 20 66 72 65 65 49 6e 64 65 78 28 49 6e  oid freeIndex(In
1e70: 64 65 78 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dex *p){.  sqlit
1e80: 65 46 72 65 65 28 70 2d 3e 7a 43 6f 6c 41 66 66  eFree(p->zColAff
1e90: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
1ea0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  p);.}../*.** Rem
1eb0: 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e  ove the given in
1ec0: 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64  dex from the ind
1ed0: 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61  ex hash table, a
1ee0: 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d  nd free.** its m
1ef0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
1f00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ..**.** The inde
1f10: 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  x is removed fro
1f20: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  m the database h
1f30: 61 73 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a  ash tables but.*
1f40: 2a 20 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69  * it is not unli
1f50: 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61  nked from the Ta
1f60: 62 6c 65 20 74 68 61 74 20 69 74 20 69 6e 64 65  ble that it inde
1f70: 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e  xes..** Unlinkin
1f80: 67 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65  g from the Table
1f90: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79   must be done by
1fa0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
1fb0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1fc0: 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65   void sqliteDele
1fd0: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  teIndex(sqlite3 
1fe0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
1ff0: 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a    Index *pOld;..
2000: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
2010: 26 26 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29  && p->zName!=0 )
2020: 3b 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74  ;.  pOld = sqlit
2030: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  e3HashInsert(&db
2040: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64  ->aDb[p->iDb].id
2050: 78 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  xHash, p->zName,
2060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2070: 20 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65             strle
2080: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30  n(p->zName)+1, 0
2090: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6c  );.  assert( pOl
20a0: 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20  d==0 || pOld==p 
20b0: 29 3b 0a 20 20 66 72 65 65 49 6e 64 65 78 28 70  );.  freeIndex(p
20c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  );.}../*.** For 
20d0: 74 68 65 20 69 6e 64 65 78 20 63 61 6c 6c 65 64  the index called
20e0: 20 7a 49 64 78 4e 61 6d 65 20 77 68 69 63 68 20   zIdxName which 
20f0: 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  is found in the 
2100: 64 61 74 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a  database iDb,.**
2110: 20 75 6e 6c 69 6b 65 20 74 68 61 74 20 69 6e 64   unlike that ind
2120: 65 78 20 66 72 6f 6d 20 69 74 73 20 54 61 62 6c  ex from its Tabl
2130: 65 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  e then remove th
2140: 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20  e index from.** 
2150: 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74  the index hash t
2160: 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20 61 6c  able and free al
2170: 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  l memory structu
2180: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  res associated.*
2190: 2a 20 77 69 74 68 20 74 68 65 20 69 6e 64 65 78  * with the index
21a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21b0: 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
21c0: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
21d0: 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73  b, int iDb, cons
21e0: 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65  t char *zIdxName
21f0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
2200: 65 78 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a  ex;.  int len;..
2210: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a    len = strlen(z
2220: 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64  IdxName);.  pInd
2230: 65 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ex = sqlite3Hash
2240: 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b  Insert(&db->aDb[
2250: 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 7a 49  iDb].idxHash, zI
2260: 64 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31 2c 20 30  dxName, len+1, 0
2270: 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  );.  if( pIndex 
2280: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  ){.    if( pInde
2290: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
22a0: 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  x==pIndex ){.   
22b0: 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c     pIndex->pTabl
22c0: 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  e->pIndex = pInd
22d0: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ex->pNext;.    }
22e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
22f0: 78 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  x *p;.      for(
2300: 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  p=pIndex->pTable
2310: 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70  ->pIndex; p && p
2320: 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b  ->pNext!=pIndex;
2330: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20   p=p->pNext){}. 
2340: 20 20 20 20 20 69 66 28 20 70 20 26 26 20 70 2d       if( p && p-
2350: 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29  >pNext==pIndex )
2360: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65  {.        p->pNe
2370: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
2380: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
2390: 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28  }.    freeIndex(
23a0: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64  pIndex);.  }.  d
23b0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
23c0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
23d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
23e0: 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f   all schema info
23f0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
2400: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
2410: 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 61 20 73  tables of.** a s
2420: 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 2e 20  ingle database. 
2430: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2440: 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61   called to recla
2450: 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66  im memory.** bef
2460: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
2470: 20 63 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20   closes.  It is 
2480: 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69  also called duri
2490: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  ng a rollback.**
24a0: 20 69 66 20 74 68 65 72 65 20 77 65 72 65 20 73   if there were s
24b0: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75  chema changes du
24c0: 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ring the transac
24d0: 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a 2a 2a 20  tion or if a.** 
24e0: 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69  schema-cookie mi
24f0: 73 6d 61 74 63 68 20 6f 63 63 75 72 73 2e 0a 2a  smatch occurs..*
2500: 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 3d 30 20 74  *.** If iDb<=0 t
2510: 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e  hen reset the in
2520: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61  ternal schema ta
2530: 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74  bles for all dat
2540: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20  abase.** files. 
2550: 20 49 66 20 69 44 62 3e 3d 32 20 74 68 65 6e 20   If iDb>=2 then 
2560: 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e  reset the intern
2570: 61 6c 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e  al schema for on
2580: 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65  ly the.** single
2590: 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64 2e   file indicated.
25a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25b0: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
25c0: 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ema(sqlite3 *db,
25d0: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 48 61 73   int iDb){.  Has
25e0: 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20  hElem *pElem;.  
25f0: 48 61 73 68 20 74 65 6d 70 31 3b 0a 20 20 48 61  Hash temp1;.  Ha
2600: 73 68 20 74 65 6d 70 32 3b 0a 20 20 69 6e 74 20  sh temp2;.  int 
2610: 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65 72 74 28  i, j;..  assert(
2620: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
2630: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 64 62 2d 3e  b->nDb );.  db->
2640: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
2650: 5f 49 6e 69 74 69 61 6c 69 7a 65 64 3b 0a 20 20  _Initialized;.  
2660: 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d  for(i=iDb; i<db-
2670: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
2680: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
2690: 44 62 5b 69 5d 3b 0a 20 20 20 20 74 65 6d 70 31  Db[i];.    temp1
26a0: 20 3d 20 70 44 62 2d 3e 74 62 6c 48 61 73 68 3b   = pDb->tblHash;
26b0: 0a 20 20 20 20 74 65 6d 70 32 20 3d 20 70 44 62  .    temp2 = pDb
26c0: 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20 20 20 20  ->trigHash;.    
26d0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
26e0: 26 70 44 62 2d 3e 74 72 69 67 48 61 73 68 2c 20  &pDb->trigHash, 
26f0: 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49  SQLITE_HASH_STRI
2700: 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  NG, 0);.    sqli
2710: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 70 44  te3HashClear(&pD
2720: 62 2d 3e 61 46 4b 65 79 29 3b 0a 20 20 20 20 73  b->aFKey);.    s
2730: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
2740: 26 70 44 62 2d 3e 69 64 78 48 61 73 68 29 3b 0a  &pDb->idxHash);.
2750: 20 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71      for(pElem=sq
2760: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74  liteHashFirst(&t
2770: 65 6d 70 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45  emp2); pElem; pE
2780: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
2790: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
27a0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
27b0: 72 69 67 67 65 72 28 28 54 72 69 67 67 65 72 2a  rigger((Trigger*
27c0: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
27d0: 70 45 6c 65 6d 29 29 3b 0a 20 20 20 20 7d 0a 20  pElem));.    }. 
27e0: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c     sqlite3HashCl
27f0: 65 61 72 28 26 74 65 6d 70 32 29 3b 0a 20 20 20  ear(&temp2);.   
2800: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
2810: 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20  (&pDb->tblHash, 
2820: 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49  SQLITE_HASH_STRI
2830: 4e 47 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28  NG, 0);.    for(
2840: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
2850: 46 69 72 73 74 28 26 74 65 6d 70 31 29 3b 20 70  First(&temp1); p
2860: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
2870: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
2880: 29 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  )){.      Table 
2890: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
28a0: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
28b0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
28c0: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  teTable(db, pTab
28d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
28e0: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 74  ite3HashClear(&t
28f0: 65 6d 70 31 29 3b 0a 20 20 20 20 70 44 62 2d 3e  emp1);.    pDb->
2900: 70 53 65 71 54 61 62 20 3d 20 30 3b 0a 20 20 20  pSeqTab = 0;.   
2910: 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79   DbClearProperty
2920: 28 64 62 2c 20 69 2c 20 44 42 5f 53 63 68 65 6d  (db, i, DB_Schem
2930: 61 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20 69 66  aLoaded);.    if
2940: 28 20 69 44 62 3e 30 20 29 20 72 65 74 75 72 6e  ( iDb>0 ) return
2950: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2960: 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e  iDb==0 );.  db->
2970: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
2980: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
2990: 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20  .  /* If one or 
29a0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 61 75 78 69  more of the auxi
29b0: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66  liary database f
29c0: 69 6c 65 73 20 68 61 73 20 62 65 65 6e 20 63 6c  iles has been cl
29d0: 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  osed,.  ** then 
29e0: 72 65 6d 6f 76 65 20 74 68 65 6e 20 66 72 6f 6d  remove then from
29f0: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
2a00: 61 74 61 62 61 73 65 20 6c 69 73 74 2e 20 20 57  atabase list.  W
2a10: 65 20 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20  e take the.  ** 
2a20: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 64  opportunity to d
2a30: 6f 20 74 68 69 73 20 68 65 72 65 20 73 69 6e 63  o this here sinc
2a40: 65 20 77 65 20 68 61 76 65 20 6a 75 73 74 20 64  e we have just d
2a50: 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20 74 68  eleted all of th
2a60: 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 68 61  e.  ** schema ha
2a70: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68  sh tables and th
2a80: 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68  erefore do not h
2a90: 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20  ave to make any 
2aa0: 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20  changes.  ** to 
2ab0: 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 74 61 62  any of those tab
2ac0: 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  les..  */.  for(
2ad0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
2ae0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
2af0: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
2b00: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
2b10: 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20  pDb->pBt==0 ){. 
2b20: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 41       if( pDb->pA
2b30: 75 78 20 26 26 20 70 44 62 2d 3e 78 46 72 65 65  ux && pDb->xFree
2b40: 41 75 78 20 29 20 70 44 62 2d 3e 78 46 72 65 65  Aux ) pDb->xFree
2b50: 41 75 78 28 70 44 62 2d 3e 70 41 75 78 29 3b 0a  Aux(pDb->pAux);.
2b60: 20 20 20 20 20 20 70 44 62 2d 3e 70 41 75 78 20        pDb->pAux 
2b70: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
2b80: 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62   for(i=j=2; i<db
2b90: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
2ba0: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
2bb0: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
2bc0: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
2bd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2be0: 74 65 46 72 65 65 28 70 44 62 2d 3e 7a 4e 61 6d  teFree(pDb->zNam
2bf0: 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  e);.      pDb->z
2c00: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
2c10: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
2c20: 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20      if( j<i ){. 
2c30: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20       db->aDb[j] 
2c40: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20  = db->aDb[i];.  
2c50: 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d    }.    j++;.  }
2c60: 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61  .  memset(&db->a
2c70: 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e  Db[j], 0, (db->n
2c80: 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d  Db-j)*sizeof(db-
2c90: 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d  >aDb[j]));.  db-
2ca0: 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20  >nDb = j;.  if( 
2cb0: 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62  db->nDb<=2 && db
2cc0: 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74  ->aDb!=db->aDbSt
2cd0: 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63  atic ){.    memc
2ce0: 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63  py(db->aDbStatic
2cf0: 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a  , db->aDb, 2*siz
2d00: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29  eof(db->aDb[0]))
2d10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
2d20: 28 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64  (db->aDb);.    d
2d30: 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  b->aDb = db->aDb
2d40: 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Static;.  }.}../
2d50: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2d60: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
2d70: 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20  ever a rollback 
2d80: 6f 63 63 75 72 73 2e 20 20 49 66 20 74 68 65 72  occurs.  If ther
2d90: 65 20 77 65 72 65 0a 2a 2a 20 73 63 68 65 6d 61  e were.** schema
2da0: 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20   changes during 
2db0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
2dc0: 20 74 68 65 6e 20 77 65 20 68 61 76 65 20 74 6f   then we have to
2dd0: 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 69 6e   reset the.** in
2de0: 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c  ternal hash tabl
2df0: 65 73 20 61 6e 64 20 72 65 6c 6f 61 64 20 74 68  es and reload th
2e00: 65 6d 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2f  em from disk..*/
2e10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
2e20: 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68 61  lbackInternalCha
2e30: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
2e40: 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  ){.  if( db->fla
2e50: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs & SQLITE_Inte
2e60: 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
2e70: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
2e80: 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
2e90: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
2ea0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2eb0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63   called when a c
2ec0: 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f  ommit occurs..*/
2ed0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
2ee0: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
2ef0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
2f00: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
2f10: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  ~SQLITE_InternCh
2f20: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
2f30: 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
2f40: 20 6e 61 6d 65 73 20 66 72 6f 6d 20 61 20 74 61   names from a ta
2f50: 62 6c 65 20 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a  ble or view..*/.
2f60: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
2f70: 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  teResetColumnNam
2f80: 65 73 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  es(Table *pTable
2f90: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  ){.  int i;.  Co
2fa0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73  lumn *pCol;.  as
2fb0: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
2fc0: 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d  );.  if( (pCol =
2fd0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d   pTable->aCol)!=
2fe0: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
2ff0: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
3000: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
3010: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
3020: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
3030: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
3040: 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66  Delete(pCol->pDf
3050: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
3060: 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70  eFree(pCol->zTyp
3070: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
3080: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
3090: 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 70 54  >aCol);.  }.  pT
30a0: 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  able->aCol = 0;.
30b0: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
30c0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d   0;.}../*.** Rem
30d0: 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64  ove the memory d
30e0: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61  ata structures a
30f0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
3100: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c  he given.** Tabl
3110: 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  e.  No changes a
3120: 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20  re made to disk 
3130: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
3140: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
3150: 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73  ine just deletes
3160: 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74   the data struct
3170: 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ure.  It does no
3180: 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20  t unlink.** the 
3190: 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75 63  table data struc
31a0: 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61  ture from the ha
31b0: 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f 72 20 64  sh table.  Nor d
31c0: 6f 65 73 20 69 74 20 72 65 6d 6f 76 65 0a 2a 2a  oes it remove.**
31d0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 66 72   foreign keys fr
31e0: 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 2e 61 46  om the sqlite.aF
31f0: 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20  Key hash table. 
3200: 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73   But it does des
3210: 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73  troy.** memory s
3220: 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65  tructures of the
3230: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
3240: 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69  eign keys associ
3250: 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68  ated with .** th
3260: 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  e table..**.** I
3270: 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
3280: 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
3290: 20 61 72 65 20 75 6e 6c 69 6e 6b 65 64 20 66 72   are unlinked fr
32a0: 6f 6d 20 74 68 65 20 22 64 62 22 0a 2a 2a 20 64  om the "db".** d
32b0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69 66  ata structure if
32c0: 20 64 62 21 3d 4e 55 4c 4c 2e 20 20 49 66 20 64   db!=NULL.  If d
32d0: 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63 65 73  b==NULL, indices
32e0: 20 61 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20   attached to.** 
32f0: 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 64 65  the table are de
3300: 6c 65 74 65 64 2c 20 62 75 74 20 69 74 20 69 73  leted, but it is
3310: 20 61 73 73 75 6d 65 64 20 74 68 65 79 20 68 61   assumed they ha
3320: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a  ve already been.
3330: 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a  ** unlinked..*/.
3340: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
3350: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
3360: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
3370: 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  le){.  Index *pI
3380: 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  ndex, *pNext;.  
3390: 46 4b 65 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e  FKey *pFKey, *pN
33a0: 65 78 74 46 4b 65 79 3b 0a 0a 20 20 69 66 28 20  extFKey;..  if( 
33b0: 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75  pTable==0 ) retu
33c0: 72 6e 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  rn;..  /* Do not
33d0: 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c   delete the tabl
33e0: 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65  e until the refe
33f0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
3400: 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 70  hes zero. */.  p
3410: 54 61 62 6c 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Table->nRef--;. 
3420: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65   if( pTable->nRe
3430: 66 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  f>0 ){.    retur
3440: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
3450: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3d 3d 30   pTable->nRef==0
3460: 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65   );..  /* Delete
3470: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73   all indices ass
3480: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
3490: 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66  s table.  */.  f
34a0: 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62  or(pIndex = pTab
34b0: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  le->pIndex; pInd
34c0: 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74  ex; pIndex=pNext
34d0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
34e0: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
34f0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
3500: 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69  ->iDb==pTable->i
3510: 44 62 20 7c 7c 20 28 70 54 61 62 6c 65 2d 3e 69  Db || (pTable->i
3520: 44 62 3d 3d 30 20 26 26 20 70 49 6e 64 65 78 2d  Db==0 && pIndex-
3530: 3e 69 44 62 3d 3d 31 29 20 29 3b 0a 20 20 20 20  >iDb==1) );.    
3540: 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65  sqliteDeleteInde
3550: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
3560: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
3570: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
3580: 4b 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  KEY.  /* Delete 
3590: 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  all foreign keys
35a0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
35b0: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20 54 68   this table.  Th
35c0: 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75  e keys.  ** shou
35d0: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
35e0: 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72  been unlinked fr
35f0: 6f 6d 20 74 68 65 20 64 62 2d 3e 61 46 4b 65 79  om the db->aFKey
3600: 20 68 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a   hash table .  *
3610: 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54  /.  for(pFKey=pT
3620: 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b  able->pFKey; pFK
3630: 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46  ey; pFKey=pNextF
3640: 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46  Key){.    pNextF
3650: 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65  Key = pFKey->pNe
3660: 78 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65  xtFrom;.    asse
3670: 72 74 28 20 70 54 61 62 6c 65 2d 3e 69 44 62 3c  rt( pTable->iDb<
3680: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61  db->nDb );.    a
3690: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 48 61  ssert( sqlite3Ha
36a0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b  shFind(&db->aDb[
36b0: 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e 61 46 4b  pTable->iDb].aFK
36c0: 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey,.            
36d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
36e0: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65  FKey->zTo, strle
36f0: 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29  n(pFKey->zTo)+1)
3700: 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73  !=pFKey );.    s
3710: 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79 29  qliteFree(pFKey)
3720: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
3730: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61  /* Delete the Ta
3740: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74  ble structure it
3750: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  self..  */.  sql
3760: 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iteResetColumnNa
3770: 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20 20 73  mes(pTable);.  s
3780: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
3790: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
37a0: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a  teFree(pTable->z
37b0: 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74  ColAff);.  sqlit
37c0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
37d0: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b  Table->pSelect);
37e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
37f0: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73 71 6c  OMIT_CHECK.  sql
3800: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
3810: 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a  Table->pCheck);.
3820: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 46  #endif.  sqliteF
3830: 72 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a  ree(pTable);.}..
3840: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  /*.** Unlink the
3850: 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f   given table fro
3860: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
3870: 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65  s and the delete
3880: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74   the.** table st
3890: 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c  ructure with all
38a0: 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64   its indices and
38b0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a   foreign keys..*
38c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
38d0: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62  linkAndDeleteTab
38e0: 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  le(sqlite3 *db, 
38f0: 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63  int iDb, const c
3900: 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a  har *zTabName){.
3910: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 46 4b    Table *p;.  FK
3920: 65 79 20 2a 70 46 31 2c 20 2a 70 46 32 3b 0a 20  ey *pF1, *pF2;. 
3930: 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73   Db *pDb;..  ass
3940: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
3950: 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
3960: 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
3970: 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 4e  .  assert( zTabN
3980: 61 6d 65 20 26 26 20 7a 54 61 62 4e 61 6d 65 5b  ame && zTabName[
3990: 30 5d 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64  0] );.  pDb = &d
39a0: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
39b0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
39c0: 73 65 72 74 28 26 70 44 62 2d 3e 74 62 6c 48 61  sert(&pDb->tblHa
39d0: 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 73 74  sh, zTabName, st
39e0: 72 6c 65 6e 28 7a 54 61 62 4e 61 6d 65 29 2b 31  rlen(zTabName)+1
39f0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  , 0);.  if( p ){
3a00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3a10: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
3a20: 0a 20 20 20 20 66 6f 72 28 70 46 31 3d 70 2d 3e  .    for(pF1=p->
3a30: 70 46 4b 65 79 3b 20 70 46 31 3b 20 70 46 31 3d  pFKey; pF1; pF1=
3a40: 70 46 31 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b  pF1->pNextFrom){
3a50: 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d  .      int nTo =
3a60: 20 73 74 72 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f   strlen(pF1->zTo
3a70: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 32  ) + 1;.      pF2
3a80: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
3a90: 6e 64 28 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20  nd(&pDb->aFKey, 
3aa0: 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a  pF1->zTo, nTo);.
3ab0: 20 20 20 20 20 20 69 66 28 20 70 46 32 3d 3d 70        if( pF2==p
3ac0: 46 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  F1 ){.        sq
3ad0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
3ae0: 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 31  &pDb->aFKey, pF1
3af0: 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d  ->zTo, nTo, pF1-
3b00: 3e 70 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 20  >pNextTo);.     
3b10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3b20: 77 68 69 6c 65 28 20 70 46 32 20 26 26 20 70 46  while( pF2 && pF
3b30: 32 2d 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31 20  2->pNextTo!=pF1 
3b40: 29 7b 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78  ){ pF2=pF2->pNex
3b50: 74 54 6f 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  tTo; }.        i
3b60: 66 28 20 70 46 32 20 29 7b 0a 20 20 20 20 20 20  f( pF2 ){.      
3b70: 20 20 20 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f      pF2->pNextTo
3b80: 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b   = pF1->pNextTo;
3b90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3ba0: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
3bb0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
3bc0: 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20  eTable(db, p);. 
3bd0: 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c   }.  db->flags |
3be0: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
3bf0: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
3c00: 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20   Given a token, 
3c10: 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  return a string 
3c20: 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
3c30: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 61   the text of tha
3c40: 74 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69 74 68 20  t.** token with 
3c50: 61 6e 79 20 71 75 6f 74 61 74 69 6f 6e 73 20 72  any quotations r
3c60: 65 6d 6f 76 65 64 2e 20 20 53 70 61 63 65 20 74  emoved.  Space t
3c70: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
3c80: 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ned string.** is
3c90: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
3ca0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
3cb0: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
3cc0: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  by the calling.*
3cd0: 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  * function..**.*
3ce0: 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74  * Tokens are oft
3cf0: 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73  en just pointers
3d00: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
3d10: 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20  al SQL text and 
3d20: 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30  so.** are not \0
3d30: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e  00 terminated an
3d40: 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73  d are not persis
3d50: 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72  tent.  The retur
3d60: 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ned string.** is
3d70: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
3d80: 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74 65   and is persiste
3d90: 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nt..*/.char *sql
3da0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
3db0: 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  n(Token *pName){
3dc0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
3dd0: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
3de0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
3df0: 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e  eStrNDup(pName->
3e00: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
3e10: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
3e20: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  (zName);.  }else
3e30: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
3e40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
3e50: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ame;.}../*.** Op
3e60: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  en the sqlite_ma
3e70: 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65  ster table store
3e80: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75  d in database nu
3e90: 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20  mber iDb for.** 
3ea0: 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62  writing. The tab
3eb0: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  le is opened usi
3ec0: 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  ng cursor 0..*/.
3ed0: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e  void sqlite3Open
3ee0: 4d 61 73 74 65 72 54 61 62 6c 65 28 56 64 62 65  MasterTable(Vdbe
3ef0: 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20   *v, int iDb){. 
3f00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3f10: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
3f20: 20 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69   iDb, 0);.  sqli
3f30: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3f40: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c  OP_OpenWrite, 0,
3f50: 20 4d 41 53 54 45 52 5f 52 4f 4f 54 29 3b 0a 20   MASTER_ROOT);. 
3f60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3f70: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
3f80: 6c 75 6d 6e 73 2c 20 30 2c 20 35 29 3b 20 2f 2a  lumns, 0, 5); /*
3f90: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 68   sqlite_master h
3fa0: 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  as 5 columns */.
3fb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
3fc0: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
3fd0: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
3fe0: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
3ff0: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
4000: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
4010: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
4020: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
4030: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
4040: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
4050: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
4060: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
4070: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
4080: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
4090: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  xist..*/.int sql
40a0: 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74  ite3FindDb(sqlit
40b0: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
40c0: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
40d0: 20 2d 31 3b 20 20 20 20 2f 2a 20 44 61 74 61 62   -1;    /* Datab
40e0: 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
40f0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f  int n;         /
4100: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
4110: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61  acters in the na
4120: 6d 65 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b  me */.  Db *pDb;
4130: 20 20 20 20 20 20 20 2f 2a 20 41 20 64 61 74 61         /* A data
4140: 62 61 73 65 20 77 68 6f 73 65 20 6e 61 6d 65 20  base whose name 
4150: 73 70 61 63 65 20 69 73 20 62 65 69 6e 67 20 73  space is being s
4160: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 68 61  earched */.  cha
4170: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e  r *zName;   /* N
4180: 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63  ame we are searc
4190: 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a  hing for */..  z
41a0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
41b0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
41c0: 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  e);.  if( zName 
41d0: 29 7b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65  ){.    n = strle
41e0: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f  n(zName);.    fo
41f0: 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c  r(i=(db->nDb-1),
4200: 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d   pDb=&db->aDb[i]
4210: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62  ; i>=0; i--, pDb
4220: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  --){.      if( (
4230: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20  !OMIT_TEMPDB || 
4240: 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73 74 72  i!=1 ) && n==str
4250: 6c 65 6e 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20  len(pDb->zName) 
4260: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d  && .          0=
4270: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
4280: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  pDb->zName, zNam
4290: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  e) ){.        br
42a0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
42b0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
42c0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  e(zName);.  }.  
42d0: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20  return i;.}../* 
42e0: 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  The table or vie
42f0: 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d  w or trigger nam
4300: 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  e is passed to t
4310: 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20  his routine via 
4320: 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31  tokens.** pName1
4330: 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20   and pName2. If 
4340: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
4350: 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  as fully qualifi
4360: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a  ed, for example:
4370: 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41  .**.** CREATE TA
4380: 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e  BLE xxx.yyy (...
4390: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70  );.** .** Then p
43a0: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
43b0: 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32  "xxx" and pName2
43c0: 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f   "yyy". On the o
43d0: 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20  ther hand if.** 
43e0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
43f0: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
4400: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a  ified, i.e.:.**.
4410: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
4420: 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20  yyy(...);.**.** 
4430: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
4440: 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20  et to "yyy" and 
4450: 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a  pName2 is ""..**
4460: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4470: 20 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71   sets the *ppUnq
4480: 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  ual pointer to p
4490: 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65  oint at the toke
44a0: 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20  n (pName1 or.** 
44b0: 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f  pName2) that sto
44c0: 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66  res the unqualif
44d0: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ied table name. 
44e0: 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   The index of th
44f0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78  e.** database "x
4500: 78 78 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e  xx" is returned.
4510: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
4520: 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61  woPartName(.  Pa
4530: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4540: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
4550: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
4560: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
4570: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
4580: 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69    /* The "xxx" i
4590: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
45a0: 79 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f  yyy" or "xxx" */
45b0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
45c0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79  ,      /* The "y
45d0: 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  yy" in the name 
45e0: 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54  "xxx.yyy" */.  T
45f0: 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20  oken **pUnqual  
4600: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
4610: 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65  unqualified obje
4620: 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a  ct name here */.
4630: 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  ){.  int iDb;   
4640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4650: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
4660: 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20  ding the object 
4670: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
4680: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
4690: 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20    if( pName2 && 
46a0: 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20  pName2->n>0 ){. 
46b0: 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
46c0: 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20  init.busy );.   
46d0: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
46e0: 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  e2;.    iDb = sq
46f0: 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20  lite3FindDb(db, 
4700: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28  pName1);.    if(
4710: 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20   iDb<0 ){.      
4720: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4730: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
4740: 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20 70   database %T", p
4750: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70 50  Name1);.      pP
4760: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
4770: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
4780: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
4790: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e    assert( db->in
47a0: 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d  it.iDb==0 || db-
47b0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
47c0: 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74    iDb = db->init
47d0: 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75  .iDb;.    *pUnqu
47e0: 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d  al = pName1;.  }
47f0: 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d  .  return iDb;.}
4800: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
4810: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
4820: 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54 46  check if the UTF
4830: 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20  -8 string zName 
4840: 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e  is a legal.** un
4850: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66  qualified name f
4860: 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20  or a new schema 
4870: 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69  object (table, i
4880: 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a  ndex, view or.**
4890: 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e   trigger). All n
48a0: 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65  ames are legal e
48b0: 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61 74  xcept those that
48c0: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
48d0: 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74  string.** "sqlit
48e0: 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c  e_" (in upper, l
48f0: 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61  ower or mixed ca
4900: 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f  se). This portio
4910: 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61  n of the namespa
4920: 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65  ce.** is reserve
4930: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
4940: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
4950: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
4960: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
4970: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
4980: 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72  me){.  if( !pPar
4990: 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73  se->db->init.bus
49a0: 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73  y && pParse->nes
49b0: 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  ted==0 .        
49c0: 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62    && (pParse->db
49d0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
49e0: 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30  _WriteSchema)==0
49f0: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d  .          && 0=
4a00: 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  =sqlite3StrNICmp
4a10: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
4a20: 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c  ", 7) ){.    sql
4a30: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4a40: 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d  rse, "object nam
4a50: 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  e reserved for i
4a60: 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22  nternal use: %s"
4a70: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  , zName);.    re
4a80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
4a90: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
4aa0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
4ab0: 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72  .** Begin constr
4ac0: 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  ucting a new tab
4ad0: 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
4ae0: 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  n in memory.  Th
4af0: 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  is is.** the fir
4b00: 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63  st of several ac
4b10: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68  tion routines th
4b20: 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e  at get called in
4b30: 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20   response.** to 
4b40: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
4b50: 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61  tatement.  In pa
4b60: 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72  rticular, this r
4b70: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
4b80: 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67  .** after seeing
4b90: 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22   tokens "CREATE"
4ba0: 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64   and "TABLE" and
4bb0: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
4bc0: 20 20 54 68 65 0a 2a 2a 20 70 53 74 61 72 74 20    The.** pStart 
4bd0: 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 43 52 45  token is the CRE
4be0: 41 54 45 20 61 6e 64 20 70 4e 61 6d 65 20 69 73  ATE and pName is
4bf0: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
4c00: 20 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20    The isTemp.** 
4c10: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
4c20: 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  the table should
4c30: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
4c40: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
4c50: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73  base.** file ins
4c60: 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d  tead of in the m
4c70: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
4c80: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
4c90: 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a  ally the case.**
4ca0: 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22   when the "TEMP"
4cb0: 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20   or "TEMPORARY" 
4cc0: 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69  keyword occurs i
4cd0: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45  n between.** CRE
4ce0: 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a  ATE and TABLE..*
4cf0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62  *.** The new tab
4d00: 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69  le record is ini
4d10: 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74  tialized and put
4d20: 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   in pParse->pNew
4d30: 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72  Table..** As mor
4d40: 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  e of the CREATE 
4d50: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
4d60: 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74  is parsed, addit
4d70: 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20  ional action.** 
4d80: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65  routines will be
4d90: 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d   called to add m
4da0: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
4db0: 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a  to this record..
4dc0: 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
4dd0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
4de0: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
4df0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
4e00: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
4e10: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
4e20: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
4e30: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
4e40: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
4e50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61  .void sqlite3Sta
4e60: 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  rtTable(.  Parse
4e70: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
4e80: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
4e90: 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
4ea0: 2c 20 20 20 2f 2a 20 54 68 65 20 22 43 52 45 41  ,   /* The "CREA
4eb0: 54 45 22 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54  TE" token */.  T
4ec0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
4ed0: 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
4ee0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
4ef0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
4f00: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
4f10: 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70  2,   /* Second p
4f20: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
4f30: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
4f40: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
4f50: 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72  Temp,      /* Tr
4f60: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
4f70: 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TEMP table */.  
4f80: 69 6e 74 20 69 73 56 69 65 77 20 20 20 20 20 20  int isView      
4f90: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
4fa0: 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 29 7b   is a VIEW */.){
4fb0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
4fc0: 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  ;.  char *zName 
4fd0: 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65  = 0; /* The name
4fe0: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
4ff0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
5000: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
5010: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
5020: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
5030: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
5040: 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  r to create the 
5050: 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f  table in */.  To
5060: 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f  ken *pName;    /
5070: 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * Unqualified na
5080: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
5090: 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20  to create */..  
50a0: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20  /* The table or 
50b0: 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65  view name to cre
50c0: 61 74 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  ate is passed to
50d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69   this routine vi
50e0: 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e  a tokens.  ** pN
50f0: 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e  ame1 and pName2.
5100: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61   If the table na
5110: 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61  me was fully qua
5120: 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d  lified, for exam
5130: 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  ple:.  **.  ** C
5140: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
5150: 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20  yyy (...);.  ** 
5160: 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  .  ** Then pName
5170: 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78  1 is set to "xxx
5180: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79  " and pName2 "yy
5190: 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  y". On the other
51a0: 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68   hand if.  ** th
51b0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20  e table name is 
51c0: 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  not fully qualif
51d0: 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a  ied, i.e.:.  **.
51e0: 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
51f0: 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a  E yyy(...);.  **
5200: 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  .  ** Then pName
5210: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
5220: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
5230: 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ""..  **.  ** Th
5240: 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74  e call below set
5250: 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e  s the pName poin
5260: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
5270: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
5280: 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32  1 or.  ** pName2
5290: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
52a0: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
52b0: 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61  ble name. The va
52c0: 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20  riable iDb is.  
52d0: 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  ** set to the in
52e0: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
52f0: 61 73 65 20 74 68 61 74 20 74 68 65 20 74 61 62  ase that the tab
5300: 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f  le or view is to
5310: 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64   be.  ** created
5320: 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20   in..  */.  iDb 
5330: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
5340: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
5350: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
5360: 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
5370: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
5380: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
5390: 26 20 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e  & isTemp && iDb>
53a0: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63  1 ){.    /* If c
53b0: 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74  reating a temp t
53c0: 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d  able, the name m
53d0: 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66  ay not be qualif
53e0: 69 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ied */.    sqlit
53f0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5400: 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61  e, "temporary ta
5410: 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  ble name must be
5420: 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a   unqualified");.
5430: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
5440: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
5450: 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 20 69  DB && isTemp ) i
5460: 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73  Db = 1;..  pPars
5470: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20  e->sNameToken = 
5480: 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20  *pName;.  zName 
5490: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
54a0: 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
54b0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
54c0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51  return;.  if( SQ
54d0: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
54e0: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
54f0: 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29  pParse, zName) )
5500: 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  {.    goto begin
5510: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
5520: 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  }.  if( db->init
5530: 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70  .iDb==1 ) isTemp
5540: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
5550: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
5560: 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74  IZATION.  assert
5570: 28 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d  ( (isTemp & 1)==
5580: 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20  isTemp );.  {.  
5590: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
55a0: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
55b0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
55c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
55d0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
55e0: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
55f0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54  SCHEMA_TABLE(isT
5600: 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  emp), 0, zDb) ){
5610: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
5620: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
5630: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56     }.    if( isV
5640: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  iew ){.      if(
5650: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
5660: 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20   isTemp ){.     
5670: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
5680: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
5690: 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
56a0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
56b0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45  QLITE_CREATE_VIE
56c0: 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  W;.      }.    }
56d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
56e0: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
56f0: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
5700: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
5710: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
5720: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
5730: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
5740: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
5750: 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LE;.      }.    
5760: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
5770: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
5780: 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20  e, code, zName, 
5790: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
57a0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
57b0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
57c0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
57d0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
57e0: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
57f0: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
5800: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
5810: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
5820: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
5830: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
5840: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
5850: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
5860: 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   does..  */.  if
5870: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
5880: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
5890: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f  Parse) ){.    go
58a0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
58b0: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
58c0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  le = sqlite3Find
58d0: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
58e0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
58f0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ame);.  if( pTab
5900: 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  le ){.    sqlite
5910: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5920: 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65  , "table %T alre
5930: 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61  ady exists", pNa
5940: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65  me);.    goto be
5950: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
5960: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
5970: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
5980: 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 26 26 20  zName, 0)!=0 && 
5990: 28 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e  (iDb==0 || !db->
59a0: 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20  init.busy) ){.  
59b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
59c0: 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
59d0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
59e0: 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20  ndex named %s", 
59f0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
5a00: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
5a10: 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  or;.  }.  pTable
5a20: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
5a30: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
5a40: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ;.  if( pTable==
5a50: 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  0 ){.    pParse-
5a60: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
5a70: 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  EM;.    pParse->
5a80: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
5a90: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
5aa0: 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  or;.  }.  pTable
5ab0: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
5ac0: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
5ad0: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61  = 0;.  pTable->a
5ae0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  Col = 0;.  pTabl
5af0: 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  e->iPKey = -1;. 
5b00: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20   pTable->pIndex 
5b10: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69  = 0;.  pTable->i
5b20: 44 62 20 3d 20 69 44 62 3b 0a 20 20 70 54 61 62  Db = iDb;.  pTab
5b30: 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  le->nRef = 1;.  
5b40: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  if( pParse->pNew
5b50: 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65 33 44  Table ) sqlite3D
5b60: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
5b70: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
5b80: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  );.  pParse->pNe
5b90: 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  wTable = pTable;
5ba0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
5bb0: 73 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69  s the magic sqli
5bc0: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
5bd0: 65 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e  e used by autoin
5be0: 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68  crement,.  ** th
5bf0: 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e  en record a poin
5c00: 74 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ter to this tabl
5c10: 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  e in the main da
5c20: 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
5c30: 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e  .  ** so that IN
5c40: 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68  SERT can find th
5c50: 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a  e table easily..
5c60: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
5c70: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
5c80: 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50  REMENT.  if( !pP
5c90: 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20  arse->nested && 
5ca0: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  strcmp(zName, "s
5cb0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29  qlite_sequence")
5cc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61  ==0 ){.    db->a
5cd0: 44 62 5b 69 44 62 5d 2e 70 53 65 71 54 61 62 20  Db[iDb].pSeqTab 
5ce0: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  = pTable;.  }.#e
5cf0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  ndif..  /* Begin
5d00: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
5d10: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
5d20: 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20  nsert the table 
5d30: 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a  record into.  **
5d40: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
5d50: 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20  ER table.  Note 
5d60: 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68  in particular th
5d70: 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68  at we must go ah
5d80: 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c  ead.  ** and all
5d90: 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64  ocate the record
5da0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
5db0: 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e  table entry now.
5dc0: 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a    Before any.  *
5dd0: 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  * PRIMARY KEY or
5de0: 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73   UNIQUE keywords
5df0: 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68   are parsed.  Th
5e00: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c  ose keywords wil
5e10: 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64  l cause.  ** ind
5e20: 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74  ices to be creat
5e30: 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  ed and the table
5e40: 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d   record must com
5e50: 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20  e before the .  
5e60: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e  ** indices.  Hen
5e70: 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ce, the record n
5e80: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
5e90: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ble must be allo
5ea0: 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a  cated.  ** now..
5eb0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
5ec0: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20  init.busy && (v 
5ed0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
5ee0: 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a  (pParse))!=0 ){.
5ef0: 20 20 20 20 69 6e 74 20 6c 62 6c 3b 0a 20 20 20      int lbl;.   
5f00: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
5f10: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
5f20: 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 20 20  se, 0, iDb);..  
5f30: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
5f40: 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f   format and enco
5f50: 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61  ding in the data
5f60: 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65  base have not be
5f70: 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20  en set, .    ** 
5f80: 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20  set them now..  
5f90: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
5fa0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5fb0: 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  ReadCookie, iDb,
5fc0: 20 31 29 3b 20 20 20 2f 2a 20 66 69 6c 65 5f 66   1);   /* file_f
5fd0: 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20 6c 62 6c  ormat */.    lbl
5fe0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
5ff0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
6000: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6010: 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 6c 62  (v, OP_If, 0, lb
6020: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
6030: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
6040: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 66 69 6c 65  nteger, db->file
6050: 5f 66 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20  _format, 0);.   
6060: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6070: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
6080: 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20  e, iDb, 1);.    
6090: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
60a0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
60b0: 64 62 2d 3e 65 6e 63 2c 20 30 29 3b 0a 20 20 20  db->enc, 0);.   
60c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
60d0: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
60e0: 65 2c 20 69 44 62 2c 20 34 29 3b 0a 20 20 20 20  e, iDb, 4);.    
60f0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
6100: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b  veLabel(v, lbl);
6110: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75  ..    /* This ju
6120: 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61  st creates a pla
6130: 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64  ce-holder record
6140: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
6150: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20  aster table..   
6160: 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63   ** The record c
6170: 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20  reated does not 
6180: 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67  contain anything
6190: 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62   yet.  It will b
61a0: 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a  e replaced.    *
61b0: 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e  * by the real en
61c0: 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65  try in code gene
61d0: 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33  rated at sqlite3
61e0: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20  EndTable()..    
61f0: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  **.    ** The ro
6200: 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  wid for the new 
6210: 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 6f 6e  entry is left on
6220: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
6230: 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 54 68  stack..    ** Th
6240: 65 20 72 6f 77 69 64 20 76 61 6c 75 65 20 69 73  e rowid value is
6250: 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 63   needed by the c
6260: 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ode that sqlite3
6270: 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 0a 20 20  EndTable will.  
6280: 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 2e 0a 20    ** generate.. 
6290: 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
62a0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
62b0: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
62c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
62d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
62e0: 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  teger, 0, 0);.  
62f0: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
6300: 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74     {.      sqlit
6310: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6320: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 69  P_CreateTable, i
6330: 44 62 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  Db, 0);.    }.  
6340: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73    sqlite3OpenMas
6350: 74 65 72 54 61 62 6c 65 28 76 2c 20 69 44 62 29  terTable(v, iDb)
6360: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6370: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
6380: 52 6f 77 69 64 2c 20 30 2c 20 30 29 3b 0a 20 20  Rowid, 0, 0);.  
6390: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
63a0: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
63b0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
63c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
63d0: 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Null, 0, 0);.   
63e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
63f0: 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  p(v, OP_Insert, 
6400: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
6410: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6420: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
6430: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6440: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  ddOp(v, OP_Pull,
6450: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f   1, 0);.  }..  /
6460: 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72  * Normal (non-er
6470: 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a  ror) return. */.
6480: 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20    return;..  /* 
6490: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
64a0: 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65  rs, we jump here
64b0: 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f   */.begin_table_
64c0: 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 46  error:.  sqliteF
64d0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  ree(zName);.  re
64e0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
64f0: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65  his macro is use
6500: 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f  d to compare two
6510: 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20 63 61   strings in a ca
6520: 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 6d  se-insensitive m
6530: 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20  anner..** It is 
6540: 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 20  slightly faster 
6550: 74 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c  than calling sql
6560: 69 74 65 33 53 74 72 49 43 6d 70 28 29 20 64 69  ite3StrICmp() di
6570: 72 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70  rectly, but.** p
6580: 72 6f 64 75 63 65 73 20 6c 61 72 67 65 72 20 63  roduces larger c
6590: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49  ode..**.** WARNI
65a0: 4e 47 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69  NG: This macro i
65b0: 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65  s not compatible
65c0: 20 77 69 74 68 20 74 68 65 20 73 74 72 63 6d 70   with the strcmp
65d0: 28 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a  () family. It.**
65e0: 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66   returns true if
65f0: 20 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67 73   the two strings
6600: 20 61 72 65 20 65 71 75 61 6c 2c 20 6f 74 68 65   are equal, othe
6610: 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a  rwise false..*/.
6620: 23 64 65 66 69 6e 65 20 53 54 52 49 43 4d 50 28  #define STRICMP(
6630: 78 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74 65 33  x, y) (\.sqlite3
6640: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75  UpperToLower[*(u
6650: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28  nsigned char *)(
6660: 78 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65  x)]==   \.sqlite
6670: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28  3UpperToLower[*(
6680: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
6690: 28 79 29 5d 20 20 20 20 20 5c 0a 26 26 20 73 71  (y)]     \.&& sq
66a0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 28 78 29  lite3StrICmp((x)
66b0: 2b 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a  +1,(y)+1)==0 )..
66c0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
66d0: 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61  column to the ta
66e0: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65  ble currently be
66f0: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  ing constructed.
6700: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  .**.** The parse
6710: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
6720: 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61  tine once for ea
6730: 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72  ch column declar
6740: 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52  ation.** in a CR
6750: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
6760: 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74  ment.  sqlite3St
6770: 61 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20  artTable() gets 
6780: 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20  called.** first 
6790: 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f  to get things go
67a0: 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20  ing.  Then this 
67b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
67c0: 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f  d for each.** co
67d0: 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lumn..*/.void sq
67e0: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50  lite3AddColumn(P
67f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
6800: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54  ken *pName){.  T
6810: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
6820: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43  ;.  char *z;.  C
6830: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69  olumn *pCol;.  i
6840: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
6850: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
6860: 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71  return;.  z = sq
6870: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
6880: 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  en(pName);.  if(
6890: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
68a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
68b0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
68c0: 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70  if( STRICMP(z, p
68d0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
68e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
68f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6900: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
6910: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
6920: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
6930: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65  ree(z);.      re
6940: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
6950: 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26    if( (p->nCol &
6960: 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   0x7)==0 ){.    
6970: 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20  Column *aNew;.  
6980: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    aNew = sqliteR
6990: 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c  ealloc( p->aCol,
69a0: 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a   (p->nCol+8)*siz
69b0: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
69c0: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
69d0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
69e0: 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20  eFree(z);.      
69f0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
6a00: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77    p->aCol = aNew
6a10: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26  ;.  }.  pCol = &
6a20: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d  p->aCol[p->nCol]
6a30: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c  ;.  memset(pCol,
6a40: 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43   0, sizeof(p->aC
6a50: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d  ol[0]));.  pCol-
6a60: 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20  >zName = z;. .  
6a70: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
6a80: 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  o type specified
6a90: 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74  , columns have t
6aa0: 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e  he default affin
6ab0: 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e  ity.  ** 'NONE'.
6ac0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
6ad0: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 74  ype specified, t
6ae0: 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f  hen sqlite3AddCo
6af0: 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a  lumnType() will.
6b00: 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e    ** be called n
6b10: 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d  ext to set pCol-
6b20: 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63  >affinity correc
6b30: 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  tly..  */.  pCol
6b40: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
6b50: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
6b60: 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50  pCol->pColl = pP
6b70: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
6b80: 6f 6c 6c 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b  oll;.  p->nCol++
6b90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6ba0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
6bb0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
6bc0: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
6bd0: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
6be0: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
6bf0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22   statement.  A "
6c00: 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  NOT NULL" constr
6c10: 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e  aint has.** been
6c20: 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d   seen on a colum
6c30: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
6c40: 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c   sets the notNul
6c50: 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65  l flag on.** the
6c60: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
6c70: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
6c80: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
6c90: 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28  lite3AddNotNull(
6ca0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
6cb0: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54  nt onError){.  T
6cc0: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
6cd0: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
6ce0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
6cf0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
6d00: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
6d10: 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43  if( i>=0 ) p->aC
6d20: 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20  ol[i].notNull = 
6d30: 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  onError;.}../*.*
6d40: 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d  * Scan the colum
6d50: 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70  n type name zTyp
6d60: 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29  e (length nType)
6d70: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a   and return the.
6d80: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66  ** associated af
6d90: 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a  finity type..**.
6da0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6db0: 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65  does a case-inde
6dc0: 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f  pendent search o
6dd0: 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20  f zType for the 
6de0: 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69  .** substrings i
6df0: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
6e00: 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66  table. If one of
6e10: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
6e20: 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65  is.** found, the
6e30: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61   corresponding a
6e40: 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72  ffinity is retur
6e50: 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f  ned. If zType co
6e60: 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74  ntains.** more t
6e70: 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  han one of the s
6e80: 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69  ubstrings, entri
6e90: 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f  es toward the to
6ea0: 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62  p of .** the tab
6eb0: 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79  le take priority
6ec0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
6ed0: 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42  f zType is 'BLOB
6ee0: 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45  INT', .** SQLITE
6ef0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20  _AFF_INTEGER is 
6f00: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
6f10: 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20  Substring     | 
6f20: 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d  Affinity.** ----
6f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
6f50: 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20  'INT'         | 
6f60: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
6f70: 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20  ER.** 'CHAR'    
6f80: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
6f90: 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20  _TEXT.** 'CLOB' 
6fa0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
6fb0: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58  AFF_TEXT.** 'TEX
6fc0: 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  T'        | SQLI
6fd0: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
6fe0: 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53  BLOB'        | S
6ff0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a  QLITE_AFF_NONE.*
7000: 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20  * 'REAL'        
7010: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
7020: 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20  L.** 'FLOA'     
7030: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7040: 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20  REAL.** 'DOUB'  
7050: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7060: 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66  FF_REAL.**.** If
7070: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62   none of the sub
7080: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61  strings in the a
7090: 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66  bove table are f
70a0: 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ound,.** SQLITE_
70b0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72  AFF_NUMERIC is r
70c0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72  eturned..*/.char
70d0: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
70e0: 54 79 70 65 28 63 6f 6e 73 74 20 54 6f 6b 65 6e  Type(const Token
70f0: 20 2a 70 54 79 70 65 29 7b 0a 20 20 75 33 32 20   *pType){.  u32 
7100: 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66  h = 0;.  char af
7110: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f = SQLITE_AFF_N
7120: 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20  UMERIC;.  const 
7130: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
7140: 49 6e 20 3d 20 70 54 79 70 65 2d 3e 7a 3b 0a 20  In = pType->z;. 
7150: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
7160: 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20 26 70 54  char *zEnd = &pT
7170: 79 70 65 2d 3e 7a 5b 70 54 79 70 65 2d 3e 6e 5d  ype->z[pType->n]
7180: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 21  ;..  while( zIn!
7190: 3d 7a 45 6e 64 20 29 7b 0a 20 20 20 20 68 20 3d  =zEnd ){.    h =
71a0: 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65   (h<<8) + sqlite
71b0: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a  3UpperToLower[*z
71c0: 49 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a  In];.    zIn++;.
71d0: 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27      if( h==(('c'
71e0: 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b  <<24)+('h'<<16)+
71f0: 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b  ('a'<<8)+'r') ){
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7210: 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66  CHAR */.      af
7220: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
7230: 45 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65 20  EXT; .    }else 
7240: 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34  if( h==(('c'<<24
7250: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
7260: 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20  <<8)+'b') ){    
7270: 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20     /* CLOB */.  
7280: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
7290: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
72a0: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74  else if( h==(('t
72b0: 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29  '<<24)+('e'<<16)
72c0: 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29  +('x'<<8)+'t') )
72d0: 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20  {       /* TEXT 
72e0: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
72f0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
7300: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
7310: 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('b'<<24)+('l'
7320: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
7330: 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b')          /* 
7340: 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20  BLOB */.        
7350: 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f  && (aff==SQLITE_
7360: 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61  AFF_NUMERIC || a
7370: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff==SQLITE_AFF_R
7380: 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66  EAL) ){.      af
7390: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f = SQLITE_AFF_N
73a0: 4f 4e 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ONE;.#ifndef SQL
73b0: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
73c0: 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73  G_POINT.    }els
73d0: 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c  e if( h==(('r'<<
73e0: 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27  24)+('e'<<16)+('
73f0: 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20  a'<<8)+'l')     
7400: 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a       /* REAL */.
7410: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
7420: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
7430: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
7440: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
7450: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
7460: 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28   h==(('f'<<24)+(
7470: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
7480: 29 2b 27 61 27 29 20 20 20 20 20 20 20 20 20 20  )+'a')          
7490: 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20  /* FLOA */.     
74a0: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
74b0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
74c0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
74d0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20  ITE_AFF_REAL;.  
74e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
74f0: 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c  ('d'<<24)+('o'<<
7500: 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27  16)+('u'<<8)+'b'
7510: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f  )          /* DO
7520: 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  UB */.        &&
7530: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
7540: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
7550: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
7560: 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a  FF_REAL;.#endif.
7570: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68      }else if( (h
7580: 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28  &0x00FFFFFF)==((
7590: 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38  'i'<<16)+('n'<<8
75a0: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20  )+'t') ){    /* 
75b0: 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  INT */.      aff
75c0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   = SQLITE_AFF_IN
75d0: 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65  TEGER;.      bre
75e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
75f0: 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a   return aff;.}..
7600: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
7610: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
7620: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
7630: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
7640: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
7650: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
7660: 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72  ement.  The pFir
7670: 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20  st token is the 
7680: 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69  first.** token i
7690: 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f  n the sequence o
76a0: 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65  f tokens that de
76b0: 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20  scribe the type 
76c0: 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  of the.** column
76d0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
76e0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
76f0: 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61   pLast is the la
7700: 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74  st token.** in t
7710: 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73  he sequence.  Us
7720: 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  e this informati
7730: 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  on to construct 
7740: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74  a string.** that
7750: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79   contains the ty
7760: 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  pename of the co
7770: 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74  lumn and store t
7780: 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e  hat string.** in
7790: 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64   zType..*/ .void
77a0: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
77b0: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
77c0: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70  rse, Token *pTyp
77d0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
77e0: 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d    int i;.  Colum
77f0: 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 69 66 28 20  n *pCol;..  if( 
7800: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
7810: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
7820: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
7830: 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20  ol-1;.  if( i<0 
7840: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
7850: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a   = &p->aCol[i];.
7860: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f    sqliteFree(pCo
7870: 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 70 43 6f  l->zType);.  pCo
7880: 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74  l->zType = sqlit
7890: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
78a0: 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e  pType);.  pCol->
78b0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
78c0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70  e3AffinityType(p
78d0: 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Type);.}../*.** 
78e0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
78f0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  s the default va
7900: 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  lue for the most
7910: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
7920: 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65  column.** of the
7930: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
7940: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
7950: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75  ion..**.** Defau
7960: 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73 73  lt value express
7970: 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e  ions must be con
7980: 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e  stant.  Raise an
7990: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68   exception if th
79a0: 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65  is.** is not the
79b0: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   case..**.** Thi
79c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
79d0: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
79e0: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
79f0: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
7a00: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
7a10: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  LE statement..*/
7a20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
7a30: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72  DefaultValue(Par
7a40: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
7a50: 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 61 62 6c   *pExpr){.  Tabl
7a60: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
7a70: 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d  pCol;.  if( (p =
7a80: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
7a90: 6c 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43  le)!=0 ){.    pC
7aa0: 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70  ol = &(p->aCol[p
7ab0: 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20  ->nCol-1]);.    
7ac0: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
7ad0: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
7ae0: 74 69 6f 6e 28 70 45 78 70 72 29 20 29 7b 0a 20  tion(pExpr) ){. 
7af0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7b00: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 65  rMsg(pParse, "de
7b10: 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63  fault value of c
7b20: 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f  olumn [%s] is no
7b30: 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20  t constant",.   
7b40: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61         pCol->zNa
7b50: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
7b60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
7b70: 72 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44  rDelete(pCol->pD
7b80: 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  flt);.      pCol
7b90: 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65  ->pDflt = sqlite
7ba0: 33 45 78 70 72 44 75 70 28 70 45 78 70 72 29 3b  3ExprDup(pExpr);
7bb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
7bc0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
7bd0: 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
7be0: 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52  Designate the PR
7bf0: 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68  IMARY KEY for th
7c00: 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20  e table.  pList 
7c10: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d  is a list of nam
7c20: 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e  es .** of column
7c30: 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  s that form the 
7c40: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
7c50: 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20   pList is NULL, 
7c60: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74  then the.** most
7c70: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
7c80: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
7c90: 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61  ble is the prima
7ca0: 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20  ry key..**.** A 
7cb0: 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61  table can have a
7cc0: 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61  t most one prima
7cd0: 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20  ry key.  If the 
7ce0: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
7cf0: 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b  s.** a primary k
7d00: 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20  ey (and this is 
7d10: 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61  the second prima
7d20: 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65  ry key) then cre
7d30: 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e  ate an.** error.
7d40: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52  .**.** If the PR
7d50: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20  IMARY KEY is on 
7d60: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
7d70: 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69  whose datatype i
7d80: 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68  s INTEGER,.** th
7d90: 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74  en we will try t
7da0: 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d  o use that colum
7db0: 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20  n as the rowid. 
7dc0: 20 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69   Set the Table.i
7dd0: 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66  PKey.** field of
7de0: 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72   the table under
7df0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f   construction to
7e00: 20 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66   be the index of
7e10: 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20   the.** INTEGER 
7e20: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
7e30: 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79  mn.  Table.iPKey
7e40: 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66   is set to -1 if
7e50: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
7e60: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
7e70: 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  KEY..**.** If th
7e80: 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20  e key is not an 
7e90: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
7ea0: 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65  KEY, then create
7eb0: 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64   a unique.** ind
7ec0: 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20  ex for the key. 
7ed0: 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65   No index is cre
7ee0: 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52  ated for INTEGER
7ef0: 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a   PRIMARY KEYs..*
7f00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
7f10: 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50  dPrimaryKey(.  P
7f20: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7f30: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
7f40: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
7f50: 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  t *pList,  /* Li
7f60: 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65  st of field name
7f70: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
7f80: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
7f90: 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  ,      /* What t
7fa0: 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71  o do with a uniq
7fb0: 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20  ueness conflict 
7fc0: 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63  */.  int autoInc
7fd0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
7fe0: 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d  f the AUTOINCREM
7ff0: 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  ENT keyword is p
8000: 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54  resent */.){.  T
8010: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
8020: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
8030: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
8040: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
8050: 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61  -1, i;.  if( pTa
8060: 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 69 6d  b==0 ) goto prim
8070: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20  ary_key_exit;.  
8080: 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69  if( pTab->hasPri
8090: 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  mKey ){.    sqli
80a0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
80b0: 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c  se, .      "tabl
80c0: 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72  e \"%s\" has mor
80d0: 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61  e than one prima
80e0: 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a  ry key", pTab->z
80f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
8100: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
8110: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61  ;.  }.  pTab->ha
8120: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
8130: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
8140: 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
8150: 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70  >nCol - 1;.    p
8160: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
8170: 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  isPrimKey = 1;. 
8180: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
8190: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
81a0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
81b0: 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
81c0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
81d0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ol++){.        i
81e0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
81f0: 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
8200: 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
8210: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  iCol].zName)==0 
8220: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
8230: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
8240: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8250: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iCol<pTab->nCol 
8260: 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ){.        pTab-
8270: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72  >aCol[iCol].isPr
8280: 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20  imKey = 1;.     
8290: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
82a0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20   pList->nExpr>1 
82b0: 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d  ) iCol = -1;.  }
82c0: 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26  .  if( iCol>=0 &
82d0: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
82e0: 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  l ){.    zType =
82f0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
8300: 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69  ].zType;.  }.  i
8310: 66 28 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69  f( zType && sqli
8320: 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65  te3StrICmp(zType
8330: 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 20  , "INTEGER")==0 
8340: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  ){.    pTab->iPK
8350: 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70  ey = iCol;.    p
8360: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f  Tab->keyConf = o
8370: 6e 45 72 72 6f 72 3b 0a 20 20 20 20 70 54 61 62  nError;.    pTab
8380: 2d 3e 61 75 74 6f 49 6e 63 20 3d 20 61 75 74 6f  ->autoInc = auto
8390: 49 6e 63 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Inc;.  }else if(
83a0: 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e   autoInc ){.#ifn
83b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
83c0: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
83d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
83e0: 67 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49  g(pParse, "AUTOI
83f0: 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79  NCREMENT is only
8400: 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22   allowed on an "
8410: 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52  .       "INTEGER
8420: 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a   PRIMARY KEY");.
8430: 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
8440: 20 20 20 20 73 71 6c 69 74 65 33 43 72 65 61 74      sqlite3Creat
8450: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30  eIndex(pParse, 0
8460: 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f  , 0, 0, pList, o
8470: 6e 45 72 72 6f 72 2c 20 30 2c 20 30 29 3b 0a 20  nError, 0, 0);. 
8480: 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20     pList = 0;.  
8490: 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  }..primary_key_e
84a0: 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  xit:.  sqlite3Ex
84b0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  prListDelete(pLi
84c0: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  st);.  return;.}
84d0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
84e0: 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  w CHECK constrai
84f0: 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  nt to the table 
8500: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
8510: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
8520: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
8530: 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28  CheckConstraint(
8540: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8550: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
8560: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
8570: 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f  r *pCheckExpr  /
8580: 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70 72  * The check expr
8590: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66  ession */.){.#if
85a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
85b0: 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a  _CHECK.  Table *
85c0: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
85d0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
85e0: 70 54 61 62 20 29 7b 0a 20 20 20 20 2f 2a 20 54  pTab ){.    /* T
85f0: 68 65 20 43 48 45 43 4b 20 65 78 70 72 65 73 73  he CHECK express
8600: 69 6f 6e 20 6d 75 73 74 20 62 65 20 64 75 70 6c  ion must be dupl
8610: 69 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 74  icated so that t
8620: 6f 6b 65 6e 73 20 72 65 66 65 72 0a 20 20 20 20  okens refer.    
8630: 2a 2a 20 74 6f 20 6d 61 6c 6c 6f 63 65 64 20 73  ** to malloced s
8640: 70 61 63 65 20 61 6e 64 20 6e 6f 74 20 74 68 65  pace and not the
8650: 20 28 65 70 68 65 6d 65 72 61 6c 29 20 74 65 78   (ephemeral) tex
8660: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
8670: 54 41 42 4c 45 0a 20 20 20 20 2a 2a 20 73 74 61  TABLE.    ** sta
8680: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 70 54  tement */.    pT
8690: 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c  ab->pCheck = sql
86a0: 69 74 65 33 45 78 70 72 41 6e 64 28 70 54 61 62  ite3ExprAnd(pTab
86b0: 2d 3e 70 43 68 65 63 6b 2c 20 73 71 6c 69 74 65  ->pCheck, sqlite
86c0: 33 45 78 70 72 44 75 70 28 70 43 68 65 63 6b 45  3ExprDup(pCheckE
86d0: 78 70 72 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  xpr));.  }.#endi
86e0: 66 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  f.  sqlite3ExprD
86f0: 65 6c 65 74 65 28 70 43 68 65 63 6b 45 78 70 72  elete(pCheckExpr
8700: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
8710: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  the collation fu
8720: 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nction of the mo
8730: 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73  st recently pars
8740: 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a  ed table column.
8750: 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65  ** to the CollSe
8760: 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64  q given..*/.void
8770: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61   sqlite3AddColla
8780: 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  teType(Parse *pP
8790: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
87a0: 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79   *zType, int nTy
87b0: 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  pe){.  Table *p;
87c0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
87d0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
87e0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66  ;.  int i;..  if
87f0: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
8800: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
8810: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
8820: 6e 43 6f 6c 2d 31 3b 0a 0a 20 20 70 43 6f 6c 6c  nCol-1;..  pColl
8830: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
8840: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
8850: 7a 54 79 70 65 2c 20 6e 54 79 70 65 29 3b 0a 20  zType, nType);. 
8860: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 43 6f 6c   p->aCol[i].pCol
8870: 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 0a 20 20 2f 2a  l = pColl;..  /*
8880: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   If the column i
8890: 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c  s declared as "<
88a0: 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45  name> PRIMARY KE
88b0: 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e  Y COLLATE <type>
88c0: 22 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20  ",.  ** then an 
88d0: 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20 62  index may have b
88e0: 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74  een created on t
88f0: 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72  his column befor
8900: 65 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 6c 61  e the.  ** colla
8910: 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64  tion type was ad
8920: 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69  ded. Correct thi
8930: 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63  s if it is the c
8940: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ase..  */.  for(
8950: 70 49 64 78 20 3d 20 70 2d 3e 70 49 6e 64 65 78  pIdx = p->pIndex
8960: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
8970: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 61  x->pNext){.    a
8980: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
8990: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 69  lumn==1 );.    i
89a0: 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
89b0: 6e 5b 30 5d 3d 3d 69 20 29 20 70 49 64 78 2d 3e  n[0]==i ) pIdx->
89c0: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
89d0: 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 7d 0a   = pColl;.  }.}.
89e0: 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69  ./*.** Call sqli
89f0: 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28  te3CheckCollSeq(
8a00: 29 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 6c 61 74  ) for all collat
8a10: 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 69 6e  ing sequences in
8a20: 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 69 6e   an index,.** in
8a30: 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66 79   order to verify
8a40: 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6e 65   that all the ne
8a50: 63 65 73 73 61 72 79 20 63 6f 6c 6c 61 74 69 6e  cessary collatin
8a60: 67 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 0a  g sequences are.
8a70: 2a 2a 20 6c 6f 61 64 65 64 2e 0a 2a 2f 0a 69 6e  ** loaded..*/.in
8a80: 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 49 6e  t sqlite3CheckIn
8a90: 64 65 78 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  dexCollSeq(Parse
8aa0: 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
8ab0: 2a 70 49 64 78 29 7b 0a 20 20 69 66 28 20 70 49  *pIdx){.  if( pI
8ac0: 64 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  dx ){.    int i;
8ad0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
8ae0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
8af0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
8b00: 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53  qlite3CheckCollS
8b10: 65 71 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d  eq(pParse, pIdx-
8b20: 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69  >keyInfo.aColl[i
8b30: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ]) ){.        re
8b40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
8b50: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  R;.      }.    }
8b60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
8b70: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
8b80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
8b90: 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c  returns the coll
8ba0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
8bb0: 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69  or database nati
8bc0: 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64  ve text.** encod
8bd0: 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62  ing identified b
8be0: 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61  y the string zNa
8bf0: 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65  me, length nName
8c00: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
8c10: 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
8c20: 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e  on sequence is n
8c30: 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  ot available, or
8c40: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a   not available.*
8c50: 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
8c60: 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e  e native encodin
8c70: 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  g, the collation
8c80: 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f   factory is invo
8c90: 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73  ked to.** reques
8ca0: 74 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c  t it. If the col
8cb0: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64  lation factory d
8cc0: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73  oes not supply s
8cd0: 75 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a  uch a sequence,.
8ce0: 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65  ** and the seque
8cf0: 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  nce is available
8d00: 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74   in another text
8d10: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20   encoding, then 
8d20: 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72  that is.** retur
8d30: 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  ned instead..**.
8d40: 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e  ** If no version
8d50: 73 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74  s of the request
8d60: 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65  ed collations se
8d70: 71 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c  quence are avail
8d80: 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74  able, or.** anot
8d90: 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73  her error occurs
8da0: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
8db0: 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ed and an error 
8dc0: 6d 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20  message written 
8dd0: 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  into.** pParse..
8de0: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
8df0: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
8e00: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8e10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
8e20: 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20  e, int nName){. 
8e30: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8e40: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20  Parse->db;.  u8 
8e50: 65 6e 63 20 3d 20 64 62 2d 3e 65 6e 63 3b 0a 20  enc = db->enc;. 
8e60: 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64   u8 initbusy = d
8e70: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 0a 20  b->init.busy;.. 
8e80: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
8e90: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
8ea0: 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e  lSeq(db, enc, zN
8eb0: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 69 6e 69 74  ame, nName, init
8ec0: 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e  busy);.  if( !in
8ed0: 69 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c  itbusy && (!pCol
8ee0: 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d  l || !pColl->xCm
8ef0: 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  p) ){.    pColl 
8f00: 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  = sqlite3GetColl
8f10: 53 65 71 28 64 62 2c 20 70 43 6f 6c 6c 2c 20 7a  Seq(db, pColl, z
8f20: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
8f30: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
8f40: 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3c        if( nName<
8f50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4e 61  0 ){.        nNa
8f60: 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  me = strlen(zNam
8f70: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
8f80: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8f90: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
8fa0: 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ch collation seq
8fb0: 75 65 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e  uence: %.*s", nN
8fc0: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ame, zName);.   
8fd0: 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20     pColl = 0;.  
8fe0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
8ff0: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a  n pColl;.}.../*.
9000: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
9010: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65   that will incre
9020: 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20  ment the schema 
9030: 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cookie..**.** Th
9040: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
9050: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
9060: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
9070: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
9080: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
9090: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
90a0: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
90b0: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
90c0: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
90d0: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
90e0: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
90f0: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
9100: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
9110: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
9120: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
9130: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
9140: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
9150: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
9160: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
9170: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
9180: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
9190: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
91a0: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
91b0: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
91c0: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
91d0: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
91e0: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
91f0: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
9200: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
9210: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
9220: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
9230: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
9240: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
9250: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
9260: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
9270: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
9280: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
9290: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
92a0: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
92b0: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
92c0: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f  fe enough..*/.vo
92d0: 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  id sqlite3Change
92e0: 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 33 20 2a  Cookie(sqlite3 *
92f0: 64 62 2c 20 56 64 62 65 20 2a 76 2c 20 69 6e 74  db, Vdbe *v, int
9300: 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33   iDb){.  sqlite3
9310: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9320: 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62  Integer, db->aDb
9330: 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f  [iDb].schema_coo
9340: 6b 69 65 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c  kie+1, 0);.  sql
9350: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9360: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
9370: 44 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Db, 0);.}../*.**
9380: 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d   Measure the num
9390: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
93a0: 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70  s needed to outp
93b0: 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  ut the given.** 
93c0: 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65  identifier.  The
93d0: 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
93e0: 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75   includes any qu
93f0: 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74  otes used.** but
9400: 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64   does not includ
9410: 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69  e the null termi
9420: 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nator..**.** The
9430: 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e   estimate is con
9440: 73 65 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d  servative.  It m
9450: 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
9460: 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72  hat what is.** r
9470: 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f  eally needed..*/
9480: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e  .static int iden
9490: 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68  tLength(const ch
94a0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b  ar *z){.  int n;
94b0: 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20  .  for(n=0; *z; 
94c0: 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69  n++, z++){.    i
94d0: 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b  f( *z=='"' ){ n+
94e0: 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72  +; }.  }.  retur
94f0: 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  n n + 2;.}../*.*
9500: 2a 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74  * Write an ident
9510: 69 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65  ifier onto the e
9520: 6e 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  nd of the given 
9530: 73 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20  string.  Add.** 
9540: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73  quote characters
9550: 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73   as needed..*/.s
9560: 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74  tatic void ident
9570: 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  Put(char *z, int
9580: 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53   *pIdx, char *zS
9590: 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75  ignedIdent){.  u
95a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
95b0: 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  dent = (unsigned
95c0: 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64   char*)zSignedId
95d0: 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ent;.  int i, j,
95e0: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
95f0: 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a  = *pIdx;.  for(j
9600: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
9610: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73  ++){.    if( !is
9620: 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29  alnum(zIdent[j])
9630: 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27   && zIdent[j]!='
9640: 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  _' ) break;.  }.
9650: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a    needQuote =  z
9660: 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69  Ident[j]!=0 || i
9670: 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d  sdigit(zIdent[0]
9680: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
9690: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65      || sqlite3Ke
96a0: 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74  ywordCode(zIdent
96b0: 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69  , j)!=TK_ID;.  i
96c0: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
96d0: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66  [i++] = '"';.  f
96e0: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
96f0: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69  ]; j++){.    z[i
9700: 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b  ++] = zIdent[j];
9710: 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b  .    if( zIdent[
9720: 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d  j]=='"' ) z[i++]
9730: 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66   = '"';.  }.  if
9740: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
9750: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b  i++] = '"';.  z[
9760: 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20  i] = 0;.  *pIdx 
9770: 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = i;.}../*.** Ge
9780: 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20  nerate a CREATE 
9790: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
97a0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
97b0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62  the given.** tab
97c0: 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68  le.  Memory to h
97d0: 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20  old the text of 
97e0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
97f0: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
9800: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
9810: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
9820: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
9830: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
9840: 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61  tatic char *crea
9850: 74 65 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c  teTableStmt(Tabl
9860: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  e *p){.  int i, 
9870: 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53  k, n;.  char *zS
9880: 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65  tmt;.  char *zSe
9890: 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64  p, *zSep2, *zEnd
98a0: 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  , *z;.  Column *
98b0: 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  pCol;.  n = 0;. 
98c0: 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61   for(pCol = p->a
98d0: 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e  Col, i=0; i<p->n
98e0: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
98f0: 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e  ){.    n += iden
9900: 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e  tLength(pCol->zN
9910: 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 70 43  ame);.    z = pC
9920: 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 69  ol->zType;.    i
9930: 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 6e 20  f( z ){.      n 
9940: 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 29 20 2b 20  += (strlen(z) + 
9950: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
9960: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
9970: 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  (p->zName);.  if
9980: 28 20 6e 3c 35 30 20 29 7b 0a 20 20 20 20 7a 53  ( n<50 ){.    zS
9990: 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65  ep = "";.    zSe
99a0: 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45  p2 = ",";.    zE
99b0: 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73  nd = ")";.  }els
99c0: 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c  e{.    zSep = "\
99d0: 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  n  ";.    zSep2 
99e0: 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a  = ",\n  ";.    z
99f0: 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d  End = "\n)";.  }
9a00: 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70  .  n += 35 + 6*p
9a10: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20  ->nCol;.  zStmt 
9a20: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
9a30: 77 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53  w( n );.  if( zS
9a40: 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tmt==0 ) return 
9a50: 30 3b 0a 20 20 73 74 72 63 70 79 28 7a 53 74 6d  0;.  strcpy(zStm
9a60: 74 2c 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 26  t, !OMIT_TEMPDB&
9a70: 26 70 2d 3e 69 44 62 3d 3d 31 20 3f 20 22 43 52  &p->iDb==1 ? "CR
9a80: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20  EATE TEMP TABLE 
9a90: 22 3a 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  ":"CREATE TABLE 
9aa0: 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e  ");.  k = strlen
9ab0: 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74  (zStmt);.  ident
9ac0: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
9ad0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d  ->zName);.  zStm
9ae0: 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20  t[k++] = '(';.  
9af0: 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c  for(pCol=p->aCol
9b00: 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  , i=0; i<p->nCol
9b10: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
9b20: 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d      strcpy(&zStm
9b30: 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20  t[k], zSep);.   
9b40: 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53   k += strlen(&zS
9b50: 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65  tmt[k]);.    zSe
9b60: 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69  p = zSep2;.    i
9b70: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
9b80: 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  k, pCol->zName);
9b90: 0a 20 20 20 20 69 66 28 20 28 7a 20 3d 20 70 43  .    if( (z = pC
9ba0: 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29 7b  ol->zType)!=0 ){
9bb0: 0a 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b  .      zStmt[k++
9bc0: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 73  ] = ' ';.      s
9bd0: 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c  trcpy(&zStmt[k],
9be0: 20 7a 29 3b 0a 20 20 20 20 20 20 6b 20 2b 3d 20   z);.      k += 
9bf0: 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 7d  strlen(z);.    }
9c00: 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 26 7a  .  }.  strcpy(&z
9c10: 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a  Stmt[k], zEnd);.
9c20: 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a    return zStmt;.
9c30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
9c40: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
9c50: 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69  to report the fi
9c60: 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72  nal ")" that ter
9c70: 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45  minates.** a CRE
9c80: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
9c90: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ent..**.** The t
9ca0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
9cb0: 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e  hat other action
9cc0: 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62   routines have b
9cd0: 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20  een building.** 
9ce0: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
9cf0: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
9d00: 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e  bles, assuming n
9d10: 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a  o errors have.**
9d20: 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a   occurred..**.**
9d30: 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   An entry for th
9d40: 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20  e table is made 
9d50: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  in the master ta
9d60: 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c  ble on disk, unl
9d70: 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61  ess.** this is a
9d80: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
9d90: 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   or db->init.bus
9da0: 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e  y==1.  When db->
9db0: 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20  init.busy==1.** 
9dc0: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
9dd0: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
9de0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
9df0: 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a  because we just.
9e00: 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  ** connected to 
9e10: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
9e20: 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c 69  because the sqli
9e30: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
9e40: 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20  has.** recently 
9e50: 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20  changed, so the 
9e60: 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74  entry for this t
9e70: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
9e80: 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71  sts in.** the sq
9e90: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
9ea0: 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61  e.  We do not wa
9eb0: 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74 20  nt to create it 
9ec0: 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  again..**.** If 
9ed0: 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67 75  the pSelect argu
9ee0: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
9ef0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
9f00: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
9f10: 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  was called to cr
9f20: 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e  eate a table gen
9f30: 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a  erated from a .*
9f40: 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  * "CREATE TABLE 
9f50: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e  ... AS SELECT ..
9f60: 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ." statement.  T
9f70: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
9f80: 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61  of.** the new ta
9f90: 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74  ble will match t
9fa0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
9fb0: 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
9fc0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54  void sqlite3EndT
9fd0: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
9fe0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
9ff0: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
a000: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f   */.  Token *pCo
a010: 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ns,           /*
a020: 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61   The ',' token a
a030: 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f  fter the last co
a040: 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20  lumn defn. */.  
a050: 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20  Token *pEnd,    
a060: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
a070: 69 6e 61 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69  inal ')' token i
a080: 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
a090: 4c 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  LE */.  Select *
a0a0: 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20  pSelect         
a0b0: 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61  /* Select from a
a0c0: 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20   "CREATE ... AS 
a0d0: 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20  SELECT" */.){.  
a0e0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69  Table *p;.  sqli
a0f0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
a100: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45  ->db;..  if( (pE
a110: 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74  nd==0 && pSelect
a120: 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ==0) || pParse->
a130: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  nErr || sqlite3_
a140: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
a150: 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50  return;.  p = pP
a160: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
a170: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
a180: 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
a190: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
a1a0: 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a  || !pSelect );..
a1b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a1c0: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52  MIT_CHECK.  /* R
a1d0: 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
a1e0: 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  all CHECK constr
a1f0: 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73  aint expressions
a200: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
a210: 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 53 72  pCheck ){.    Sr
a220: 63 4c 69 73 74 20 73 53 72 63 3b 20 20 20 20 20  cList sSrc;     
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a240: 20 46 61 6b 65 20 53 72 63 4c 69 73 74 20 66 6f   Fake SrcList fo
a250: 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  r pParse->pNewTa
a260: 62 6c 65 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43  ble */.    NameC
a270: 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20  ontext sNC;     
a280: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
a290: 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
a2a0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
a2b0: 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28   */..    memset(
a2c0: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
a2d0: 73 4e 43 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  sNC));.    memse
a2e0: 74 28 26 73 53 72 63 2c 20 30 2c 20 73 69 7a 65  t(&sSrc, 0, size
a2f0: 6f 66 28 73 53 72 63 29 29 3b 0a 20 20 20 20 73  of(sSrc));.    s
a300: 53 72 63 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20  Src.nSrc = 1;.  
a310: 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d    sSrc.a[0].zNam
a320: 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  e = p->zName;.  
a330: 20 20 73 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62    sSrc.a[0].pTab
a340: 20 3d 20 70 3b 0a 20 20 20 20 73 53 72 63 2e 61   = p;.    sSrc.a
a350: 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [0].iCursor = -1
a360: 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65  ;.    sNC.pParse
a370: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73   = pParse;.    s
a380: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 26 73  NC.pSrcList = &s
a390: 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e 69 73 43  Src;.    sNC.isC
a3a0: 68 65 63 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66  heck = 1;.    if
a3b0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
a3c0: 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20  olveNames(&sNC, 
a3d0: 70 2d 3e 70 43 68 65 63 6b 29 20 29 7b 0a 20 20  p->pCheck) ){.  
a3e0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
a3f0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
a400: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a410: 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a  OMIT_CHECK) */..
a420: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
a430: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
a440: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
a450: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
a460: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
a470: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
a480: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
a490: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
a4a0: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
a4b0: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
a4c0: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
a4d0: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
a4e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
a4f0: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
a500: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
a510: 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
a520: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
a530: 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  er.  ** should h
a540: 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65  ave been put the
a550: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
a560: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
a570: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
a580: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
a590: 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69   p->tnum = db->i
a5a0: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d  nit.newTnum;.  }
a5b0: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
a5c0: 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e  itializing, then
a5d0: 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   create a record
a5e0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
a5f0: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53  le.  ** in the S
a600: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
a610: 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
a620: 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20  se.  The record 
a630: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
a640: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e  the new table en
a650: 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  try should alrea
a660: 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61  dy be on the sta
a670: 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ck..  **.  ** If
a680: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f   this is a TEMPO
a690: 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74  RARY table, writ
a6a0: 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f  e the entry into
a6b0: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20   the auxiliary. 
a6c0: 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64   ** file instead
a6d0: 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   of into the mai
a6e0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
a6f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
a700: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
a710: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62    int n;.    Vdb
a720: 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
a730: 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69  zType;    /* "vi
a740: 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a  ew" or "table" *
a750: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  /.    char *zTyp
a760: 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20  e2;   /* "VIEW" 
a770: 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20  or "TABLE" */.  
a780: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20    char *zStmt;  
a790: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
a7a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72   CREATE TABLE or
a7b0: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
a7c0: 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76  tement */..    v
a7d0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
a7e0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
a7f0: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
a800: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ;..    sqlite3Vd
a810: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
a820: 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  ose, 0, 0);..   
a830: 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72   /* Create the r
a840: 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20  ootpage for the 
a850: 6e 65 77 20 74 61 62 6c 65 20 61 6e 64 20 70 75  new table and pu
a860: 73 68 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 73  sh it onto the s
a870: 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 41 20 76  tack..    ** A v
a880: 69 65 77 20 68 61 73 20 6e 6f 20 72 6f 6f 74 70  iew has no rootp
a890: 61 67 65 2c 20 73 6f 20 6a 75 73 74 20 70 75 73  age, so just pus
a8a0: 68 20 61 20 7a 65 72 6f 20 6f 6e 74 6f 20 74 68  h a zero onto th
a8b0: 65 20 73 74 61 63 6b 20 66 6f 72 0a 20 20 20 20  e stack for.    
a8c0: 2a 2a 20 76 69 65 77 73 2e 20 20 49 6e 69 74 69  ** views.  Initi
a8d0: 61 6c 69 7a 65 20 7a 54 79 70 65 20 61 74 20 74  alize zType at t
a8e0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20  he same time..  
a8f0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
a900: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
a910: 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72      /* A regular
a920: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
a930: 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b  zType = "table";
a940: 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20  .      zType2 = 
a950: 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66  "TABLE";.#ifndef
a960: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
a970: 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  W.    }else{.   
a980: 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a     /* A view */.
a990: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76        zType = "v
a9a0: 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70  iew";.      zTyp
a9b0: 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e  e2 = "VIEW";.#en
a9c0: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
a9d0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43  * If this is a C
a9e0: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41  REATE TABLE xx A
a9f0: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78  S SELECT ..., ex
aa00: 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54  ecute the SELECT
aa10: 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
aa20: 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  t to populate th
aa30: 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65  e new table. The
aa40: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
aa50: 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  r for the.    **
aa60: 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6f 6e   new table is on
aa70: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
aa80: 76 64 62 65 20 73 74 61 63 6b 2e 0a 20 20 20 20  vdbe stack..    
aa90: 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74  **.    ** Once t
aaa0: 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65  he SELECT has be
aab0: 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69  en coded by sqli
aac0: 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20  te3Select(), it 
aad0: 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73  is in a.    ** s
aae0: 75 69 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f  uitable state to
aaf0: 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63   query for the c
ab00: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20  olumn names and 
ab10: 74 79 70 65 73 20 74 6f 20 62 65 20 75 73 65 64  types to be used
ab20: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e  .    ** by the n
ab30: 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  ew table..    */
ab40: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
ab50: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
ab60: 2a 70 53 65 6c 54 61 62 3b 0a 20 20 20 20 20 20  *pSelTab;.      
ab70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ab80: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
ab90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
aba0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
abb0: 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69 44 62 2c  Integer, p->iDb,
abc0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
abd0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
abe0: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20  P_OpenWrite, 1, 
abf0: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
ac00: 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20  ->nTab = 2;.    
ac10: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
ac20: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
ac30: 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30   SRT_Table, 1, 0
ac40: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
ac50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ac60: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
ac70: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  1, 0);.      if(
ac80: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
ac90: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   ){.        pSel
aca0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
acb0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
acc0: 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 65 63  Parse, 0, pSelec
acd0: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
ace0: 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74  pSelTab==0 ) ret
acf0: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73  urn;.        ass
ad00: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20  ert( p->aCol==0 
ad10: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  );.        p->nC
ad20: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
ad30: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  ol;.        p->a
ad40: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
ad50: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65  Col;.        pSe
ad60: 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
ad70: 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d          pSelTab-
ad80: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >aCol = 0;.     
ad90: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
ada0: 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62  Table(0, pSelTab
adb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
adc0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
add0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
ade0: 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
adf0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
ae00: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
ae10: 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63  .      zStmt = c
ae20: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 70  reateTableStmt(p
ae30: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
ae40: 20 20 20 20 6e 20 3d 20 70 45 6e 64 2d 3e 7a 20      n = pEnd->z 
ae50: 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  - pParse->sNameT
ae60: 6f 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20 20 20 20  oken.z + 1;.    
ae70: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
ae80: 33 4d 50 72 69 6e 74 66 28 22 43 52 45 41 54 45  3MPrintf("CREATE
ae90: 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65   %s %.*s", zType
aea0: 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e  2, n, pParse->sN
aeb0: 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20  ameToken.z);.   
aec0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f   }..    /* A slo
aed0: 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64  t for the record
aee0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
aef0: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74  n allocated in t
af00: 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  he .    ** SQLIT
af10: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20  E_MASTER table. 
af20: 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f   We just need to
af30: 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f   update that slo
af40: 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a  t with all.    *
af50: 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  * the informatio
af60: 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65  n we've collecte
af70: 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 66 6f  d.  The rowid fo
af80: 72 20 74 68 65 20 70 72 65 61 6c 6c 6f 63 61 74  r the preallocat
af90: 65 64 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69  ed.    ** slot i
afa0: 73 20 74 68 65 20 32 6e 64 20 69 74 65 6d 20 6f  s the 2nd item o
afb0: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54 68  n the stack.  Th
afc0: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
afd0: 63 6b 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  ck is the.    **
afe0: 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20 74   root page for t
aff0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28 6f 72  he new table (or
b000: 20 61 20 30 20 69 66 20 74 68 69 73 20 69 73 20   a 0 if this is 
b010: 61 20 76 69 65 77 29 2e 0a 20 20 20 20 2a 2f 0a  a view)..    */.
b020: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
b030: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
b040: 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e       "UPDATE %Q.
b050: 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53  %s ".         "S
b060: 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61  ET type='%s', na
b070: 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d  me=%Q, tbl_name=
b080: 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 30 2c  %Q, rootpage=#0,
b090: 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20   sql=%Q ".      
b0a0: 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 31   "WHERE rowid=#1
b0b0: 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ",.      db->aDb
b0c0: 5b 70 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  [p->iDb].zName, 
b0d0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 2d 3e  SCHEMA_TABLE(p->
b0e0: 69 44 62 29 2c 0a 20 20 20 20 20 20 7a 54 79 70  iDb),.      zTyp
b0f0: 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
b100: 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
b110: 65 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 0a 20  e,.      zStmt. 
b120: 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
b130: 46 72 65 65 28 7a 53 74 6d 74 29 3b 0a 20 20 20  Free(zStmt);.   
b140: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
b150: 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70 2d 3e 69  okie(db, v, p->i
b160: 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
b170: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
b180: 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43  CREMENT.    /* C
b190: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
b1a0: 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  e need to create
b1b0: 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65   an sqlite_seque
b1c0: 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20  nce table for.  
b1d0: 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61    ** keeping tra
b1e0: 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d  ck of autoincrem
b1f0: 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f  ent keys..    */
b200: 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 75 74 6f  .    if( p->auto
b210: 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 44 62 20  Inc ){.      Db 
b220: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
b230: 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 20 20 69  p->iDb];.      i
b240: 66 28 20 70 44 62 2d 3e 70 53 65 71 54 61 62 3d  f( pDb->pSeqTab=
b250: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
b260: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
b270: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
b280: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
b290: 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
b2a0: 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a  nce(name,seq)",.
b2b0: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a            pDb->z
b2c0: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  Name.        );.
b2d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
b2e0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70  ndif..    /* Rep
b2f0: 61 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20  arse everything 
b300: 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e  to update our in
b310: 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75  ternal data stru
b320: 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71  ctures */.    sq
b330: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
b340: 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20  OP_ParseSchema, 
b350: 70 2d 3e 69 44 62 2c 20 30 2c 0a 20 20 20 20 20  p->iDb, 0,.     
b360: 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
b370: 66 28 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27  f("tbl_name='%q'
b380: 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f  ",p->zName), P3_
b390: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a  DYNAMIC);.  }...
b3a0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62    /* Add the tab
b3b0: 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d  le to the in-mem
b3c0: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
b3d0: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
b3e0: 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  se..  */.  if( d
b3f0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
b400: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
b410: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f  ){.    Table *pO
b420: 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46  ld;.    FKey *pF
b430: 4b 65 79 3b 20 0a 20 20 20 20 44 62 20 2a 70 44  Key; .    Db *pD
b440: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70 2d 3e  b = &db->aDb[p->
b450: 69 44 62 5d 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  iDb];.    pOld =
b460: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
b470: 72 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68  rt(&pDb->tblHash
b480: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  , p->zName, strl
b490: 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20  en(p->zName)+1, 
b4a0: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  p);.    if( pOld
b4b0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
b4c0: 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a  ( p==pOld );  /*
b4d0: 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
b4e0: 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20  e failed inside 
b4f0: 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a  HashInsert() */.
b500: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
b510: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
b520: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
b530: 4b 45 59 0a 20 20 20 20 66 6f 72 28 70 46 4b 65  KEY.    for(pFKe
b540: 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65  y=p->pFKey; pFKe
b550: 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e  y; pFKey=pFKey->
b560: 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20  pNextFrom){.    
b570: 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c    int nTo = strl
b580: 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b  en(pFKey->zTo) +
b590: 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d   1;.      pFKey-
b5a0: 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74  >pNextTo = sqlit
b5b0: 65 33 48 61 73 68 46 69 6e 64 28 26 70 44 62 2d  e3HashFind(&pDb-
b5c0: 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a  >aFKey, pFKey->z
b5d0: 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20  To, nTo);.      
b5e0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
b5f0: 74 28 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70  t(&pDb->aFKey, p
b600: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20  FKey->zTo, nTo, 
b610: 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 23 65  pFKey);.    }.#e
b620: 6e 64 69 66 0a 20 20 20 20 70 50 61 72 73 65 2d  ndif.    pParse-
b630: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a  >pNewTable = 0;.
b640: 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b      db->nTable++
b650: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
b660: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
b670: 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65  Changes;..#ifnde
b680: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
b690: 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28  TERTABLE.    if(
b6a0: 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a   !p->pSelect ){.
b6b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
b6c0: 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20  Select && pCons 
b6d0: 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20  && pEnd );.     
b6e0: 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30   if( pCons->z==0
b6f0: 20 29 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b   ) pCons = pEnd;
b700: 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c  .      p->addCol
b710: 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 28 70  Offset = 13 + (p
b720: 43 6f 6e 73 2d 3e 7a 20 2d 20 70 50 61 72 73 65  Cons->z - pParse
b730: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b  ->sNameToken.z);
b740: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
b750: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
b760: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
b770: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
b780: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
b790: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  e in order to cr
b7a0: 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a  eate a new VIEW.
b7b0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
b7c0: 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72  reateView(.  Par
b7d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
b7e0: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
b7f0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
b800: 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f  n *pBegin,     /
b810: 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
b820: 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
b830: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
b840: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
b850: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
b860: 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
b870: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
b880: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
b890: 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame2,     /* The
b8a0: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
b8b0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
b8c0: 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65  e view */.  Sele
b8d0: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f  ct *pSelect,   /
b8e0: 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65  * A SELECT state
b8f0: 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62  ment that will b
b900: 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69  ecome the new vi
b910: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
b920: 6d 70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52  mp         /* TR
b930: 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41  UE for a TEMPORA
b940: 52 59 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20  RY view */.){.  
b950: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
b960: 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  n;.  const unsig
b970: 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54  ned char *z;.  T
b980: 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46  oken sEnd;.  DbF
b990: 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b  ixer sFix;.  Tok
b9a0: 65 6e 20 2a 70 4e 61 6d 65 3b 0a 0a 20 20 69 66  en *pName;..  if
b9b0: 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30  ( pParse->nVar>0
b9c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
b9d0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
b9e0: 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20  "parameters are 
b9f0: 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76  not allowed in v
ba00: 69 65 77 73 22 29 3b 0a 20 20 20 20 73 71 6c 69  iews");.    sqli
ba10: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
ba20: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
ba30: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
ba40: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
ba50: 61 72 73 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e  arse, pBegin, pN
ba60: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73  ame1, pName2, is
ba70: 54 65 6d 70 2c 20 31 29 3b 0a 20 20 70 20 3d 20  Temp, 1);.  p = 
ba80: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
ba90: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  e;.  if( p==0 ||
baa0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
bab0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
bac0: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
bad0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
bae0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50   }.  sqlite3TwoP
baf0: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
bb00: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
bb10: 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73  &pName);.  if( s
bb20: 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
bb30: 46 69 78 2c 20 70 50 61 72 73 65 2c 20 70 2d 3e  Fix, pParse, p->
bb40: 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61  iDb, "view", pNa
bb50: 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74  me).    && sqlit
bb60: 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69  e3FixSelect(&sFi
bb70: 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b  x, pSelect).  ){
bb80: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
bb90: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
bba0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
bbb0: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20   }..  /* Make a 
bbc0: 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69  copy of the enti
bbd0: 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  re SELECT statem
bbe0: 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
bbf0: 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20   the view..  ** 
bc00: 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20  This will force 
bc10: 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b  all the Expr.tok
bc20: 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62  en.z values to b
bc30: 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20  e dynamically.  
bc40: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74  ** allocated rat
bc50: 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74  her than point t
bc60: 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  o the input stri
bc70: 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73  ng - which means
bc80: 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20   that.  ** they 
bc90: 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74  will persist aft
bca0: 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  er the current s
bcb0: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61  qlite3_exec() ca
bcc0: 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f  ll returns..  */
bcd0: 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20  .  p->pSelect = 
bce0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
bcf0: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  (pSelect);.  sql
bd00: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
bd10: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28  (pSelect);.  if(
bd20: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
bd30: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73  it.busy ){.    s
bd40: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
bd50: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
bd60: 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c   p);.  }..  /* L
bd70: 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  ocate the end of
bd80: 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57   the CREATE VIEW
bd90: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b   statement.  Mak
bda0: 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a  e sEnd point to.
bdb0: 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20    ** the end..  
bdc0: 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72  */.  sEnd = pPar
bdd0: 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a  se->sLastToken;.
bde0: 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21    if( sEnd.z[0]!
bdf0: 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21  =0 && sEnd.z[0]!
be00: 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64  =';' ){.    sEnd
be10: 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20  .z += sEnd.n;.  
be20: 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a  }.  sEnd.n = 0;.
be30: 20 20 6e 20 3d 20 73 45 6e 64 2e 7a 20 2d 20 70    n = sEnd.z - p
be40: 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20  Begin->z;.  z = 
be50: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
be60: 63 68 61 72 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b  char*)pBegin->z;
be70: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
be80: 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c   (z[n-1]==';' ||
be90: 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29   isspace(z[n-1])
bea0: 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45  ) ){ n--; }.  sE
beb0: 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a  nd.z = &z[n-1];.
bec0: 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20    sEnd.n = 1;.. 
bed0: 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45   /* Use sqlite3E
bee0: 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
bef0: 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
bf00: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
bf10: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
bf20: 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  3EndTable(pParse
bf30: 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a  , 0, &sEnd, 0);.
bf40: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
bf50: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
bf60: 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64  T_VIEW */..#ifnd
bf70: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
bf80: 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61  IEW./*.** The Ta
bf90: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54  ble structure pT
bfa0: 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  able is really a
bfb0: 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20   VIEW.  Fill in 
bfc0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  the names of.** 
bfd0: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
bfe0: 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70  he view in the p
bff0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e  Table structure.
c000: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
c010: 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
c020: 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  .  If an error i
c030: 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20  s seen leave an 
c040: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
c050: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
c060: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c070: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
c080: 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
c090: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
c0a0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54  {.  Table *pSelT
c0b0: 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20  ab;   /* A fake 
c0c0: 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68  table from which
c0d0: 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75   we get the resu
c0e0: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65  lt set */.  Sele
c0f0: 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a  ct *pSel;     /*
c100: 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   Copy of the SEL
c110: 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ECT that impleme
c120: 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a  nts the view */.
c130: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20    int nErr = 0; 
c140: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c150: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
c160: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  red */.  int n; 
c170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
c180: 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20  mporarily holds 
c190: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75  the number of cu
c1a0: 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a  rsors assigned *
c1b0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  /..  assert( pTa
c1c0: 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70  ble );..  /* A p
c1d0: 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61  ositive nCol mea
c1e0: 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e  ns the columns n
c1f0: 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69  ames for this vi
c200: 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65  ew are.  ** alre
c210: 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a  ady known..  */.
c220: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
c230: 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ol>0 ) return 0;
c240: 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76  ..  /* A negativ
c250: 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63  e nCol is a spec
c260: 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69  ial marker meani
c270: 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63  ng that we are c
c280: 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72  urrently.  ** tr
c290: 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20  ying to compute 
c2a0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
c2b0: 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74  .  If we enter t
c2c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
c2d0: 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65  .  ** a negative
c2e0: 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20   nCol, it means 
c2f0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77  two or more view
c300: 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c  s form a loop, l
c310: 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ike this:.  **. 
c320: 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
c330: 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43  IEW one AS SELEC
c340: 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20  T * FROM two;.  
c350: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
c360: 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54  EW two AS SELECT
c370: 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a   * FROM one;.  *
c380: 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
c390: 20 74 68 69 73 20 65 72 72 6f 72 20 69 73 20 63   this error is c
c3a0: 61 75 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79  aught previously
c3b0: 20 61 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c   and so the foll
c3c0: 6f 77 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20  owing test.  ** 
c3d0: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61  should always fa
c3e0: 69 6c 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c  il.  But we will
c3f0: 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61   leave it in pla
c400: 63 65 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61  ce just to be sa
c410: 66 65 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20  fe..  */.#if 0. 
c420: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
c430: 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  l<0 ){.    sqlit
c440: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
c450: 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63  e, "view %s is c
c460: 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65  ircularly define
c470: 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  d", pTable->zNam
c480: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
c490: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61  ;.  }.#endif.  a
c4a0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e  ssert( pTable->n
c4b0: 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Col>=0 );..  /* 
c4c0: 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
c4d0: 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20  ar, it means we 
c4e0: 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
c4f0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e  the table names.
c500: 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
c510: 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
c520: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
c530: 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61  lect() will expa
c540: 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20  nd any.  ** "*" 
c550: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
c560: 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74  results set of t
c570: 68 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c  he view and will
c580: 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a   assign cursors.
c590: 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d    ** to the elem
c5a0: 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d  ents of the FROM
c5b0: 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65   clause.  But we
c5c0: 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65   do not want the
c5d0: 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20  se changes.  ** 
c5e0: 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e  to be permanent.
c5f0: 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61    So the computa
c600: 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20  tion is done on 
c610: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
c620: 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d  LECT.  ** statem
c630: 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
c640: 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a   the view..  */.
c650: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
c660: 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70  ->pSelect );.  p
c670: 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  Sel = sqlite3Sel
c680: 65 63 74 44 75 70 28 70 54 61 62 6c 65 2d 3e 70  ectDup(pTable->p
c690: 53 65 6c 65 63 74 29 3b 0a 20 20 6e 20 3d 20 70  Select);.  n = p
c6a0: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 73  Parse->nTab;.  s
c6b0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
c6c0: 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
c6d0: 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a  e, pSel->pSrc);.
c6e0: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
c6f0: 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d   -1;.  pSelTab =
c700: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
c710: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
c720: 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 70 50  , 0, pSel);.  pP
c730: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a  arse->nTab = n;.
c740: 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b    if( pSelTab ){
c750: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
c760: 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ble->aCol==0 );.
c770: 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
c780: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c   = pSelTab->nCol
c790: 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43  ;.    pTable->aC
c7a0: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
c7b0: 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d  ol;.    pSelTab-
c7c0: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70  >nCol = 0;.    p
c7d0: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30  SelTab->aCol = 0
c7e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
c7f0: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c  eteTable(0, pSel
c800: 54 61 62 29 3b 0a 20 20 20 20 44 62 53 65 74 50  Tab);.    DbSetP
c810: 72 6f 70 65 72 74 79 28 70 50 61 72 73 65 2d 3e  roperty(pParse->
c820: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 2c  db, pTable->iDb,
c830: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
c840: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
c850: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
c860: 3b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20  ;.    nErr++;.  
c870: 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  }.  sqlite3Selec
c880: 74 44 65 6c 65 74 65 28 70 53 65 6c 29 3b 0a 20  tDelete(pSel);. 
c890: 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a   return nErr;  .
c8a0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
c8b0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
c8c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c8d0: 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
c8e0: 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
c8f0: 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72   names from ever
c900: 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61  y VIEW in databa
c910: 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69  se idx..*/.stati
c920: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65  c void sqliteVie
c930: 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65  wResetAll(sqlite
c940: 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b  3 *db, int idx){
c950: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a  .  HashElem *i;.
c960: 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70    if( !DbHasProp
c970: 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
c980: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29  _UnresetViews) )
c990: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
c9a0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
c9b0: 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 74  (&db->aDb[idx].t
c9c0: 62 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71  blHash); i; i=sq
c9d0: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
c9e0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
c9f0: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
ca00: 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(i);.    if( p
ca10: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
ca20: 20 20 20 20 20 20 73 71 6c 69 74 65 52 65 73 65        sqliteRese
ca30: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61  tColumnNames(pTa
ca40: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
ca50: 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
ca60: 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
ca70: 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c  setViews);.}.#el
ca80: 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69  se.# define sqli
ca90: 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41  teViewResetAll(A
caa0: 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ,B).#endif /* SQ
cab0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
cac0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
cad0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
cae0: 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20   by the VDBE to 
caf0: 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72  adjust the inter
cb00: 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73  nal schema.** us
cb10: 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65  ed by SQLite whe
cb20: 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  n the btree laye
cb30: 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20  r moves a table 
cb40: 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a  root page. The.*
cb50: 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  * root-page of a
cb60: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
cb70: 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20  in database iDb 
cb80: 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d  has changed from
cb90: 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f   iFrom.** to iTo
cba0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
cbb0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
cbc0: 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  UUM.void sqlite3
cbd0: 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 44 62  RootPageMoved(Db
cbe0: 20 2a 70 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d   *pDb, int iFrom
cbf0: 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61  , int iTo){.  Ha
cc00: 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20  shElem *pElem;. 
cc10: 20 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71   .  for(pElem=sq
cc20: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
cc30: 44 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70 45  Db->tblHash); pE
cc40: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
cc50: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
cc60: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
cc70: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
cc80: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
cc90: 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d  if( pTab->tnum==
cca0: 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
ccb0: 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Tab->tnum = iTo;
ccc0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
ccd0: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70     }.  }.  for(p
cce0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
ccf0: 69 72 73 74 28 26 70 44 62 2d 3e 69 64 78 48 61  irst(&pDb->idxHa
cd00: 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
cd10: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
cd20: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e  (pElem)){.    In
cd30: 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69  dex *pIdx = sqli
cd40: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
cd50: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  );.    if( pIdx-
cd60: 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a  >tnum==iFrom ){.
cd70: 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d        pIdx->tnum
cd80: 20 3d 20 69 54 6f 3b 0a 20 20 20 20 20 20 72 65   = iTo;.      re
cd90: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
cda0: 20 20 61 73 73 65 72 74 28 30 29 3b 0a 7d 0a 23    assert(0);.}.#
cdb0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
cdc0: 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  te code to erase
cdd0: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
cde0: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65  root-page iTable
cdf0: 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69   from database i
ce00: 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74  Db..** Also writ
ce10: 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79  e code to modify
ce20: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
ce30: 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74  er table and int
ce40: 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
ce50: 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f  if a root-page o
ce60: 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  f another table 
ce70: 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20  is moved by the 
ce80: 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c  btree-layer whil
ce90: 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54  st.** erasing iT
cea0: 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68  able (this can h
ceb0: 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75  appen with an au
cec0: 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
ced0: 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  se)..*/ .static 
cee0: 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74  void destroyRoot
cef0: 50 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  Page(Parse *pPar
cf00: 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  se, int iTable, 
cf10: 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
cf20: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
cf30: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
cf40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cf50: 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20  (v, OP_Destroy, 
cf60: 69 54 61 62 6c 65 2c 20 69 44 62 29 3b 0a 23 69  iTable, iDb);.#i
cf70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cf80: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
cf90: 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 70 75 73  * OP_Destroy pus
cfa0: 68 65 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  hes an integer o
cfb0: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 49  nto the stack. I
cfc0: 66 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20  f this integer. 
cfd0: 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   ** is non-zero,
cfe0: 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
cff0: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
d000: 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65   of a table move
d010: 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69  d to.  ** locati
d020: 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66  on iTable. The f
d030: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f  ollowing code mo
d040: 64 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74  difies the sqlit
d050: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74  e_master table t
d060: 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74  o.  ** reflect t
d070: 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  his..  **.  ** T
d080: 68 65 20 22 23 30 22 20 69 6e 20 74 68 65 20 53  he "#0" in the S
d090: 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  QL is a special 
d0a0: 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65  constant that me
d0b0: 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61 6c  ans whatever val
d0c0: 75 65 0a 20 20 2a 2a 20 69 73 20 6f 6e 20 74 68  ue.  ** is on th
d0d0: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
d0e0: 63 6b 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ck.  See sqlite3
d0f0: 52 65 67 69 73 74 65 72 45 78 70 72 28 29 2e 0a  RegisterExpr()..
d100: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65    */.  sqlite3Ne
d110: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
d120: 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54 45 20  , .     "UPDATE 
d130: 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61  %Q.%s SET rootpa
d140: 67 65 3d 25 64 20 57 48 45 52 45 20 23 30 20 41  ge=%d WHERE #0 A
d150: 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 30 22 2c  ND rootpage=#0",
d160: 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62  .     pParse->db
d170: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
d180: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
d190: 44 62 29 2c 20 69 54 61 62 6c 65 29 3b 0a 23 65  Db), iTable);.#e
d1a0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ndif.}../*.** Wr
d1b0: 69 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f  ite VDBE code to
d1c0: 20 65 72 61 73 65 20 74 61 62 6c 65 20 70 54 61   erase table pTa
d1d0: 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69  b and all associ
d1e0: 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20  ated indices on 
d1f0: 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f  disk..** Code to
d200: 20 75 70 64 61 74 65 20 74 68 65 20 73 71 6c 69   update the sqli
d210: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73  te_master tables
d220: 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63   and internal sc
d230: 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73  hema definitions
d240: 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f  .** in case a ro
d250: 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e  ot-page belongin
d260: 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62  g to another tab
d270: 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74  le is moved by t
d280: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a  he btree layer.*
d290: 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20  * is also added 
d2a0: 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e  (this can happen
d2b0: 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61   with an auto-va
d2c0: 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a  cuum database)..
d2d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
d2e0: 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73  estroyTable(Pars
d2f0: 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
d300: 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20   *pTab){.#ifdef 
d310: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
d320: 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a  VACUUM.  Index *
d330: 70 49 64 78 3b 0a 20 20 64 65 73 74 72 6f 79 52  pIdx;.  destroyR
d340: 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
d350: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70 54 61 62  pTab->tnum, pTab
d360: 2d 3e 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49  ->iDb);.  for(pI
d370: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
d380: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
d390: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65  ->pNext){.    de
d3a0: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
d3b0: 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  arse, pIdx->tnum
d3c0: 2c 20 70 49 64 78 2d 3e 69 44 62 29 3b 0a 20 20  , pIdx->iDb);.  
d3d0: 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20  }.#else.  /* If 
d3e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
d3f0: 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   be auto-vacuum 
d400: 63 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49  capable (if SQLI
d410: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
d420: 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64  UM.  ** is not d
d430: 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74  efined), then it
d440: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
d450: 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79   call OP_Destroy
d460: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62   on the.  ** tab
d470: 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f  le and index roo
d480: 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72  t-pages in order
d490: 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
d4a0: 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20  the numerically 
d4b0: 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f  .  ** largest ro
d4c0: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ot-page number. 
d4d0: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20  This guarantees 
d4e0: 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65  that none of the
d4f0: 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a   root-pages.  **
d500: 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64   to be destroyed
d510: 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79   is relocated by
d520: 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44   an earlier OP_D
d530: 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20  estroy. i.e. if 
d540: 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  the.  ** followi
d550: 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20  ng were coded:. 
d560: 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74   **.  ** OP_Dest
d570: 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e  roy 4 0.  ** ...
d580: 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
d590: 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61   5 0.  **.  ** a
d5a0: 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68  nd root page 5 h
d5b0: 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68  appened to be th
d5c0: 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
d5d0: 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68  age number in th
d5e0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c  e.  ** database,
d5f0: 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20   then root page 
d600: 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64  5 would be moved
d610: 20 74 6f 20 70 61 67 65 20 34 20 62 79 20 74 68   to page 4 by th
d620: 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74  e .  ** "OP_Dest
d630: 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e  roy 4 0" opcode.
d640: 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   The subsequent 
d650: 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22  "OP_Destroy 5 0"
d660: 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20   would hit.  ** 
d670: 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65  a free-list page
d680: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ..  */.  int iTa
d690: 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a  b = pTab->tnum;.
d6a0: 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64    int iDestroyed
d6b0: 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
d6c0: 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  1 ){.    Index *
d6d0: 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c  pIdx;.    int iL
d6e0: 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20  argest = 0;..   
d6f0: 20 69 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d   if( iDestroyed=
d700: 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74  =0 || iTab<iDest
d710: 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69  royed ){.      i
d720: 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a  Largest = iTab;.
d730: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49      }.    for(pI
d740: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
d750: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
d760: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
d770: 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d  int iIdx = pIdx-
d780: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73  >tnum;.      ass
d790: 65 72 74 28 20 70 49 64 78 2d 3e 69 44 62 3d 3d  ert( pIdx->iDb==
d7a0: 70 54 61 62 2d 3e 69 44 62 20 29 3b 0a 20 20 20  pTab->iDb );.   
d7b0: 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79     if( (iDestroy
d7c0: 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69  ed==0 || (iIdx<i
d7d0: 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69  Destroyed)) && i
d7e0: 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a  Idx>iLargest ){.
d7f0: 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74          iLargest
d800: 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d   = iIdx;.      }
d810: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
d820: 4c 61 72 67 65 73 74 3d 3d 30 20 29 20 72 65 74  Largest==0 ) ret
d830: 75 72 6e 3b 0a 20 20 20 20 64 65 73 74 72 6f 79  urn;.    destroy
d840: 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
d850: 20 69 4c 61 72 67 65 73 74 2c 20 70 54 61 62 2d   iLargest, pTab-
d860: 3e 69 44 62 29 3b 0a 20 20 20 20 69 44 65 73 74  >iDb);.    iDest
d870: 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74  royed = iLargest
d880: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
d890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
d8a0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
d8b0: 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61  do the work of a
d8c0: 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74   DROP TABLE stat
d8d0: 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20  ement..** pName 
d8e0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
d8f0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64  he table to be d
d900: 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ropped..*/.void 
d910: 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65  sqlite3DropTable
d920: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
d930: 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
d940: 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 54  int isView){.  T
d950: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64  able *pTab;.  Vd
d960: 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
d970: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d980: 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
d990: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
d9a0: 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
d9b0: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74  loc_failed ) got
d9c0: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
d9d0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61  e;.  assert( pNa
d9e0: 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
d9f0: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
da00: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
da10: 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
da20: 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
da30: 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a 20  ].zDatabase);.. 
da40: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67   if( pTab==0 ) g
da50: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
da60: 62 6c 65 3b 0a 20 20 69 44 62 20 3d 20 70 54 61  ble;.  iDb = pTa
da70: 62 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72 74  b->iDb;.  assert
da80: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
da90: 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64  db->nDb );.#ifnd
daa0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
dab0: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
dac0: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
dad0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
dae0: 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
daf0: 4c 45 28 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20  LE(pTab->iDb);. 
db00: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
db10: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61  Db = db->aDb[pTa
db20: 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  b->iDb].zName;. 
db30: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
db40: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
db50: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
db60: 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20  Tab, 0, zDb)){. 
db70: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
db80: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
db90: 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
dba0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  ){.      if( !OM
dbb0: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
dbc0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
dbd0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
dbe0: 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  P_TEMP_VIEW;.   
dbf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dc00: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
dc10: 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  DROP_VIEW;.     
dc20: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
dc30: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
dc40: 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
dc50: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
dc60: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
dc70: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
dc80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
dc90: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
dca0: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a  _TABLE;.      }.
dcb0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
dcc0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
dcd0: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61  Parse, code, pTa
dce0: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  b->zName, 0, zDb
dcf0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
dd00: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
dd10: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
dd20: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
dd30: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
dd40: 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61  ELETE, pTab->zNa
dd50: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
dd60: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
dd70: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
dd80: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
dd90: 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79  ( pTab->readOnly
dda0: 20 7c 7c 20 70 54 61 62 3d 3d 64 62 2d 3e 61 44   || pTab==db->aD
ddb0: 62 5b 69 44 62 5d 2e 70 53 65 71 54 61 62 20 29  b[iDb].pSeqTab )
ddc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
ddd0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
dde0: 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20  able %s may not 
ddf0: 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61  be dropped", pTa
de00: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
de10: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
de20: 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  ble;.  }..#ifnde
de30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
de40: 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 44  EW.  /* Ensure D
de50: 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f 74  ROP TABLE is not
de60: 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77 2c   used on a view,
de70: 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20 69   and DROP VIEW i
de80: 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20  s not used.  ** 
de90: 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  on a table..  */
dea0: 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26  .  if( isView &&
deb0: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
dec0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
ded0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
dee0: 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45   "use DROP TABLE
def0: 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65   to delete table
df00: 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
df10: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
df20: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
df30: 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  }.  if( !isView 
df40: 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
df50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
df60: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
df70: 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74  "use DROP VIEW t
df80: 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25 73  o delete view %s
df90: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
dfa0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
dfb0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23  rop_table;.  }.#
dfc0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
dfd0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
dfe0: 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66 72  ove the table fr
dff0: 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
e000: 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b  ble.  ** on disk
e010: 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
e020: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
e030: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
e040: 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72      Trigger *pTr
e050: 69 67 67 65 72 3b 0a 20 20 20 20 69 6e 74 20 69  igger;.    int i
e060: 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a  Db = pTab->iDb;.
e070: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
e080: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20  b->aDb[iDb];.   
e090: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
e0a0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
e0b0: 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 20 20  se, 0, iDb);..  
e0c0: 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72    /* Drop all tr
e0d0: 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65  iggers associate
e0e0: 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
e0f0: 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20   being dropped. 
e100: 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73 20 67  Code.    ** is g
e110: 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f  enerated to remo
e120: 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
e130: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e  sqlite_master an
e140: 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69  d/or.    ** sqli
e150: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69  te_temp_master i
e160: 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  f required..    
e170: 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72 20  */.    pTrigger 
e180: 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72  = pTab->pTrigger
e190: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54 72  ;.    while( pTr
e1a0: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61  igger ){.      a
e1b0: 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d  ssert( pTrigger-
e1c0: 3e 69 44 62 3d 3d 69 44 62 20 7c 7c 20 70 54 72  >iDb==iDb || pTr
e1d0: 69 67 67 65 72 2d 3e 69 44 62 3d 3d 31 20 29 3b  igger->iDb==1 );
e1e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 72  .      sqlite3Dr
e1f0: 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61  opTriggerPtr(pPa
e200: 72 73 65 2c 20 70 54 72 69 67 67 65 72 2c 20 31  rse, pTrigger, 1
e210: 29 3b 0a 20 20 20 20 20 20 70 54 72 69 67 67 65  );.      pTrigge
e220: 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e  r = pTrigger->pN
e230: 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  ext;.    }..#ifn
e240: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e250: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
e260: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20    /* Remove any 
e270: 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73  entries of the s
e280: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
e290: 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
e2a0: 77 69 74 68 0a 20 20 20 20 2a 2a 20 74 68 65 20  with.    ** the 
e2b0: 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
e2c0: 70 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  ped. This is don
e2d0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62  e before the tab
e2e0: 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20  le is dropped.  
e2f0: 20 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65    ** at the btre
e300: 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65  e level, in case
e310: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
e320: 65 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73  ence table needs
e330: 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20   to.    ** move 
e340: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
e350: 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70  he drop (can hap
e360: 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  pen in auto-vacu
e370: 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f  um mode)..    */
e380: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61  .    if( pTab->a
e390: 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20  utoInc ){.      
e3a0: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
e3b0: 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
e3c0: 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
e3d0: 25 73 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %s.sqlite_sequen
e3e0: 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ce WHERE name=%Q
e3f0: 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ",.        pDb->
e400: 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
e410: 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
e420: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
e430: 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45   Drop all SQLITE
e440: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e  _MASTER table an
e450: 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  d index entries 
e460: 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
e470: 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20  e.    ** table. 
e480: 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65  The program name
e490: 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74   loops through t
e4a0: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
e4b0: 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 20 20  and deletes.    
e4c0: 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61  ** every row tha
e4d0: 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
e4e0: 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ble of the same 
e4f0: 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20  name as the one 
e500: 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f  being.    ** dro
e510: 70 70 65 64 2e 20 54 72 69 67 67 65 72 73 20 61  pped. Triggers a
e520: 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72  re handled seper
e530: 61 74 65 6c 79 20 62 65 63 61 75 73 65 20 61 20  ately because a 
e540: 74 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20  trigger can be. 
e550: 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e     ** created in
e560: 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
e570: 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74  se that refers t
e580: 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f  o a table in ano
e590: 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 61 74 61  ther.    ** data
e5a0: 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  base..    */.   
e5b0: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
e5c0: 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
e5d0: 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
e5e0: 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62  M %Q.%s WHERE tb
e5f0: 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79  l_name=%Q and ty
e600: 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a  pe!='trigger'",.
e610: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61          pDb->zNa
e620: 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
e630: 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61  (iDb), pTab->zNa
e640: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73  me);.    if( !is
e650: 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 64 65  View ){.      de
e660: 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73  stroyTable(pPars
e670: 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  e, pTab);.    }.
e680: 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  .    /* Remove t
e690: 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66  he table entry f
e6a0: 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74  rom SQLite's int
e6b0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64  ernal schema and
e6c0: 20 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a 20 74   modify.    ** t
e6d0: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
e6e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
e6f0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
e700: 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62  P_DropTable, iDb
e710: 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
e720: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
e730: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  3ChangeCookie(db
e740: 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20  , v, iDb);.  }. 
e750: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
e760: 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65  All(db, iDb);..e
e770: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a  xit_drop_table:.
e780: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
e790: 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d  Delete(pName);.}
e7a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
e7b0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
e7c0: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66  o create a new f
e7d0: 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68  oreign key on th
e7e0: 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65  e table.** curre
e7f0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
e800: 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43  ruction.  pFromC
e810: 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ol determines wh
e820: 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69  ich columns.** i
e830: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  n the current ta
e840: 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ble point to the
e850: 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49   foreign key.  I
e860: 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68  f pFromCol==0 th
e870: 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68  en.** connect th
e880: 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73  e key to the las
e890: 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65  t column inserte
e8a0: 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e  d.  pTo is the n
e8b0: 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61  ame of.** the ta
e8c0: 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e  ble referred to.
e8d0: 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69    pToCol is a li
e8e0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
e8f0: 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f  the other.** pTo
e900: 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20   table that the 
e910: 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e  foreign key poin
e920: 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f  ts to.  flags co
e930: 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e  ntains all.** in
e940: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
e950: 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  the conflict res
e960: 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
e970: 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  ms specified.** 
e980: 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45  in the ON DELETE
e990: 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20  , ON UPDATE and 
e9a0: 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65  ON INSERT clause
e9b0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79  s..**.** An FKey
e9c0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72   structure is cr
e9d0: 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20  eated and added 
e9e0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
e9f0: 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20  rently.** under 
ea00: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20  construction in 
ea10: 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  the pParse->pNew
ea20: 54 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68  Table field.  Th
ea30: 65 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73  e new FKey.** is
ea40: 20 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f   not linked into
ea50: 20 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68   db->aFKey at th
ea60: 69 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20  is point - that 
ea70: 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a  does not happen.
ea80: 2a 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33  ** until sqlite3
ea90: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a  EndTable()..**.*
eaa0: 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  * The foreign ke
eab0: 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d  y is set for IMM
eac0: 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e  EDIATE processin
ead0: 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74  g.  A subsequent
eae0: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69   call.** to sqli
eaf0: 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
eb00: 65 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67  ey() might chang
eb10: 65 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52  e this to DEFERR
eb20: 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ED..*/.void sqli
eb30: 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e  te3CreateForeign
eb40: 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
eb50: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
eb60: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
eb70: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46  /.  ExprList *pF
eb80: 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75  romCol,  /* Colu
eb90: 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c  mns in this tabl
eba0: 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  e that point to 
ebb0: 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
ebc0: 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20   Token *pTo,    
ebd0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
ebe0: 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
ebf0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
ec00: 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f  pToCol,    /* Co
ec10: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68  lumns in the oth
ec20: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  er table */.  in
ec30: 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
ec40: 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72     /* Conflict r
ec50: 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
ec60: 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 23 69 66 6e  thms. */.){.#ifn
ec70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ec80: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b  FOREIGN_KEY.  FK
ec90: 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20  ey *pFKey = 0;. 
eca0: 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72   Table *p = pPar
ecb0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
ecc0: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e   int nByte;.  in
ecd0: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  t i;.  int nCol;
ece0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61  .  char *z;..  a
ecf0: 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b  ssert( pTo!=0 );
ed00: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
ed10: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
ed20: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28  to fk_end;.  if(
ed30: 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
ed40: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
ed50: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66  ->nCol-1;.    if
ed60: 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20  ( iCol<0 ) goto 
ed70: 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  fk_end;.    if( 
ed80: 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
ed90: 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20  ->nExpr!=1 ){.  
eda0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
edb0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72  Msg(pParse, "for
edc0: 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a  eign key on %s".
edd0: 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c           " shoul
ede0: 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79  d reference only
edf0: 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   one column of t
ee00: 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20  able %T",.      
ee10: 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d     p->aCol[iCol]
ee20: 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20  .zName, pTo);.  
ee30: 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
ee40: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20  .    }.    nCol 
ee50: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
ee60: 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
ee70: 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43  l->nExpr!=pFromC
ee80: 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  ol->nExpr ){.   
ee90: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
eea0: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
eeb0: 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75   "number of colu
eec0: 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  mns in foreign k
eed0: 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ey does not matc
eee0: 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
eef0: 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d  ".        "colum
ef00: 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65  ns in the refere
ef10: 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20  nced table");.  
ef20: 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
ef30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c   }else{.    nCol
ef40: 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78   = pFromCol->nEx
ef50: 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20  pr;.  }.  nByte 
ef60: 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29  = sizeof(*pFKey)
ef70: 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70   + nCol*sizeof(p
ef80: 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b  FKey->aCol[0]) +
ef90: 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69   pTo->n + 1;.  i
efa0: 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
efb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43   for(i=0; i<pToC
efc0: 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ol->nExpr; i++){
efd0: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
efe0: 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61  strlen(pToCol->a
eff0: 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a  [i].zName) + 1;.
f000: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
f010: 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  y = sqliteMalloc
f020: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
f030: 20 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f   pFKey==0 ) goto
f040: 20 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79   fk_end;.  pFKey
f050: 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70  ->pFrom = p;.  p
f060: 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20  FKey->pNextFrom 
f070: 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20  = p->pFKey;.  z 
f080: 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b  = (char*)&pFKey[
f090: 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f  1];.  pFKey->aCo
f0a0: 6c 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c  l = (struct sCol
f0b0: 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73  Map*)z;.  z += s
f0c0: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f  izeof(struct sCo
f0d0: 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46  lMap)*nCol;.  pF
f0e0: 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20  Key->zTo = z;.  
f0f0: 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a  memcpy(z, pTo->z
f100: 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70  , pTo->n);.  z[p
f110: 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20  To->n] = 0;.  z 
f120: 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70  += pTo->n+1;.  p
f130: 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20  FKey->pNextTo = 
f140: 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c  0;.  pFKey->nCol
f150: 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70   = nCol;.  if( p
f160: 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
f170: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d    pFKey->aCol[0]
f180: 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c  .iFrom = p->nCol
f190: 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
f1a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
f1b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
f1c0: 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
f1d0: 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a  =0; j<p->nCol; j
f1e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
f1f0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
f200: 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  p->aCol[j].zName
f210: 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d  , pFromCol->a[i]
f220: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
f230: 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61          pFKey->a
f240: 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a  Col[i].iFrom = j
f250: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
f260: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
f270: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
f280: 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  >=p->nCol ){.   
f290: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
f2a0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
f2b0: 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e          "unknown
f2c0: 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69   column \"%s\" i
f2d0: 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  n foreign key de
f2e0: 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20  finition", .    
f2f0: 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e        pFromCol->
f300: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
f310: 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
f320: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f330: 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c    }.  if( pToCol
f340: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
f350: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
f360: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72       int n = str
f370: 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  len(pToCol->a[i]
f380: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  .zName);.      p
f390: 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43  FKey->aCol[i].zC
f3a0: 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65  ol = z;.      me
f3b0: 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e  mcpy(z, pToCol->
f3c0: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a  a[i].zName, n);.
f3d0: 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a        z[n] = 0;.
f3e0: 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a        z += n+1;.
f3f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
f400: 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
f410: 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65  0;.  pFKey->dele
f420: 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26  teConf = flags &
f430: 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e   0xff;.  pFKey->
f440: 75 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c  updateConf = (fl
f450: 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66  ags >> 8 ) & 0xf
f460: 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65  f;.  pFKey->inse
f470: 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20  rtConf = (flags 
f480: 3e 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a  >> 16 ) & 0xff;.
f490: 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66  .  /* Link the f
f4a0: 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68  oreign key to th
f4b0: 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c  e table as the l
f4c0: 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20  ast step..  */. 
f4d0: 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65   p->pFKey = pFKe
f4e0: 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a  y;.  pFKey = 0;.
f4f0: 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74  .fk_end:.  sqlit
f500: 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 23 65  eFree(pFKey);.#e
f510: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
f520: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52  (SQLITE_OMIT_FOR
f530: 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73  EIGN_KEY) */.  s
f540: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
f550: 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a  lete(pFromCol);.
f560: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
f570: 74 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b  tDelete(pToCol);
f580: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
f590: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
f5a0: 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c   when an INITIAL
f5b0: 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20  LY IMMEDIATE or 
f5c0: 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
f5d0: 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  ED.** clause is 
f5e0: 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  seen as part of 
f5f0: 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  a foreign key de
f600: 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69  finition.  The i
f610: 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72  sDeferred.** par
f620: 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20  ameter is 1 for 
f630: 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
f640: 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49  ED and 0 for INI
f650: 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
f660: 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f  ..** The behavio
f670: 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  r of the most re
f680: 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66  cently created f
f690: 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64  oreign key is ad
f6a0: 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64  justed.** accord
f6b0: 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ingly..*/.void s
f6c0: 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
f6d0: 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61  gnKey(Parse *pPa
f6e0: 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72  rse, int isDefer
f6f0: 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  red){.#ifndef SQ
f700: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
f710: 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70  N_KEY.  Table *p
f720: 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  Tab;.  FKey *pFK
f730: 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20  ey;.  if( (pTab 
f740: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
f750: 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65  ble)==0 || (pFKe
f760: 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29  y = pTab->pFKey)
f770: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
f780: 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
f790: 64 20 3d 20 69 73 44 65 66 65 72 72 65 64 3b 0a  d = isDeferred;.
f7a0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
f7b0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
f7c0: 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e  at will erase an
f7d0: 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a  d refill index *
f7e0: 70 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a  pIdx.  This is.*
f7f0: 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61  * used to initia
f800: 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65  lize a newly cre
f810: 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f  ated index or to
f820: 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a   recompute the.*
f830: 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  * content of an 
f840: 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73  index in respons
f850: 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63  e to a REINDEX c
f860: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66  ommand..**.** if
f870: 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20   memRootPage is 
f880: 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74  not negative, it
f890: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
f8a0: 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a  index is newly.*
f8b0: 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  * created.  The 
f8c0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 73 70 65 63  memory cell spec
f8d0: 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74  ified by memRoot
f8e0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Page contains th
f8f0: 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e  e.** root page n
f900: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
f910: 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50  ex.  If memRootP
f920: 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
f930: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64   then.** the ind
f940: 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
f950: 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c  s and must be cl
f960: 65 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69  eared before bei
f970: 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a  ng refilled and.
f980: 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ** the root page
f990: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
f9a0: 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72  ndex is taken fr
f9b0: 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e  om pIndex->tnum.
f9c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f9d0: 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
f9e0: 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
f9f0: 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c  , Index *pIndex,
fa00: 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65   int memRootPage
fa10: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
fa20: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
fa30: 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  e;  /* The table
fa40: 20 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64   that is indexed
fa50: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
fa60: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 20 20   pParse->nTab;  
fa70: 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75       /* Btree cu
fa80: 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54  rsor used for pT
fa90: 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ab */.  int iIdx
faa0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
fab0: 31 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20  1;     /* Btree 
fac0: 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  cursor used for 
fad0: 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20  pIndex */.  int 
fae0: 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  addr1;          
faf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
fb00: 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20  dress of top of 
fb10: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e  loop */.  int tn
fb20: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
fb30: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
fb40: 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a   page of index *
fb50: 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb70: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
fb80: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69  ode into this vi
fb90: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f  rtual machine */
fba0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
fbb0: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
fbc0: 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ION.  if( sqlite
fbd0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
fbe0: 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  e, SQLITE_REINDE
fbf0: 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  X, pIndex->zName
fc00: 2c 20 30 2c 0a 20 20 20 20 20 20 70 50 61 72 73  , 0,.      pPars
fc10: 65 2d 3e 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65  e->db->aDb[pInde
fc20: 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20  x->iDb].zName ) 
fc30: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
fc40: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
fc50: 45 6e 73 75 72 65 20 61 6c 6c 20 74 68 65 20 72  Ensure all the r
fc60: 65 71 75 69 72 65 64 20 63 6f 6c 6c 61 74 69 6f  equired collatio
fc70: 6e 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 20  n sequences are 
fc80: 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 69 73 0a  available. This.
fc90: 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c    ** routine wil
fca0: 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6c  l invoke the col
fcb0: 6c 61 74 69 6f 6e 2d 6e 65 65 64 65 64 20 63 61  lation-needed ca
fcc0: 6c 6c 62 61 63 6b 20 69 66 20 6e 65 63 65 73 73  llback if necess
fcd0: 61 72 79 20 28 61 6e 64 0a 20 20 2a 2a 20 69 66  ary (and.  ** if
fce0: 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 72 65   one has been re
fcf0: 67 69 73 74 65 72 65 64 29 2e 0a 20 20 2a 2f 0a  gistered)..  */.
fd00: 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65    if( sqlite3Che
fd10: 63 6b 49 6e 64 65 78 43 6f 6c 6c 53 65 71 28 70  ckIndexCollSeq(p
fd20: 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 20 29  Parse, pIndex) )
fd30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
fd40: 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  }..  v = sqlite3
fd50: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
fd60: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
fd70: 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52  turn;.  if( memR
fd80: 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ootPage>=0 ){.  
fd90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fda0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
fdb0: 2c 20 6d 65 6d 52 6f 6f 74 50 61 67 65 2c 20 30  , memRootPage, 0
fdc0: 29 3b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 30 3b  );.    tnum = 0;
fdd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e  .  }else{.    tn
fde0: 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75  um = pIndex->tnu
fdf0: 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
fe00: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
fe10: 65 61 72 2c 20 74 6e 75 6d 2c 20 70 49 6e 64 65  ear, tnum, pInde
fe20: 78 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73  x->iDb);.  }.  s
fe30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fe40: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
fe50: 49 6e 64 65 78 2d 3e 69 44 62 2c 20 30 29 3b 0a  Index->iDb, 0);.
fe60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
fe70: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
fe80: 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 0a 20 20  , iIdx, tnum,.  
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fea0: 20 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78    (char*)&pIndex
feb0: 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  ->keyInfo, P3_KE
fec0: 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65  YINFO);.  sqlite
fed0: 33 4f 70 65 6e 54 61 62 6c 65 46 6f 72 52 65 61  3OpenTableForRea
fee0: 64 69 6e 67 28 76 2c 20 69 54 61 62 2c 20 70 54  ding(v, iTab, pT
fef0: 61 62 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  ab);.  addr1 = s
ff00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ff10: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
ff20: 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  ab, 0);.  sqlite
ff30: 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
ff40: 79 28 76 2c 20 70 49 6e 64 65 78 2c 20 69 54 61  y(v, pIndex, iTa
ff50: 62 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  b);.  if( pIndex
ff60: 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
ff70: 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 75  ne ){.    int cu
ff80: 72 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  raddr = sqlite3V
ff90: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
ffa0: 29 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 32  );.    int addr2
ffb0: 20 3d 20 63 75 72 61 64 64 72 2b 34 3b 0a 20 20   = curaddr+4;.  
ffc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
ffd0: 6e 67 65 50 32 28 76 2c 20 63 75 72 61 64 64 72  ngeP2(v, curaddr
ffe0: 2d 31 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20  -1, addr2);.    
fff0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10000 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54  (v, OP_Rowid, iT
10010 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  ab, 0);.    sqli
10020 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10030 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 30 29  OP_AddImm, 1, 0)
10040 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10050 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 55  eAddOp(v, OP_IsU
10060 6e 69 71 75 65 2c 20 69 49 64 78 2c 20 61 64 64  nique, iIdx, add
10070 72 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r2);.    sqlite3
10080 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61  VdbeOp3(v, OP_Ha
10090 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  lt, SQLITE_CONST
100a0 52 41 49 4e 54 2c 20 4f 45 5f 41 62 6f 72 74 2c  RAINT, OE_Abort,
100b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
100c0 20 20 20 20 20 22 69 6e 64 65 78 65 64 20 63 6f       "indexed co
100d0 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e  lumns are not un
100e0 69 71 75 65 22 2c 20 50 33 5f 53 54 41 54 49 43  ique", P3_STATIC
100f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
10100 64 64 72 32 3d 3d 73 71 6c 69 74 65 33 56 64 62  ddr2==sqlite3Vdb
10110 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
10120 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
10130 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10140 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c  IdxInsert, iIdx,
10150 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
10160 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
10170 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b  xt, iTab, addr1+
10180 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
10190 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
101a0 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
101b0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
101c0 6f 73 65 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20  ose, iTab, 0);. 
101d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
101e0 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  p(v, OP_Close, i
101f0 49 64 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Idx, 0);.}../*.*
10200 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69  * Create a new i
10210 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20  ndex for an SQL 
10220 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70  table.  pName1.p
10230 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d  Name2 is the nam
10240 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a  e of the index .
10250 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20  ** and pTblList 
10260 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
10270 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
10280 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
10290 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62   Both will .** b
102a0 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69  e NULL for a pri
102b0 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69  mary key or an i
102c0 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65  ndex that is cre
102d0 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  ated to satisfy 
102e0 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73  a.** UNIQUE cons
102f0 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62  traint.  If pTab
10300 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72  le and pIndex ar
10310 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72  e NULL, use pPar
10320 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a  se->pNewTable.**
10330 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f   as the table to
10340 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50   be indexed.  pP
10350 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
10360 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  is a table that 
10370 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  is.** currently 
10380 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
10390 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41  d by a CREATE TA
103a0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
103b0 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20  *.** pList is a 
103c0 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
103d0 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
103e0 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55  pList will be NU
103f0 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  LL if this.** is
10400 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
10410 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61  r unique-constra
10420 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20  int on the most 
10430 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64  recent column ad
10440 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61  ded.** to the ta
10450 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
10460 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
10470 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .  .*/.void sqli
10480 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a  te3CreateIndex(.
10490 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
104a0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f       /* All info
104b0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
104c0 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f  is parse */.  To
104d0 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
104e0 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
104f0 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
10500 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  y be NULL */.  T
10510 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
10520 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
10530 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20   of index name. 
10540 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
10550 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61   SrcList *pTblNa
10560 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20  me, /* Table to 
10570 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73  index. Use pPars
10580 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20  e->pNewTable if 
10590 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  0 */.  ExprList 
105a0 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c  *pList,   /* A l
105b0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
105c0 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
105d0 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
105e0 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74       /* OE_Abort
105f0 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f  , OE_Ignore, OE_
10600 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e  Replace, or OE_N
10610 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  one */.  Token *
10620 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54  pStart,     /* T
10630 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20  he CREATE token 
10640 74 68 61 74 20 62 65 67 69 6e 73 20 61 20 43 52  that begins a CR
10650 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
10660 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
10670 2a 70 45 6e 64 20 20 20 20 20 20 20 20 2f 2a 20  *pEnd        /* 
10680 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f  The ")" that clo
10690 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49  ses the CREATE I
106a0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
106b0 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
106c0 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 54 61 62  ab = 0;   /* Tab
106d0 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
106e0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
106f0 64 65 78 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20  dex = 0; /* The 
10700 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61  index to be crea
10710 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
10720 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Name = 0;.  int 
10730 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75  i, j;.  Token nu
10740 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b 65  llId;    /* Fake
10750 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d   token for an em
10760 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20  pty ID list */. 
10770 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20   DbFixer sFix;  
10780 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69    /* For assigni
10790 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ng database name
107a0 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20  s to pTable */. 
107b0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
107c0 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 6e  Parse->db;..  in
107d0 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
107e0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
107f0 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
10800 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a   being written *
10810 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
10820 20 3d 20 30 3b 20 2f 2a 20 55 6e 71 75 61 6c 69   = 0; /* Unquali
10830 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65  fied name of the
10840 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65   index to create
10850 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73   */..  if( pPars
10860 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
10870 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
10880 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
10890 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a  ate_index;..  /*
108a0 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74  .  ** Find the t
108b0 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
108c0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74  be indexed.  Ret
108d0 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74  urn early if not
108e0 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69   found..  */.  i
108f0 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
10900 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  {..    /* Use th
10910 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78  e two-part index
10920 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
10930 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ne the database 
10940 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63  .    ** to searc
10950 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  h for the table.
10960 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65   'Fix' the table
10970 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62   name to this db
10980 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c  .    ** before l
10990 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61  ooking up the ta
109a0 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
109b0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26  assert( pName1 &
109c0 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20  & pName2 );.    
109d0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
109e0 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
109f0 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
10a00 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66   &pName);.    if
10a10 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65  ( iDb<0 ) goto e
10a20 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10a30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
10a40 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20  E_OMIT_TEMPDB.  
10a50 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65    /* If the inde
10a60 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61  x name was unqua
10a70 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66  lified, check if
10a80 20 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20   the the table. 
10a90 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20     ** is a temp 
10aa0 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65  table. If so, se
10ab0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  t the database t
10ac0 6f 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  o 1..    */.    
10ad0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72  pTab = sqlite3Sr
10ae0 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72  cListLookup(pPar
10af0 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  se, pTblName);. 
10b00 20 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26     if( pName2 &&
10b10 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26   pName2->n==0 &&
10b20 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 69   pTab && pTab->i
10b30 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  Db==1 ){.      i
10b40 44 62 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  Db = 1;.    }.#e
10b50 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73 71  ndif..    if( sq
10b60 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
10b70 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
10b80 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29   "index", pName)
10b90 20 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69   &&.        sqli
10ba0 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73  te3FixSrcList(&s
10bb0 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20  Fix, pTblName). 
10bc0 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42     ){.      /* B
10bd0 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65  ecause the parse
10be0 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62  r constructs pTb
10bf0 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e  lName from a sin
10c00 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a  gle identifier,.
10c10 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
10c20 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e  FixSrcList can n
10c30 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20  ever fail. */.  
10c40 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
10c50 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20     }.    pTab = 
10c60 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
10c70 6c 65 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e  le(pParse, pTblN
10c80 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
10c90 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c 4e 61   .        pTblNa
10ca0 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
10cb0 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54  se);.    if( !pT
10cc0 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  ab ) goto exit_c
10cd0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
10ce0 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 70 54   assert( iDb==pT
10cf0 61 62 2d 3e 69 44 62 20 29 3b 0a 20 20 7d 65 6c  ab->iDb );.  }el
10d00 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
10d10 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20  pName==0 );.    
10d20 70 54 61 62 20 3d 20 20 70 50 61 72 73 65 2d 3e  pTab =  pParse->
10d30 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69  pNewTable;.    i
10d40 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a  Db = pTab->iDb;.
10d50 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 61 62 3d    }..  if( pTab=
10d60 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
10d70 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  rr ) goto exit_c
10d80 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69  reate_index;.  i
10d90 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c  f( pTab->readOnl
10da0 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
10db0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10dc0 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
10dd0 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20  ot be indexed", 
10de0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
10df0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
10e00 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69  te_index;.  }.#i
10e10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10e20 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54 61  T_VIEW.  if( pTa
10e30 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
10e40 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10e50 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 73  g(pParse, "views
10e60 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
10e70 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  xed");.    goto 
10e80 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
10e90 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  x;.  }.#endif.. 
10ea0 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
10eb0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
10ec0 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  dex.  Make sure 
10ed0 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72  there is not alr
10ee0 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a  eady another.  *
10ef0 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
10f00 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
10f10 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ame.  .  **.  **
10f20 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20   Exception:  If 
10f30 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
10f40 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d  he names of perm
10f50 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72  anent indices fr
10f60 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  om the.  ** sqli
10f70 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
10f80 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74  (because some ot
10f90 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e  her process chan
10fa0 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20  ged the schema) 
10fb0 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20  and.  ** one of 
10fc0 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  the index names 
10fd0 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68  collides with th
10fe0 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70  e name of a temp
10ff0 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20  orary table or. 
11000 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20   ** index, then 
11010 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
11020 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73   to process this
11030 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
11040 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74  * If pName==0 it
11050 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61   means that we a
11060 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20  re.  ** dealing 
11070 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b  with a primary k
11080 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ey or UNIQUE con
11090 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76  straint.  We hav
110a0 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a  e to invent our.
110b0 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20    ** own name.. 
110c0 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
110d0 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
110e0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
110f0 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20  ken(pName);.    
11100 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
11110 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
11120 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20  (pParse) ) goto 
11130 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
11140 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  x;.    if( zName
11150 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
11160 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11170 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
11180 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
11190 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
111a0 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
111b0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
111c0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
111d0 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
111e0 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66  busy ){.      if
111f0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
11200 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
11210 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78  Parse) ) goto ex
11220 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
11230 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
11240 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
11250 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69  zName, db->aDb[i
11260 44 62 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  Db].zName)!=0 ){
11270 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11280 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11290 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61   "index %s alrea
112a0 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d  dy exists", zNam
112b0 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
112c0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
112d0 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
112e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
112f0 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
11300 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)!=0 ){.     
11310 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11320 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
11330 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74  e is already a t
11340 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20  able named %s", 
11350 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
11360 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
11370 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
11380 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
11390 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d     char zBuf[30]
113a0 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
113b0 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20   Index *pLoop;. 
113c0 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61     for(pLoop=pTa
113d0 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20  b->pIndex, n=1; 
113e0 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
113f0 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b  op->pNext, n++){
11400 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  }.    sprintf(zB
11410 75 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20 20 20  uf,"_%d",n);.   
11420 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20   zName = 0;.    
11430 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
11440 28 26 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  (&zName, "sqlite
11450 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 70 54  _autoindex_", pT
11460 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66 2c  ab->zName, zBuf,
11470 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
11480 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67  if( zName==0 ) g
11490 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
114a0 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
114b0 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f   Check for autho
114c0 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61  rization to crea
114d0 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a  te an index..  *
114e0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
114f0 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
11500 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73  ION.  {.    cons
11510 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
11520 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
11530 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
11540 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
11550 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
11560 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
11570 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Db), 0, zDb) ){.
11580 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
11590 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
115a0 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49    }.    i = SQLI
115b0 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b  TE_CREATE_INDEX;
115c0 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
115d0 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
115e0 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ) i = SQLITE_CRE
115f0 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ATE_TEMP_INDEX;.
11600 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
11610 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
11620 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d   i, zName, pTab-
11630 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
11640 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
11650 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11660 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
11670 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30    /* If pList==0
11680 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  , it means this 
11690 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
116a0 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69  ed to make a pri
116b0 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75  mary.  ** key ou
116c0 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f  t of the last co
116d0 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68  lumn added to th
116e0 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
116f0 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a  nstruction..  **
11700 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b   So create a fak
11710 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61  e list to simula
11720 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20  te this..  */.  
11730 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
11740 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70      nullId.z = p
11750 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
11760 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20  nCol-1].zName;. 
11770 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74     nullId.n = st
11780 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a  rlen(nullId.z);.
11790 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
117a0 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
117b0 64 28 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29  d(0, 0, &nullId)
117c0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
117d0 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
117e0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
117f0 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c  ..  /* .  ** All
11800 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
11810 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f  structure. .  */
11820 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
11830 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
11840 28 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e  (Index) + strlen
11850 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 20 73 69  (zName) + 1 + si
11860 7a 65 6f 66 28 69 6e 74 29 20 2b 0a 20 20 20 20  zeof(int) +.    
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11880 20 20 20 20 28 73 69 7a 65 6f 66 28 69 6e 74 29      (sizeof(int)
11890 2a 32 20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c  *2 + sizeof(Coll
118a0 53 65 71 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e 45  Seq*))*pList->nE
118b0 78 70 72 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  xpr );.  if( sql
118c0 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
118d0 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  ed ) goto exit_c
118e0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70  reate_index;.  p
118f0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20  Index->aiColumn 
11900 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64 65 78 2d  = (int*)&pIndex-
11910 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 70  >keyInfo.aColl[p
11920 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20  List->nExpr];.  
11930 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74  pIndex->aiRowEst
11940 20 3d 20 28 75 6e 73 69 67 6e 65 64 2a 29 26 70   = (unsigned*)&p
11950 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
11960 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20  pList->nExpr];. 
11970 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d   pIndex->zName =
11980 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d   (char*)&pIndex-
11990 3e 61 69 52 6f 77 45 73 74 5b 70 4c 69 73 74 2d  >aiRowEst[pList-
119a0 3e 6e 45 78 70 72 2b 31 5d 3b 0a 20 20 73 74 72  >nExpr+1];.  str
119b0 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  cpy(pIndex->zNam
119c0 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e  e, zName);.  pIn
119d0 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  dex->pTable = pT
119e0 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43  ab;.  pIndex->nC
119f0 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  olumn = pList->n
11a00 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  Expr;.  pIndex->
11a10 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f  onError = onErro
11a20 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74  r;.  pIndex->aut
11a30 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d  oIndex = pName==
11a40 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44 62  0;.  pIndex->iDb
11a50 20 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 53 63   = iDb;..  /* Sc
11a60 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  an the names of 
11a70 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
11a80 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
11a90 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20  ndexed and.  ** 
11aa0 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  load the column 
11ab0 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65  indices into the
11ac0 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
11ad0 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  .  Report an err
11ae0 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63  or.  ** if any c
11af0 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75  olumn is not fou
11b00 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  nd..  */.  for(i
11b10 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
11b20 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f  pr; i++){.    fo
11b30 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
11b40 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
11b50 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
11b60 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
11b70 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  zName, pTab->aCo
11b80 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[j].zName)==0 )
11b90 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11ba0 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e    if( j>=pTab->n
11bb0 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Col ){.      sql
11bc0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11bd0 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68  rse, "table %s h
11be0 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  as no column nam
11bf0 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  ed %s",.        
11c00 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69  pTab->zName, pLi
11c10 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
11c20 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
11c30 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
11c40 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
11c50 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a  >aiColumn[i] = j
11c60 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
11c70 3e 61 5b 69 5d 2e 70 45 78 70 72 20 29 7b 0a 20  >a[i].pExpr ){. 
11c80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
11c90 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e  st->a[i].pExpr->
11ca0 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70  pColl );.      p
11cb0 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
11cc0 43 6f 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73 74 2d  Coll[i] = pList-
11cd0 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f  >a[i].pExpr->pCo
11ce0 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
11cf0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79       pIndex->key
11d00 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Info.aColl[i] = 
11d10 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43  pTab->aCol[j].pC
11d20 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  oll;.    }.    a
11d30 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6b  ssert( pIndex->k
11d40 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20  eyInfo.aColl[i] 
11d50 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  );.    if( !db->
11d60 69 6e 69 74 2e 62 75 73 79 20 26 26 20 0a 20 20  init.busy && .  
11d70 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65        sqlite3Che
11d80 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ckCollSeq(pParse
11d90 2c 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  , pIndex->keyInf
11da0 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 0a 20 20 20  o.aColl[i]) .   
11db0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
11dc0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
11dd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49  ;.    }.  }.  pI
11de0 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46  ndex->keyInfo.nF
11df0 69 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  ield = pList->nE
11e00 78 70 72 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  xpr;.  sqlite3De
11e10 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64  faultRowEst(pInd
11e20 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  ex);..  if( pTab
11e30 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ==pParse->pNewTa
11e40 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ble ){.    /* Th
11e50 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62  is routine has b
11e60 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  een called to cr
11e70 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69  eate an automati
11e80 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20  c index as a.   
11e90 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20   ** result of a 
11ea0 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
11eb0 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20  NIQUE clause on 
11ec0 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  a column definit
11ed0 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  ion, or.    ** a
11ee0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
11ef0 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f  UNIQUE clause fo
11f00 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75  llowing the colu
11f10 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a  mn definitions..
11f20 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20      ** i.e. one 
11f30 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
11f40 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
11f50 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
11f60 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54  y);.    ** CREAT
11f70 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20  E TABLE t(x, y, 
11f80 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20  UNIQUE(x, y));. 
11f90 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74     **.    ** Eit
11fa0 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74  her way, check t
11fb0 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62  o see if the tab
11fc0 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73  le already has s
11fd0 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66  uch an index. If
11fe0 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27  .    ** so, don'
11ff0 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e  t bother creatin
12000 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73  g this one. This
12010 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f   only applies to
12020 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  .    ** automati
12030 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e  cally created in
12040 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e  dices. Users can
12050 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68   do as they wish
12060 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70   with.    ** exp
12070 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20  licit indices.. 
12080 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20     */.    Index 
12090 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
120a0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
120b0 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
120c0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
120d0 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73   int k;.      as
120e0 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72  sert( pIdx->onEr
120f0 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
12100 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
12110 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b  dx->autoIndex );
12120 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12130 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
12140 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20  OE_None );..    
12150 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
12160 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f  umn!=pIndex->nCo
12170 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
12180 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  .      for(k=0; 
12190 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  k<pIdx->nColumn;
121a0 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   k++){.        i
121b0 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
121c0 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69  n[k]!=pIndex->ai
121d0 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61  Column[k] ) brea
121e0 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  k;.        if( p
121f0 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  Idx->keyInfo.aCo
12200 6c 6c 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b  ll[k]!=pIndex->k
12210 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20  eyInfo.aColl[k] 
12220 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
12230 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49  .      if( k==pI
12240 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  dx->nColumn ){. 
12250 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
12260 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78  >onError!=pIndex
12270 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20  ->onError ){.   
12280 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
12290 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65  onstraint create
122a0 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78  s the same index
122b0 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20   as a previous. 
122c0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
122d0 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64  traint specified
122e0 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68   somewhere in th
122f0 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
12300 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
12310 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74      ** However t
12320 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  he ON CONFLICT c
12330 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65  lauses are diffe
12340 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68  rent. If both th
12350 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is .          **
12360 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
12370 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75  the previous equ
12380 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69  ivalent constrai
12390 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74  nt have explicit
123a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e  .          ** ON
123b0 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
123c0 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  s this is an err
123d0 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  or. Otherwise, u
123e0 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  se the.         
123f0 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73   ** explicitly s
12400 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f  pecified behavio
12410 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ur for the index
12420 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
12430 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
12440 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
12450 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64  _Default || pInd
12460 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
12470 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20  Default) ){.    
12480 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
12490 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
124a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
124b0 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e   "conflicting ON
124c0 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
124d0 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29  s specified", 0)
124e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
124f0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
12500 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
12510 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
12520 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72       pIdx->onErr
12530 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  or = pIndex->onE
12540 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
12550 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
12560 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
12570 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
12580 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
12590 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77   /* Link the new
125a0 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
125b0 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e   to its table an
125c0 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20  d to the other. 
125d0 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   ** in-memory da
125e0 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
125f0 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  s. .  */.  if( d
12600 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
12610 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
12620 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
12630 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
12640 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 69 64  [pIndex->iDb].id
12650 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  xHash, .        
12660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12670 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
12680 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a  strlen(pIndex->z
12690 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29  Name)+1, pIndex)
126a0 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
126b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
126c0 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61  pIndex );  /* Ma
126d0 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
126e0 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 67  ailed */.      g
126f0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12700 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
12710 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
12720 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
12730 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c  es;.    if( pTbl
12740 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
12750 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
12760 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
12770 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
12780 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
12790 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65 6e  t.busy is 0 then
127a0 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65   create the inde
127b0 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73  x on disk.  This
127c0 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77  .  ** involves w
127d0 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78  riting the index
127e0 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72   into the master
127f0 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69   table and filli
12800 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ng in the.  ** i
12810 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75  ndex with the cu
12820 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74  rrent table cont
12830 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ents..  **.  ** 
12840 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  The db->init.bus
12850 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20  y is 0 when the 
12860 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72  user first enter
12870 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58  s a CREATE INDEX
12880 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20   .  ** command. 
12890 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
128a0 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62  s 1 when a datab
128b0 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e  ase is opened an
128c0 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49  d .  ** CREATE I
128d0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20  NDEX statements 
128e0 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20  are read out of 
128f0 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
12900 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c  .  In.  ** the l
12910 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69  atter case the i
12920 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
12930 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69  sts on disk, whi
12940 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77  ch is why.  ** w
12950 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  e don't want to 
12960 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a  recreate it..  *
12970 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61  *.  ** If pTblNa
12980 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
12990 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e  his index is gen
129a0 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d  erated as a prim
129b0 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20  ary key.  ** or 
129c0 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
129d0 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41  t of a CREATE TA
129e0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
129f0 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a  Since the table.
12a00 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65    ** has just be
12a10 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63  en created, it c
12a20 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20  ontains no data 
12a30 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e  and the index in
12a40 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a  itialization.  *
12a50 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b  * step can be sk
12a60 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
12a70 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  se if( db->init.
12a80 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 56  busy==0 ){.    V
12a90 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
12aa0 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74   *zStmt;.    int
12ab0 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e   iMem = pParse->
12ac0 6e 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 76 20 3d  nMem++;..    v =
12ad0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
12ae0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
12af0 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69   v==0 ) goto exi
12b00 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12b10 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74  .    /* Create t
12b20 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20  he rootpage for 
12b30 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f  the index.    */
12b40 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
12b50 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
12b60 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
12b70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12b80 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61  AddOp(v, OP_Crea
12b90 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 29  teIndex, iDb, 0)
12ba0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12bb0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
12bc0 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b  Store, iMem, 0);
12bd0 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20  ..    /* Gather 
12be0 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
12bf0 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
12c00 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
12c10 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  into.    ** the 
12c20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20  zStmt variable. 
12c30 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
12c40 74 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a  tart && pEnd ){.
12c50 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64        /* A named
12c60 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65   index with an e
12c70 78 70 6c 69 63 69 74 20 43 52 45 41 54 45 20 49  xplicit CREATE I
12c80 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
12c90 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  /.      zStmt = 
12ca0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
12cb0 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25  CREATE%s INDEX %
12cc0 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e  .*s",.        on
12cd0 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f  Error==OE_None ?
12ce0 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c   "" : " UNIQUE",
12cf0 0a 20 20 20 20 20 20 20 20 70 45 6e 64 2d 3e 7a  .        pEnd->z
12d00 20 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c   - pName->z + 1,
12d10 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e  .        pName->
12d20 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  z);.    }else{. 
12d30 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d       /* An autom
12d40 61 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74  atic index creat
12d50 65 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20  ed by a PRIMARY 
12d60 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  KEY or UNIQUE co
12d70 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
12d80 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c    /* zStmt = sql
12d90 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b  ite3MPrintf("");
12da0 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   */.      zStmt 
12db0 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
12dc0 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20  /* Add an entry 
12dd0 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  in sqlite_master
12de0 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a   for this index.
12df0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
12e00 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
12e10 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22  arse, .        "
12e20 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25  INSERT INTO %Q.%
12e30 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27  s VALUES('index'
12e40 2c 25 51 2c 25 51 2c 23 30 2c 25 51 29 3b 22 2c  ,%Q,%Q,#0,%Q);",
12e50 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  .        db->aDb
12e60 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
12e70 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a  EMA_TABLE(iDb),.
12e80 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
12e90 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70  zName,.        p
12ea0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
12eb0 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b      zStmt.    );
12ec0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12ed0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
12ee0 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   1, 0);.    sqli
12ef0 74 65 46 72 65 65 28 7a 53 74 6d 74 29 3b 0a 0a  teFree(zStmt);..
12f00 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20      /* Fill the 
12f10 69 6e 64 65 78 20 77 69 74 68 20 64 61 74 61 20  index with data 
12f20 61 6e 64 20 72 65 70 61 72 73 65 20 74 68 65 20  and reparse the 
12f30 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20  schema. Code an 
12f40 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a 2a  OP_Expire.    **
12f50 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61   to invalidate a
12f60 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20  ll pre-compiled 
12f70 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20  statements..    
12f80 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e  */.    if( pTblN
12f90 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ame ){.      sql
12fa0 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
12fb0 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
12fc0 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  iMem);.      sql
12fd0 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
12fe0 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20  (db, v, iDb);.  
12ff0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
13000 70 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63  p3(v, OP_ParseSc
13010 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 0a 20 20  hema, iDb, 0,.  
13020 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
13030 72 69 6e 74 66 28 22 6e 61 6d 65 3d 27 25 71 27  rintf("name='%q'
13040 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ", pIndex->zName
13050 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a  ), P3_DYNAMIC);.
13060 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13070 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 45 78 70  eAddOp(v, OP_Exp
13080 69 72 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ire, 0, 0);.    
13090 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  }.  }..  /* When
130a0 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78   adding an index
130b0 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
130c0 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61  indices for a ta
130d0 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  ble, make.  ** s
130e0 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ure all indices 
130f0 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61  labeled OE_Repla
13100 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c  ce come after al
13110 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a  l those labeled.
13120 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20    ** OE_Ignore. 
13130 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
13140 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ry for the corre
13150 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
13160 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20  UPDATE.  ** and 
13170 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69  INSERT..  */.  i
13180 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
13190 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20   || pTblName==0 
131a0 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72  ){.    if( onErr
131b0 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c  or!=OE_Replace |
131c0 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d  | pTab->pIndex==
131d0 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54  0.         || pT
131e0 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ab->pIndex->onEr
131f0 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29  ror==OE_Replace)
13200 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
13210 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49  pNext = pTab->pI
13220 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62  ndex;.      pTab
13230 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
13240 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  x;.    }else{.  
13250 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65      Index *pOthe
13260 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  r = pTab->pIndex
13270 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
13280 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20  Other->pNext && 
13290 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f  pOther->pNext->o
132a0 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
132b0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  ce ){.        pO
132c0 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70  ther = pOther->p
132d0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
132e0 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
132f0 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  t = pOther->pNex
13300 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d  t;.      pOther-
13310 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b  >pNext = pIndex;
13320 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
13330 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  x = 0;.  }..  /*
13340 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65   Clean up before
13350 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74   exiting */.exit
13360 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20  _create_index:. 
13370 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
13380 20 20 20 66 72 65 65 49 6e 64 65 78 28 70 49 6e     freeIndex(pIn
13390 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  dex);.  }.  sqli
133a0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
133b0 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  e(pList);.  sqli
133c0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
133d0 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71  (pTblName);.  sq
133e0 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
133f0 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
13400 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64  .** Fill the Ind
13410 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72  ex.aiRowEst[] ar
13420 72 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74  ray with default
13430 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69   information - i
13440 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f  nformation.** to
13450 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65   be used when we
13460 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68   have not run th
13470 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e  e ANALYZE comman
13480 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73  d..**.** aiRowEs
13490 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 20  t[0] is suppose 
134a0 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
134b0 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
134c0 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  s in the index..
134d0 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e  ** Since we do n
134e0 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31  ot know, guess 1
134f0 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77   million.  aiRow
13500 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74  Est[1] is an est
13510 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  imate of the.** 
13520 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
13530 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
13540 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69   match any parti
13550 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74  cular value of t
13560 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75  he.** first colu
13570 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  mn of the index.
13580 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73    aiRowEst[2] is
13590 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
135a0 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
135b0 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68   rows that match
135c0 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
135d0 63 6f 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20  combiniation of 
135e0 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75  the first 2 colu
135f0 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e  mns.** of the in
13600 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  dex.  And so for
13610 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77  th.  It must alw
13620 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20  ays be the case 
13630 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20  that.*.**       
13640 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c      aiRowEst[N]<
13650 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a  =aiRowEst[N-1].*
13660 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f  *           aiRo
13670 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a  wEst[N]>=1.**.**
13680 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74   Apart from that
13690 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65  , we have little
136a0 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65   to go on beside
136b0 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74  s intuition as t
136c0 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73  o.** how aiRowEs
136d0 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  t[] should be in
136e0 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20  itialized.  The 
136f0 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65  numbers generate
13700 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61  d here.** are ba
13710 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76  sed on typical v
13720 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61  alues found in a
13730 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a  ctual indices..*
13740 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
13750 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65  faultRowEst(Inde
13760 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69  x *pIdx){.  unsi
13770 67 6e 65 64 20 2a 61 20 3d 20 70 49 64 78 2d 3e  gned *a = pIdx->
13780 61 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20  aiRowEst;.  int 
13790 69 3b 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d  i;.  assert( a!=
137a0 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 31 30  0 );.  a[0] = 10
137b0 30 30 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d 70  00000;.  for(i=p
137c0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e  Idx->nColumn; i>
137d0 3d 31 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 61 5b  =1; i--){.    a[
137e0 69 5d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 69  i] = 10;.  }.  i
137f0 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
13800 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20  !=OE_None ){.   
13810 20 61 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   a[pIdx->nColumn
13820 5d 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ] = 1;.  }.}../*
13830 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13840 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78   will drop an ex
13850 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64  isting named ind
13860 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ex.  This routin
13870 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  e.** implements 
13880 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73  the DROP INDEX s
13890 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
138a0 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64  d sqlite3DropInd
138b0 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
138c0 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
138d0 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
138e0 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ex;.  Vdbe *v;. 
138f0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13900 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
13910 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
13920 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
13930 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  _failed ){.    g
13940 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
13950 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  dex;.  }.  asser
13960 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
13970 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  1 );.  if( SQLIT
13980 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
13990 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
139a0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
139b0 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
139c0 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
139d0 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
139e0 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
139f0 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
13a00 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  zDatabase);.  if
13a10 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20  ( pIndex==0 ){. 
13a20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13a30 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
13a40 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20  uch index: %S", 
13a50 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70  pName, 0);.    p
13a60 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
13a70 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  ma = 1;.    goto
13a80 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
13a90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64  ;.  }.  if( pInd
13aa0 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b  ex->autoIndex ){
13ab0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
13ac0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
13ad0 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
13ae0 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20  ith UNIQUE ".   
13af0 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b     "or PRIMARY K
13b00 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  EY constraint ca
13b10 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22  nnot be dropped"
13b20 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  , 0);.    goto e
13b30 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
13b40 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
13b50 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
13b60 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
13b70 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  t code = SQLITE_
13b80 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  DROP_INDEX;.    
13b90 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
13ba0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  ndex->pTable;.  
13bb0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
13bc0 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e 64  b = db->aDb[pInd
13bd0 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  ex->iDb].zName;.
13be0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
13bf0 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
13c00 42 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44 62 29  BLE(pIndex->iDb)
13c10 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
13c20 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
13c30 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
13c40 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20  , zTab, 0, zDb) 
13c50 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
13c60 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
13c70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d     }.    if( !OM
13c80 49 54 5f 54 45 4d 50 44 42 20 26 26 20 70 49 6e  IT_TEMPDB && pIn
13c90 64 65 78 2d 3e 69 44 62 20 29 20 63 6f 64 65 20  dex->iDb ) code 
13ca0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
13cb0 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
13cc0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
13cd0 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
13ce0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
13cf0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
13d00 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
13d10 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
13d20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
13d30 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
13d40 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
13d50 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72  the index and fr
13d60 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
13d70 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ble */.  v = sql
13d80 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
13d90 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
13da0 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 70 49      int iDb = pI
13db0 6e 64 65 78 2d 3e 69 44 62 3b 0a 20 20 20 20 73  ndex->iDb;.    s
13dc0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
13dd0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
13de0 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
13df0 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  .%s WHERE name=%
13e00 51 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61  Q",.       db->a
13e10 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
13e20 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
13e30 2c 0a 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ,.       pIndex-
13e40 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20  >zName.    );.  
13e50 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
13e60 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62  ookie(db, v, iDb
13e70 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  );.    destroyRo
13e80 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
13e90 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  Index->tnum, iDb
13ea0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13eb0 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70  beOp3(v, OP_Drop
13ec0 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 70  Index, iDb, 0, p
13ed0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Index->zName, 0)
13ee0 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70  ;.  }..exit_drop
13ef0 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65  _index:.  sqlite
13f00 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
13f10 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
13f20 70 70 41 72 72 61 79 20 70 6f 69 6e 74 73 20 69  ppArray points i
13f30 6e 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20  nto a structure 
13f40 77 68 65 72 65 20 74 68 65 72 65 20 69 73 20 61  where there is a
13f50 6e 20 61 72 72 61 79 20 70 6f 69 6e 74 65 72 0a  n array pointer.
13f60 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74  ** followed by t
13f70 77 6f 20 69 6e 74 65 67 65 72 73 2e 20 54 68 65  wo integers. The
13f80 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 69   first integer i
13f90 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  s the.** number 
13fa0 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  of elements in t
13fb0 68 65 20 73 74 72 75 63 74 75 72 65 20 61 72 72  he structure arr
13fc0 61 79 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  ay.  The second 
13fd0 69 6e 74 65 67 65 72 0a 2a 2a 20 69 73 20 74 68  integer.** is th
13fe0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f  e number of allo
13ff0 63 61 74 65 64 20 73 6c 6f 74 73 20 69 6e 20 74  cated slots in t
14000 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  he array..**.** 
14010 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
14020 74 68 65 20 73 74 72 75 63 74 75 72 65 20 6c 6f  the structure lo
14030 6f 6b 73 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69  oks something li
14040 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
14050 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 61        struct Exa
14060 6d 70 6c 65 31 20 7b 0a 2a 2a 20 20 20 20 20 20  mple1 {.**      
14070 20 20 20 20 73 74 72 75 63 74 20 73 75 62 45 6c      struct subEl
14080 65 6d 20 2a 61 45 6e 74 72 79 3b 0a 2a 2a 20 20  em *aEntry;.**  
14090 20 20 20 20 20 20 20 20 69 6e 74 20 6e 45 6e 74          int nEnt
140a0 72 79 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ry;.**          
140b0 69 6e 74 20 6e 41 6c 6c 6f 63 3b 0a 2a 2a 20 20  int nAlloc;.**  
140c0 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68        }.**.** Th
140d0 65 20 70 6e 45 6e 74 72 79 20 70 61 72 61 6d 65  e pnEntry parame
140e0 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ter points to th
140f0 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20  e equivalent of 
14100 45 78 61 6d 70 6c 65 31 2e 6e 45 6e 74 72 79 2e  Example1.nEntry.
14110 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
14120 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ine allocates a 
14130 6e 65 77 20 73 6c 6f 74 20 69 6e 20 74 68 65 20  new slot in the 
14140 61 72 72 61 79 2c 20 7a 65 72 6f 73 20 69 74 20  array, zeros it 
14150 6f 75 74 2c 0a 2a 2a 20 61 6e 64 20 72 65 74 75  out,.** and retu
14160 72 6e 73 20 69 74 73 20 69 6e 64 65 78 2e 20 20  rns its index.  
14170 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20  If malloc fails 
14180 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
14190 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  r is returned..*
141a0 2a 0a 2a 2a 20 73 7a 45 6e 74 72 79 20 69 73 20  *.** szEntry is 
141b0 74 68 65 20 73 69 7a 65 6f 66 20 6f 66 20 61 20  the sizeof of a 
141c0 73 69 6e 67 6c 65 20 61 72 72 61 79 20 65 6e 74  single array ent
141d0 72 79 2e 20 20 69 6e 69 74 53 69 7a 65 20 69 73  ry.  initSize is
141e0 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20   the .** number 
141f0 6f 66 20 61 72 72 61 79 20 65 6e 74 72 69 65 73  of array entries
14200 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68   allocated on th
14210 65 20 69 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61  e initial alloca
14220 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
14230 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
14240 65 28 76 6f 69 64 20 2a 2a 70 70 41 72 72 61 79  e(void **ppArray
14250 2c 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 69  , int szEntry, i
14260 6e 74 20 69 6e 69 74 53 69 7a 65 29 7b 0a 20 20  nt initSize){.  
14270 63 68 61 72 20 2a 70 3b 0a 20 20 69 6e 74 20 2a  char *p;.  int *
14280 61 6e 20 3d 20 28 69 6e 74 2a 29 26 70 70 41 72  an = (int*)&ppAr
14290 72 61 79 5b 31 5d 3b 0a 20 20 69 66 28 20 61 6e  ray[1];.  if( an
142a0 5b 30 5d 3e 3d 61 6e 5b 31 5d 20 29 7b 0a 20 20  [0]>=an[1] ){.  
142b0 20 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20    void *pNew;.  
142c0 20 20 69 6e 74 20 6e 65 77 53 69 7a 65 3b 0a 20    int newSize;. 
142d0 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 61 6e 5b     newSize = an[
142e0 31 5d 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b  1]*2 + initSize;
142f0 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
14300 74 65 52 65 61 6c 6c 6f 63 28 2a 70 70 41 72 72  teRealloc(*ppArr
14310 61 79 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e  ay, newSize*szEn
14320 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  try);.    if( pN
14330 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ew==0 ){.      r
14340 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
14350 20 20 20 20 61 6e 5b 31 5d 20 3d 20 6e 65 77 53      an[1] = newS
14360 69 7a 65 3b 0a 20 20 20 20 2a 70 70 41 72 72 61  ize;.    *ppArra
14370 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  y = pNew;.  }.  
14380 70 20 3d 20 2a 70 70 41 72 72 61 79 3b 0a 20 20  p = *ppArray;.  
14390 6d 65 6d 73 65 74 28 26 70 5b 61 6e 5b 30 5d 2a  memset(&p[an[0]*
143a0 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45  szEntry], 0, szE
143b0 6e 74 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20  ntry);.  return 
143c0 61 6e 5b 30 5d 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  an[0]++;.}../*.*
143d0 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65  * Append a new e
143e0 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69  lement to the gi
143f0 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65  ven IdList.  Cre
14400 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74  ate a new IdList
14410 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a   if.** need be..
14420 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69  **.** A new IdLi
14430 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
14440 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f  or NULL if mallo
14450 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64  c() fails..*/.Id
14460 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
14470 69 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74  istAppend(IdList
14480 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
14490 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69  pToken){.  int i
144a0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
144b0 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
144c0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
144d0 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a  zeof(IdList) );.
144e0 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
144f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
14500 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
14510 20 30 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 73 71   0;.  }.  i = sq
14520 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
14530 74 65 28 28 76 6f 69 64 2a 2a 29 26 70 4c 69 73  te((void**)&pLis
14540 74 2d 3e 61 2c 20 73 69 7a 65 6f 66 28 70 4c 69  t->a, sizeof(pLi
14550 73 74 2d 3e 61 5b 30 5d 29 2c 20 35 29 3b 0a 20  st->a[0]), 5);. 
14560 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
14570 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
14580 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
14590 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
145a0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
145b0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
145c0 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29  romToken(pToken)
145d0 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
145e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
145f0 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a  e an IdList..*/.
14600 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69  void sqlite3IdLi
14610 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20  stDelete(IdList 
14620 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
14630 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
14640 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
14650 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
14660 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
14670 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
14680 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  a[i].zName);.  }
14690 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
146a0 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
146b0 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
146c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
146d0 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  e index in pList
146e0 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69   of the identifi
146f0 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52  er named zId.  R
14700 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e  eturn -1.** if n
14710 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  ot found..*/.int
14720 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
14730 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  dex(IdList *pLis
14740 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
14750 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
14760 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
14770 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f   return -1;.  fo
14780 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
14790 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nId; i++){.    i
147a0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
147b0 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
147c0 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
147d0 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
147e0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
147f0 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
14800 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  w table name to 
14810 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73  the given SrcLis
14820 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
14830 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e   SrcList if.** n
14840 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65  eed be.  A new e
14850 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20  ntry is created 
14860 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65  in the SrcList e
14870 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73  ven if pToken is
14880 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e   NULL..**.** A n
14890 65 77 20 53 72 63 4c 69 73 74 20 69 73 20 72 65  ew SrcList is re
148a0 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
148b0 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  if malloc() fail
148c0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74  s..**.** If pDat
148d0 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c  abase is not nul
148e0 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
148f0 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
14900 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61  n optional.** da
14910 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66  tabase name pref
14920 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20  ix.  Like this: 
14930 20 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65   "database.table
14940 22 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73  ".  The pDatabas
14950 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  e.** points to t
14960 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
14970 64 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69  d the pTable poi
14980 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  nts to the datab
14990 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65  ase name..** The
149a0 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61   SrcList.a[].zNa
149b0 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c  me field is fill
149c0 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
149d0 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67  e name which mig
149e0 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20  ht.** come from 
149f0 70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61  pTable (if pData
14a00 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72  base is NULL) or
14a10 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e   from pDatabase.
14a20 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b    .** SrcList.a[
14a30 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66  ].zDatabase is f
14a40 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64  illed with the d
14a50 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f  atabase name fro
14a60 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20  m pTable,.** or 
14a70 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20  with NULL if no 
14a80 64 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63  database is spec
14a90 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ified..**.** In 
14aa0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
14ab0 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  call like this:.
14ac0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
14ad0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
14ae0 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a  nd(A,B,0);.**.**
14af0 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62   Then B is a tab
14b00 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
14b10 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73  database name is
14b20 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49   unspecified.  I
14b30 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65  f called.** like
14b40 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
14b50 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
14b60 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 43 29  istAppend(A,B,C)
14b70 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69  ;.**.** Then C i
14b80 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
14b90 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61   and B is the da
14ba0 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a  tabase name..*/.
14bb0 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
14bc0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72  SrcListAppend(Sr
14bd0 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  cList *pList, To
14be0 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b  ken *pTable, Tok
14bf0 65 6e 20 2a 70 44 61 74 61 62 61 73 65 29 7b 0a  en *pDatabase){.
14c00 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
14c10 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
14c20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
14c30 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
14c40 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
14c50 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20  (SrcList) );.   
14c60 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
14c70 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c  return 0;.    pL
14c80 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b  ist->nAlloc = 1;
14c90 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
14ca0 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e  ->nSrc>=pList->n
14cb0 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63  Alloc ){.    Src
14cc0 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
14cd0 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d  pList->nAlloc *=
14ce0 20 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73   2;.    pNew = s
14cf0 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69  qliteRealloc(pLi
14d00 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
14d10 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74     sizeof(*pList
14d20 29 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c  ) + (pList->nAll
14d30 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69  oc-1)*sizeof(pLi
14d40 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  st->a[0]) );.   
14d50 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
14d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
14d70 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
14d80 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
14d90 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  0;.    }.    pLi
14da0 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  st = pNew;.  }. 
14db0 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
14dc0 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b  >a[pList->nSrc];
14dd0 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c  .  memset(pItem,
14de0 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74   0, sizeof(pList
14df0 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  ->a[0]));.  if( 
14e00 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61  pDatabase && pDa
14e10 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a  tabase->z==0 ){.
14e20 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
14e30 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61  0;.  }.  if( pDa
14e40 74 61 62 61 73 65 20 26 26 20 70 54 61 62 6c 65  tabase && pTable
14e50 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70   ){.    Token *p
14e60 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65  Temp = pDatabase
14e70 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  ;.    pDatabase 
14e80 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54  = pTable;.    pT
14e90 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20  able = pTemp;.  
14ea0 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  }.  pItem->zName
14eb0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
14ec0 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 29 3b  omToken(pTable);
14ed0 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  .  pItem->zDatab
14ee0 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ase = sqlite3Nam
14ef0 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 61 74 61  eFromToken(pData
14f00 62 61 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  base);.  pItem->
14f10 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  iCursor = -1;.  
14f20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20  pList->nSrc++;. 
14f30 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
14f40 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63  ../*.** Assign c
14f50 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61  ursors to all ta
14f60 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73  bles in a SrcLis
14f70 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
14f80 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
14f90 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61  rsors(Parse *pPa
14fa0 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  rse, SrcList *pL
14fb0 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
14fc0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
14fd0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66  item *pItem;.  f
14fe0 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(i=0, pItem=pL
14ff0 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
15000 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
15010 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49  m++){.    if( pI
15020 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20  tem->iCursor>=0 
15030 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 74  ) break;.    pIt
15040 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50  em->iCursor = pP
15050 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
15060 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
15070 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71  lect ){.      sq
15080 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
15090 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
150a0 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
150b0 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 7d 0a 20  ->pSrc);.    }. 
150c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
150d0 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20  an alias to the 
150e0 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65 72 20  last identifier 
150f0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69 64 65  on the given ide
15100 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f  ntifier list..*/
15110 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
15120 4c 69 73 74 41 64 64 41 6c 69 61 73 28 53 72 63  ListAddAlias(Src
15130 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
15140 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69  en *pToken){.  i
15150 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73  f( pList && pLis
15160 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20  t->nSrc>0 ){.   
15170 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d   pList->a[pList-
15180 3e 6e 53 72 63 2d 31 5d 2e 7a 41 6c 69 61 73 20  >nSrc-1].zAlias 
15190 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
151a0 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a  mToken(pToken);.
151b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
151c0 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
151d0 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
151e0 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
151f0 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
15200 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
15210 74 65 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  te(SrcList *pLis
15220 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
15230 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
15240 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
15250 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
15260 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  rn;.  for(pItem=
15270 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
15280 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
15290 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
152a0 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65   sqliteFree(pIte
152b0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
152c0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49     sqliteFree(pI
152d0 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
152e0 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65   sqliteFree(pIte
152f0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
15300 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
15310 6c 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70 54 61  le(0, pItem->pTa
15320 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  b);.    sqlite3S
15330 65 6c 65 63 74 44 65 6c 65 74 65 28 70 49 74 65  electDelete(pIte
15340 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
15350 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
15360 74 65 28 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a  te(pItem->pOn);.
15370 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
15380 74 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70  tDelete(pItem->p
15390 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71  Using);.  }.  sq
153a0 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b  liteFree(pList);
153b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
153c0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
153d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
153e0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  inTransaction(Pa
153f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
15400 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65   type){.  sqlite
15410 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
15420 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66  ;.  int i;..  if
15430 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
15440 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
15450 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  0 || db->aDb[0].
15460 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
15470 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
15480 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
15490 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
154a0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
154b0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
154c0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
154d0 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e  NSACTION, "BEGIN
154e0 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  ", 0, 0) ) retur
154f0 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  n;..  v = sqlite
15500 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
15510 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74  ;.  if( !v ) ret
15520 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21  urn;.  if( type!
15530 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a  =TK_DEFERRED ){.
15540 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
15550 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
15560 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15570 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73  ddOp(v, OP_Trans
15580 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65  action, i, (type
15590 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b  ==TK_EXCLUSIVE)+
155a0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
155b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
155c0 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
155d0 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  t, 0, 0);.}../*.
155e0 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e  ** Commit a tran
155f0 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
15600 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61  sqlite3CommitTra
15610 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
15620 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
15630 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
15640 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  v;..  if( pParse
15650 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
15660 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
15670 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
15680 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
15690 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
156a0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
156b0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
156c0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
156d0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
156e0 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
156f0 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
15700 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76  ) ) return;..  v
15710 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
15720 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
15730 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
15740 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15750 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20  _AutoCommit, 1, 
15760 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
15770 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e   Rollback a tran
15780 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
15790 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54  sqlite3RollbackT
157a0 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
157b0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
157c0 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
157d0 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72   *v;..  if( pPar
157e0 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
157f0 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
15800 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
15810 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
15820 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
15830 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
15840 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
15850 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
15860 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
15870 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
15880 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20  ON, "ROLLBACK", 
15890 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
158a0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
158b0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
158c0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
158d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
158e0 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
158f0 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   1, 1);.  }.}../
15900 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
15910 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  he TEMP database
15920 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61   is open and ava
15930 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20  ilable for use. 
15940 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e   Return.** the n
15950 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
15960 20 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f    Leave any erro
15970 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68  r messages in th
15980 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
15990 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
159a0 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d  t sqlite3OpenTem
159b0 70 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20  pDatabase(Parse 
159c0 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
159d0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
159e0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ->db;.  if( db->
159f0 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26  aDb[1].pBt==0 &&
15a00 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
15a10 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  n ){.    int rc 
15a20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 61  = sqlite3BtreeFa
15a30 63 74 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20  ctory(db, 0, 0, 
15a40 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e  MAX_PAGES, &db->
15a50 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[1].pBt);.   
15a60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15a70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
15a80 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15a90 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f  se, "unable to o
15aa0 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
15ab0 64 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20  database ".     
15ac0 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f     "file for sto
15ad0 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74  ring temporary t
15ae0 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70  ables");.      p
15af0 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a  Parse->rc = rc;.
15b00 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
15b10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
15b20 2d 3e 66 6c 61 67 73 20 26 20 21 64 62 2d 3e 61  ->flags & !db->a
15b30 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  utoCommit ){.   
15b40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
15b50 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 64  treeBeginTrans(d
15b60 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 2c 20 31  b->aDb[1].pBt, 1
15b70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
15b80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15b90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
15ba0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
15bb0 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77  nable to get a w
15bc0 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20  rite lock on ". 
15bd0 20 20 20 20 20 20 20 20 20 22 74 68 65 20 74 65           "the te
15be0 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
15bf0 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20 20 20   file");.       
15c00 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63   pParse->rc = rc
15c10 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
15c20 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
15c30 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
15c40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
15c50 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68  ate VDBE code th
15c60 61 74 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74  at will verify t
15c70 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
15c80 20 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20   and start.** a 
15c90 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
15ca0 20 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64   for all named d
15cb0 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a  atabase files..*
15cc0 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72  *.** It is impor
15cd0 74 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63  tant that all sc
15ce0 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20  hema cookies be 
15cf0 76 65 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c  verified and all
15d00 0a 2a 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63  .** read transac
15d10 74 69 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64  tions be started
15d20 20 62 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67   before anything
15d30 20 65 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e   else happens in
15d40 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f  .** the VDBE pro
15d50 67 72 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20  gram.  But this 
15d60 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63  routine can be c
15d70 61 6c 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68  alled after much
15d80 20 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68   other.** code h
15d90 61 73 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65  as been generate
15da0 64 2e 20 20 53 6f 20 68 65 72 65 20 69 73 20 77  d.  So here is w
15db0 68 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a  hat we do:.**.**
15dc0 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
15dd0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
15de0 63 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20  called, we code 
15df0 61 6e 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a  an OP_Goto that.
15e00 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20  ** will jump to 
15e10 61 20 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20  a subroutine at 
15e20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
15e30 72 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65  rogram.  Then we
15e40 0a 2a 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79  .** record every
15e50 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 6e   database that n
15e60 65 65 64 73 20 69 74 73 20 73 63 68 65 6d 61 20  eeds its schema 
15e70 76 65 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a  verified in the.
15e80 2a 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  ** pParse->cooki
15e90 65 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61  eMask field.  La
15ea0 74 65 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f  ter, after all o
15eb0 74 68 65 72 20 63 6f 64 65 20 68 61 73 20 62 65  ther code has be
15ec0 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c  en.** generated,
15ed0 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
15ee0 74 68 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f  that does the co
15ef0 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f  okie verificatio
15f00 6e 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73  ns and.** starts
15f10 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
15f20 73 20 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20  s will be coded 
15f30 61 6e 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20  and the OP_Goto 
15f40 50 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c  P2 value.** will
15f50 20 62 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e   be made to poin
15f60 74 20 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75  t to that subrou
15f70 74 69 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72  tine.  The gener
15f80 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ation of the.** 
15f90 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74  cookie verificat
15fa0 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63  ion subroutine c
15fb0 6f 64 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73  ode happens in s
15fc0 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
15fd0 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  ng()..**.** If i
15fe0 44 62 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 74  Db<0 then code t
15ff0 68 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20  he OP_Goto only 
16000 2d 20 64 6f 6e 27 74 20 73 65 74 20 66 6c 61 67  - don't set flag
16010 20 74 6f 20 76 65 72 69 66 79 20 74 68 65 0a 2a   to verify the.*
16020 2a 20 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20  * schema on any 
16030 64 61 74 61 62 61 73 65 73 2e 20 20 54 68 69 73  databases.  This
16040 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
16050 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f  position the OP_
16060 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e  Goto.** early in
16070 20 74 68 65 20 63 6f 64 65 2c 20 62 65 66 6f 72   the code, befor
16080 65 20 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79  e we know if any
16090 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 73   database tables
160a0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a   will be used..*
160b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
160c0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50  deVerifySchema(P
160d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
160e0 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65  t iDb){.  sqlite
160f0 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
16100 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20  ;.  int mask;.. 
16110 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
16120 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
16130 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
16140 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20  ;  /* This only 
16150 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 72 65  happens if there
16160 20 77 61 73 20 61 20 70 72 69 6f 72 20 65 72 72   was a prior err
16170 6f 72 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  or */.  db = pPa
16180 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
16190 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
161a0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72  o==0 ){.    pPar
161b0 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d  se->cookieGoto =
161c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
161d0 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
161e0 20 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28   0)+1;.  }.  if(
161f0 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61   iDb>=0 ){.    a
16200 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e  ssert( iDb<db->n
16210 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Db );.    assert
16220 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ( db->aDb[iDb].p
16230 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20  Bt!=0 || iDb==1 
16240 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
16250 44 62 3c 33 32 20 29 3b 0a 20 20 20 20 6d 61 73  Db<32 );.    mas
16260 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 20 20  k = 1<<iDb;.    
16270 69 66 28 20 28 70 50 61 72 73 65 2d 3e 63 6f 6f  if( (pParse->coo
16280 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d  kieMask & mask)=
16290 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  =0 ){.      pPar
162a0 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c  se->cookieMask |
162b0 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 50  = mask;.      pP
162c0 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75  arse->cookieValu
162d0 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62  e[iDb] = db->aDb
162e0 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f  [iDb].schema_coo
162f0 6b 69 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21  kie;.      if( !
16300 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
16310 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
16320 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
16330 44 61 74 61 62 61 73 65 28 70 50 61 72 73 65 29  Database(pParse)
16340 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16350 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
16360 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
16370 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f  that prepares fo
16380 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61  r doing an opera
16390 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67  tion that.** mig
163a0 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61  ht change the da
163b0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
163c0 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74  is routine start
163d0 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  s a new transact
163e0 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f  ion if we are no
163f0 74 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  t already within
16400 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f  .** a transactio
16410 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c  n.  If we are al
16420 72 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74  ready within a t
16430 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
16440 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a   a checkpoint.**
16450 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73   is set if the s
16460 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61  etStatement para
16470 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20  meter is true.  
16480 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f  A checkpoint sho
16490 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f  uld.** be set fo
164a0 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61  r operations tha
164b0 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75  t might fail (du
164c0 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e  e to a constrain
164d0 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  t) part of.** th
164e0 65 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e  e way through an
164f0 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65  d which will nee
16500 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77  d to undo some w
16510 72 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61  rites without ha
16520 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62  ving to.** rollb
16530 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72  ack the whole tr
16540 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20  ansaction.  For 
16550 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65  operations where
16560 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73   all constraints
16570 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b  .** can be check
16580 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68  ed before any ch
16590 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
165a0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  o the database, 
165b0 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e  it is never.** n
165c0 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f  ecessary to undo
165d0 20 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65   a write and the
165e0 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
165f0 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a  ld not be set..*
16600 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61  *.** Only databa
16610 73 65 20 69 44 62 20 61 6e 64 20 74 68 65 20 74  se iDb and the t
16620 65 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65  emp database are
16630 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 62   made writable b
16640 79 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20  y this call..** 
16650 49 66 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20  If iDb==0, then 
16660 74 68 65 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d  the main and tem
16670 70 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  p databases are 
16680 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20  made writable.  
16690 20 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68   If.** iDb==1 th
166a0 65 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70  en only the temp
166b0 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 61 64   database is mad
166c0 65 20 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20  e writable.  If 
166d0 69 44 62 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a  iDb>1 then the.*
166e0 2a 20 73 70 65 63 69 66 69 65 64 20 61 75 78 69  * specified auxi
166f0 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 61  liary database a
16700 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  nd the temp data
16710 62 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72  base are made wr
16720 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  itable..*/.void 
16730 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
16740 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65  eOperation(Parse
16750 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65   *pParse, int se
16760 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20  tStatement, int 
16770 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  iDb){.  Vdbe *v 
16780 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
16790 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
167a0 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
167b0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
167c0 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
167d0 20 69 44 62 29 3b 0a 20 20 70 50 61 72 73 65 2d   iDb);.  pParse-
167e0 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c  >writeMask |= 1<
167f0 3c 69 44 62 3b 0a 20 20 69 66 28 20 73 65 74 53  <iDb;.  if( setS
16800 74 61 74 65 6d 65 6e 74 20 26 26 20 70 50 61 72  tatement && pPar
16810 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b  se->nested==0 ){
16820 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16830 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74  AddOp(v, OP_Stat
16840 65 6d 65 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a  ement, iDb, 0);.
16850 20 20 7d 0a 20 20 69 66 28 20 28 4f 4d 49 54 5f    }.  if( (OMIT_
16860 54 45 4d 50 44 42 20 7c 7c 20 69 44 62 21 3d 31  TEMPDB || iDb!=1
16870 29 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d  ) && pParse->db-
16880 3e 61 44 62 5b 31 5d 2e 70 42 74 21 3d 30 20 29  >aDb[1].pBt!=0 )
16890 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
168a0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
168b0 28 70 50 61 72 73 65 2c 20 73 65 74 53 74 61 74  (pParse, setStat
168c0 65 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d  ement, 1);.  }.}
168d0 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
168e0 20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75   see if pIndex u
168f0 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  ses the collatin
16900 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
16910 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
16920 65 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64  e if it does and
16930 20 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65   false if it doe
16940 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  s not..*/.#ifnde
16950 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
16960 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74  INDEX.static int
16970 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
16980 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 20  CollSeq *pColl, 
16990 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a  Index *pIndex){.
169a0 20 20 69 6e 74 20 6e 20 3d 20 70 49 6e 64 65 78    int n = pIndex
169b0 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64  ->keyInfo.nField
169c0 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 70 70  ;.  CollSeq **pp
169d0 20 3d 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e   = pIndex->keyIn
169e0 66 6f 2e 61 43 6f 6c 6c 3b 0a 20 20 77 68 69 6c  fo.aColl;.  whil
169f0 65 28 20 6e 2d 2d 20 29 7b 0a 20 20 20 20 69 66  e( n-- ){.    if
16a00 28 20 2a 70 70 3d 3d 70 43 6f 6c 6c 20 29 20 72  ( *pp==pColl ) r
16a10 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 70 70 2b  eturn 1;.    pp+
16a20 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
16a30 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
16a40 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c  ** Recompute all
16a50 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62   indices of pTab
16a60 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63 6f   that use the co
16a70 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
16a80 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43   pColl..** If pC
16a90 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
16aa0 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
16ab0 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69  s of pTab..*/.#i
16ac0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16ad0 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
16ae0 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62   void reindexTab
16af0 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
16b00 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 43  , Table *pTab, C
16b10 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a  ollSeq *pColl){.
16b20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
16b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16b40 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
16b50 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
16b60 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d  /..  for(pIndex=
16b70 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
16b80 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e  ndex; pIndex=pIn
16b90 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  dex->pNext){.   
16ba0 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 7c 7c   if( pColl==0 ||
16bb0 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
16bc0 70 43 6f 6c 6c 2c 70 49 6e 64 65 78 29 20 29 7b  pColl,pIndex) ){
16bd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
16be0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
16bf0 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 61  n(pParse, 0, pTa
16c00 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 73  b->iDb);.      s
16c10 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
16c20 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
16c30 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , -1);.    }.  }
16c40 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
16c50 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
16c60 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61  ndices of all ta
16c70 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  bles in all data
16c80 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a  bases where the.
16c90 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74  ** indices use t
16ca0 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
16cb0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66  uence pColl.  If
16cc0 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
16cd0 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20  ecompute.** all 
16ce0 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65  indices everywhe
16cf0 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  re..*/.#ifndef S
16d00 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
16d10 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  EX.static void r
16d20 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
16d30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 43  Parse *pParse, C
16d40 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a  ollSeq *pColl){.
16d50 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
16d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16d70 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   A single databa
16d80 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
16d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16da0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
16db0 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
16dc0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
16dd0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
16de0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
16df0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
16e00 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20    HashElem *k;  
16e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16e20 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
16e30 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20  r tables in pDb 
16e40 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
16e50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16e60 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
16e70 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a  he database */..
16e80 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62    for(iDb=0, pDb
16e90 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62  =db->aDb; iDb<db
16ea0 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44  ->nDb; iDb++, pD
16eb0 62 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 44  b++){.    if( pD
16ec0 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==0 ) continue;
16ed0 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74  .    for(k=sqlit
16ee0 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d  eHashFirst(&pDb-
16ef0 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b  >tblHash);  k; k
16f00 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
16f10 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  k)){.      pTab 
16f20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65  = (Table*)sqlite
16f30 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20  HashData(k);.   
16f40 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
16f50 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 43  pParse, pTab, pC
16f60 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  oll);.    }.  }.
16f70 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
16f80 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
16f90 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f  r the REINDEX co
16fa0 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  mmand..**.**    
16fb0 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20      REINDEX     
16fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fd0 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20         -- 1.**  
16fe0 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c        REINDEX  <
16ff0 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20  collation>      
17000 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a           -- 2.**
17010 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
17020 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74   ?<database>.?<t
17030 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a  ablename>  -- 3.
17040 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
17050 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
17060 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20  <indexname>  -- 
17070 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63  4.**.** Form 1 c
17080 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65  auses all indice
17090 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65  s in all attache
170a0 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62  d databases to b
170b0 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f  e rebuilt..** Fo
170c0 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c  rm 2 rebuilds al
170d0 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
170e0 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
170f0 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a  use the named.**
17100 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
17110 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e  ion.  Forms 3 an
17120 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20  d 4 rebuild the 
17130 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61  named index or a
17140 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73  ll.** indices as
17150 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
17160 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a  e named table..*
17170 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
17180 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f  _OMIT_REINDEX.vo
17190 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65  id sqlite3Reinde
171a0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
171b0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
171c0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a  Token *pName2){.
171d0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
171e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
171f0 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
17200 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65  nce to be reinde
17210 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  xed, or NULL */.
17220 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
17230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17240 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65   Name of a table
17250 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63   or index */.  c
17260 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20  onst char *zDb; 
17270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
17280 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
17290 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  se */.  Table *p
172a0 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
172b0 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
172c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
172d0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
172e0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
172f0 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f  /* An index asso
17300 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62  ciated with pTab
17310 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
17320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17330 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
17340 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
17350 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
17360 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
17370 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
17380 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
17390 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b  Token *pObjName;
173a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
173b0 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
173c0 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20   or index to be 
173d0 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20  reindexed */..  
173e0 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
173f0 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
17400 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
17410 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
17420 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
17430 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
17440 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
17450 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
17460 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
17470 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
17480 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
17490 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d  }..  if( pName1=
174a0 3d 30 20 7c 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d  =0 || pName1->z=
174b0 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  =0 ){.    reinde
174c0 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
174d0 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  e, 0);.    retur
174e0 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  n;.  }else if( p
174f0 4e 61 6d 65 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d  Name2==0 || pNam
17500 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  e2->z==0 ){.    
17510 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
17520 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 64  indCollSeq(db, d
17530 62 2d 3e 65 6e 63 2c 20 70 4e 61 6d 65 31 2d 3e  b->enc, pName1->
17540 7a 2c 20 70 4e 61 6d 65 31 2d 3e 6e 2c 20 30 29  z, pName1->n, 0)
17550 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
17560 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78  ){.      reindex
17570 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65  Databases(pParse
17580 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , pColl);.      
17590 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
175a0 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
175b0 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
175c0 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
175d0 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b  me2, &pObjName);
175e0 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72  .  if( iDb<0 ) r
175f0 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c  eturn;.  z = sql
17600 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
17610 6e 28 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 7a  n(pObjName);.  z
17620 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
17630 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20  ].zName;.  pTab 
17640 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
17650 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a  le(db, z, zDb);.
17660 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
17670 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70    reindexTable(p
17680 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b  Parse, pTab, 0);
17690 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
176a0 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  z);.    return;.
176b0 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
176c0 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
176d0 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73  db, z, zDb);.  s
176e0 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
176f0 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
17700 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
17710 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
17720 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
17730 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
17740 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
17750 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  dex, -1);.    re
17760 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
17770 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
17780 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69  se, "unable to i
17790 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65  dentify the obje
177a0 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ct to be reindex
177b0 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a     ed");.}.#endif.