/ Hex Artifact Content
Login

Artifact a055974683ddc465bdc8669d43d6ab35d3dbb55f:


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 37 38 20 32 30 30 36 2f 30 31 2f 31 32  1.378 2006/01/12
02f0: 20 30 31 3a 35 36 3a 34 34 20 64 72 68 20 45 78   01:56:44 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 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
0430: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0440: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20  CACHE./*.** The 
0450: 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63 74  TableLock struct
0460: 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ure is only used
0470: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 54   by the sqlite3T
0480: 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a 2a  ableLock() and.*
0490: 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73  * codeTableLocks
04a0: 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  () functions..*/
04b0: 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f 63  .struct TableLoc
04c0: 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20  k {.  int iDb;. 
04d0: 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 75 38 20   int iTab;.  u8 
04e0: 69 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 63  isWriteLock;.  c
04f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
0500: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 76 65  ;.};../*.** Have
0510: 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 73 74   the compiled st
0520: 61 74 65 6d 65 6e 74 20 6c 6f 63 6b 20 74 68 65  atement lock the
0530: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
0540: 70 61 67 65 20 69 54 61 62 20 69 6e 20 64 61 74  page iTab in dat
0550: 61 62 61 73 65 0a 2a 2a 20 69 44 62 20 61 74 20  abase.** iDb at 
0560: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
0570: 20 6c 65 76 65 6c 20 77 68 65 6e 20 65 78 65 63   level when exec
0580: 75 74 65 64 2e 20 54 68 65 20 69 73 57 72 69 74  uted. The isWrit
0590: 65 4c 6f 63 6b 20 61 72 67 75 6d 65 6e 74 20 0a  eLock argument .
05a0: 2a 2a 20 69 73 20 7a 65 72 6f 20 66 6f 72 20 61  ** is zero for a
05b0: 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 6f 72 20 6e   read-lock, or n
05c0: 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 20 77 72  on-zero for a wr
05d0: 69 74 65 2d 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ite-lock..**.** 
05e0: 54 68 65 20 7a 4e 61 6d 65 20 70 61 72 61 6d 65  The zName parame
05f0: 74 65 72 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74  ter should point
0600: 20 74 6f 20 74 68 65 20 75 6e 71 75 61 6c 69 66   to the unqualif
0610: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ied table name. 
0620: 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20  This is.** used 
0630: 74 6f 20 70 72 6f 76 69 64 65 20 61 20 6d 6f 72  to provide a mor
0640: 65 20 69 6e 66 6f 72 6d 61 74 69 76 65 20 65 72  e informative er
0650: 72 6f 72 20 6d 65 73 73 61 67 65 20 73 68 6f 75  ror message shou
0660: 6c 64 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c  ld the lock fail
0670: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0680: 33 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61  3TableLock(.  Pa
0690: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
06a0: 69 6e 74 20 69 44 62 2c 20 0a 20 20 69 6e 74 20  int iDb, .  int 
06b0: 69 54 61 62 2c 20 0a 20 20 75 38 20 69 73 57 72  iTab, .  u8 isWr
06c0: 69 74 65 4c 6f 63 6b 2c 20 20 0a 20 20 63 6f 6e  iteLock,  .  con
06d0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
06e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
06f0: 20 6e 42 79 74 65 73 3b 0a 20 20 54 61 62 6c 65   nBytes;.  Table
0700: 4c 6f 63 6b 20 2a 70 3b 0a 0a 20 20 69 66 28 20  Lock *p;..  if( 
0710: 30 3d 3d 73 71 6c 69 74 65 33 54 68 72 65 61 64  0==sqlite3Thread
0720: 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 2d 3e  DataReadOnly()->
0730: 75 73 65 53 68 61 72 65 64 44 61 74 61 20 7c 7c  useSharedData ||
0740: 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 65   iDb<0 ){.    re
0750: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  turn;.  }..  for
0760: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
0770: 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29  nTableLock; i++)
0780: 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73  {.    p = &pPars
0790: 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d  e->aTableLock[i]
07a0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44 62  ;.    if( p->iDb
07b0: 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61 62  ==iDb && p->iTab
07c0: 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ==iTab ){.      
07d0: 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d  p->isWriteLock =
07e0: 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b   (p->isWriteLock
07f0: 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b 29   || isWriteLock)
0800: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
0810: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42 79      }.  }..  nBy
0820: 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61 62  tes = sizeof(Tab
0830: 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 50 61 72 73  leLock) * (pPars
0840: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31 29  e->nTableLock+1)
0850: 3b 0a 20 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  ;.  sqliteReallo
0860: 63 4f 72 46 72 65 65 28 28 76 6f 69 64 20 2a 2a  cOrFree((void **
0870: 29 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65  )&pParse->aTable
0880: 4c 6f 63 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20  Lock, nBytes);. 
0890: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 54 61   if( pParse->aTa
08a0: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
08b0: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
08c0: 6c 65 4c 6f 63 6b 5b 70 50 61 72 73 65 2d 3e 6e  leLock[pParse->n
08d0: 54 61 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20  TableLock++];.  
08e0: 20 20 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a    p->iDb = iDb;.
08f0: 20 20 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54      p->iTab = iT
0900: 61 62 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69  ab;.    p->isWri
0910: 74 65 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65  teLock = isWrite
0920: 4c 6f 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4e 61  Lock;.    p->zNa
0930: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  me = zName;.  }.
0940: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
0950: 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e   OP_TableLock in
0960: 73 74 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61  struction for ea
0970: 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20  ch table locked 
0980: 62 79 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d  by the.** statem
0990: 65 6e 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20  ent (configured 
09a0: 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  by calls to sqli
09b0: 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e  te3TableLock()).
09c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
09d0: 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50  codeTableLocks(P
09e0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
09f0: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a   int i;.  Vdbe *
0a00: 70 56 64 62 65 3b 20 0a 20 20 61 73 73 65 72 74  pVdbe; .  assert
0a10: 28 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  ( sqlite3ThreadD
0a20: 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 75  ataReadOnly()->u
0a30: 73 65 53 68 61 72 65 64 44 61 74 61 20 7c 7c 20  seSharedData || 
0a40: 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f  pParse->nTableLo
0a50: 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  ck==0 );..  if( 
0a60: 30 3d 3d 28 70 56 64 62 65 20 3d 20 73 71 6c 69  0==(pVdbe = sqli
0a70: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
0a80: 65 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e)) ){.    retur
0a90: 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  n;.  }..  for(i=
0aa0: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61  0; i<pParse->nTa
0ab0: 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20  bleLock; i++){. 
0ac0: 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 20     TableLock *p 
0ad0: 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c  = &pParse->aTabl
0ae0: 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69 6e  eLock[i];.    in
0af0: 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a 20  t p1 = p->iDb;. 
0b00: 20 20 20 69 66 28 20 70 2d 3e 69 73 57 72 69 74     if( p->isWrit
0b10: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 70  eLock ){.      p
0b20: 31 20 3d 20 2d 31 2a 28 70 31 2b 31 29 3b 0a 20  1 = -1*(p1+1);. 
0b30: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
0b40: 56 64 62 65 4f 70 33 28 70 56 64 62 65 2c 20 4f  VdbeOp3(pVdbe, O
0b50: 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c  P_TableLock, p1,
0b60: 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e 7a 4e 61   p->iTab, p->zNa
0b70: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
0b80: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64    }.}.#else.  #d
0b90: 65 66 69 6e 65 20 63 6f 64 65 54 61 62 6c 65 4c  efine codeTableL
0ba0: 6f 63 6b 73 28 78 29 0a 23 65 6e 64 69 66 0a 0a  ocks(x).#endif..
0bb0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0bc0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0bd0: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0be0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0bf0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0c00: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0c10: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0c20: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0c30: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0c40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0c50: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0c60: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0c70: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0c80: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0c90: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0ca0: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0cb0: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0cc0: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0cd0: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0ce0: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0cf0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0d00: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0d10: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0d20: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0d30: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0d40: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
0d50: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69  .  Vdbe *v;..  i
0d60: 66 28 20 73 71 6c 69 74 65 33 54 68 72 65 61 64  f( sqlite3Thread
0d70: 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 2d 3e  DataReadOnly()->
0d80: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
0d90: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
0da0: 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20 72 65  rse->nested ) re
0db0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 61  turn;.  if( !pPa
0dc0: 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20  rse->pVdbe ){.  
0dd0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63    if( pParse->rc
0de0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
0df0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
0e00: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
0e10: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
0e20: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
0e30: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
0e40: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
0e50: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
0e60: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
0e70: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
0e80: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
0e90: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
0ea0: 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ;.  v = sqlite3G
0eb0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
0ec0: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
0ed0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
0ee0: 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 30 2c 20 30  v, OP_Halt, 0, 0
0ef0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
0f00: 6f 6f 6b 69 65 20 6d 61 73 6b 20 63 6f 6e 74 61  ookie mask conta
0f10: 69 6e 73 20 6f 6e 65 20 62 69 74 20 66 6f 72 20  ins one bit for 
0f20: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69  each database fi
0f30: 6c 65 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a 20  le open..    ** 
0f40: 28 42 69 74 20 30 20 69 73 20 66 6f 72 20 6d 61  (Bit 0 is for ma
0f50: 69 6e 2c 20 62 69 74 20 31 20 69 73 20 66 6f 72  in, bit 1 is for
0f60: 20 74 65 6d 70 2c 20 61 6e 64 20 73 6f 20 66 6f   temp, and so fo
0f70: 72 74 68 2e 29 20 20 42 69 74 73 20 61 72 65 0a  rth.)  Bits are.
0f80: 20 20 20 20 2a 2a 20 73 65 74 20 66 6f 72 20 65      ** set for e
0f90: 61 63 68 20 64 61 74 61 62 61 73 65 20 74 68 61  ach database tha
0fa0: 74 20 69 73 20 75 73 65 64 2e 20 20 47 65 6e 65  t is used.  Gene
0fb0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 74 61  rate code to sta
0fc0: 72 74 20 61 0a 20 20 20 20 2a 2a 20 74 72 61 6e  rt a.    ** tran
0fd0: 73 61 63 74 69 6f 6e 20 6f 6e 20 65 61 63 68 20  saction on each 
0fe0: 75 73 65 64 20 64 61 74 61 62 61 73 65 20 61 6e  used database an
0ff0: 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 65 20  d to verify the 
1000: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 20 20  schema cookie.  
1010: 20 20 2a 2a 20 6f 6e 20 65 61 63 68 20 75 73 65    ** on each use
1020: 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  d database..    
1030: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  */.    if( pPars
1040: 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3e 30 20  e->cookieGoto>0 
1050: 29 7b 0a 20 20 20 20 20 20 75 33 32 20 6d 61 73  ){.      u32 mas
1060: 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  k;.      int iDb
1070: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1080: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
1090: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
10a0: 6f 2d 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  o-1);.      for(
10b0: 69 44 62 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69  iDb=0, mask=1; i
10c0: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b  Db<db->nDb; mask
10d0: 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29 7b 0a 20 20  <<=1, iDb++){.  
10e0: 20 20 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20        if( (mask 
10f0: 26 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  & pParse->cookie
1100: 4d 61 73 6b 29 3d 3d 30 20 29 20 63 6f 6e 74 69  Mask)==0 ) conti
1110: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nue;.        sql
1120: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1130: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
1140: 20 69 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50   iDb, (mask & pP
1150: 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29  arse->writeMask)
1160: 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  !=0);.        sq
1170: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1180: 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69  , OP_VerifyCooki
1190: 65 2c 20 69 44 62 2c 20 70 50 61 72 73 65 2d 3e  e, iDb, pParse->
11a0: 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d  cookieValue[iDb]
11b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
11c0: 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20 74 68    /* Once all th
11d0: 65 20 63 6f 6f 6b 69 65 73 20 68 61 76 65 20 62  e cookies have b
11e0: 65 65 6e 20 76 65 72 69 66 69 65 64 20 61 6e 64  een verified and
11f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70   transactions op
1200: 65 6e 65 64 2c 20 0a 20 20 20 20 20 20 2a 2a 20  ened, .      ** 
1210: 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71 75 69  obtain the requi
1220: 72 65 64 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 2e  red table-locks.
1230: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
1240: 20 75 6e 6c 65 73 73 20 74 68 65 20 0a 20 20 20   unless the .   
1250: 20 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63     ** shared-cac
1260: 68 65 20 66 65 61 74 75 72 65 20 69 73 20 65 6e  he feature is en
1270: 61 62 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  abled..      */.
1280: 20 20 20 20 20 20 63 6f 64 65 54 61 62 6c 65 4c        codeTableL
1290: 6f 63 6b 73 28 70 50 61 72 73 65 29 3b 0a 20 20  ocks(pParse);.  
12a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
12c0: 20 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b   0, pParse->cook
12d0: 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a  ieGoto);.    }..
12e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12f0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a  MIT_TRACE.    /*
1300: 20 41 64 64 20 61 20 4e 6f 2d 6f 70 20 74 68 61   Add a No-op tha
1310: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63  t contains the c
1320: 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
1330: 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 53 51 4c  the compiled SQL
1340: 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
1350: 74 20 61 73 20 69 74 73 20 50 33 20 61 72 67 75  t as its P3 argu
1360: 6d 65 6e 74 2e 20 20 54 68 69 73 20 64 6f 65 73  ment.  This does
1370: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
1380: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 0a 20 20  functionality.  
1390: 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 6f 67    ** of the prog
13a0: 72 61 6d 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ram. .    **.   
13b0: 20 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 64   ** This is used
13c0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71   to implement sq
13d0: 6c 69 74 65 33 5f 74 72 61 63 65 28 29 2e 0a 20  lite3_trace().. 
13e0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
13f0: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4e  3VdbeOp3(v, OP_N
1400: 6f 6f 70 2c 20 30 2c 20 30 2c 20 70 50 61 72 73  oop, 0, 0, pPars
1410: 65 2d 3e 7a 53 71 6c 2c 20 70 50 61 72 73 65 2d  e->zSql, pParse-
1420: 3e 7a 54 61 69 6c 2d 70 50 61 72 73 65 2d 3e 7a  >zTail-pParse->z
1430: 53 71 6c 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  Sql);.#endif /* 
1440: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
1450: 45 20 2a 2f 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  E */.  }...  /* 
1460: 47 65 74 20 74 68 65 20 56 44 42 45 20 70 72 6f  Get the VDBE pro
1470: 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65  gram ready for e
1480: 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20  xecution.  */.  
1490: 69 66 28 20 76 20 26 26 20 70 50 61 72 73 65 2d  if( v && pParse-
14a0: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
14b0: 46 49 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64  FILE *trace = (d
14c0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
14d0: 45 5f 56 64 62 65 54 72 61 63 65 29 21 3d 30 20  E_VdbeTrace)!=0 
14e0: 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20  ? stdout : 0;.  
14f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61    sqlite3VdbeTra
1500: 63 65 28 76 2c 20 74 72 61 63 65 29 3b 0a 20 20  ce(v, trace);.  
1510: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b    sqlite3VdbeMak
1520: 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73 65  eReady(v, pParse
1530: 2d 3e 6e 56 61 72 2c 20 70 50 61 72 73 65 2d 3e  ->nVar, pParse->
1540: 6e 4d 65 6d 2b 33 2c 0a 20 20 20 20 20 20 20 20  nMem+3,.        
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 33 2c   pParse->nTab+3,
1570: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
1580: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  );.    pParse->r
1590: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
15a0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  .    pParse->col
15b0: 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20  NamesSet = 0;.  
15c0: 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 73 65  }else if( pParse
15d0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
15e0: 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  ){.    pParse->r
15f0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1600: 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
1610: 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72  nTab = 0;.  pPar
1620: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20  se->nMem = 0;.  
1630: 70 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30  pParse->nSet = 0
1640: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  ;.  pParse->nVar
1650: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
1660: 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30 3b 0a  cookieMask = 0;.
1670: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
1680: 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Goto = 0;.}../*.
1690: 2a 2a 20 52 75 6e 20 74 68 65 20 70 61 72 73 65  ** Run the parse
16a0: 72 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  r and code gener
16b0: 61 74 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79  ator recursively
16c0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e   in order to gen
16d0: 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f  erate.** code fo
16e0: 72 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  r the SQL statem
16f0: 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74  ent given onto t
1700: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50  he end of the pP
1710: 61 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20  arse context.** 
1720: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
1730: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57  construction.  W
1740: 68 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 69  hen the parser i
1750: 73 20 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c  s run recursivel
1760: 79 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74  y.** this way, t
1770: 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74  he final OP_Halt
1780: 20 69 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64   is not appended
1790: 20 61 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69   and other initi
17a0: 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64  alization.** and
17b0: 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74   finalization st
17c0: 65 70 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20  eps are omitted 
17d0: 62 65 63 61 75 73 65 20 74 68 6f 73 65 20 61 72  because those ar
17e0: 65 20 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68  e handling by th
17f0: 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70  e.** outermost p
1800: 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  arser..**.** Not
1810: 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e   everything is n
1820: 65 73 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66  estable.  This f
1830: 61 63 69 6c 69 74 79 20 69 73 20 64 65 73 69 67  acility is desig
1840: 6e 65 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a  ned to permit.**
1850: 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c   INSERT, UPDATE,
1860: 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72   and DELETE oper
1870: 61 74 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53  ations against S
1880: 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55  QLITE_MASTER.  U
1890: 73 65 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f  se.** care if yo
18a0: 75 20 64 65 63 69 64 65 20 74 6f 20 74 72 79 20  u decide to try 
18b0: 74 6f 20 75 73 65 20 74 68 69 73 20 72 6f 75 74  to use this rout
18c0: 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  ine for some oth
18d0: 65 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a  er purposes..*/.
18e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74  void sqlite3Nest
18f0: 65 64 50 61 72 73 65 28 50 61 72 73 65 20 2a 70  edParse(Parse *p
1900: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
1910: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
1920: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
1930: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 23 20    char *zSql;.# 
1940: 64 65 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20  define SAVE_SZ  
1950: 28 73 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d  (sizeof(Parse) -
1960: 20 6f 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c   offsetof(Parse,
1970: 6e 56 61 72 29 29 0a 20 20 63 68 61 72 20 73 61  nVar)).  char sa
1980: 76 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a  veBuf[SAVE_SZ];.
1990: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
19a0: 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Err ) return;.  
19b0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
19c0: 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a  nested<10 );  /*
19d0: 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20   Nesting should 
19e0: 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74  only be of limit
19f0: 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61  ed depth */.  va
1a00: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
1a10: 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  at);.  zSql = sq
1a20: 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 7a 46  lite3VMPrintf(zF
1a30: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
1a40: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20  _end(ap);.  if( 
1a50: 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  zSql==0 ){.    r
1a60: 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61  eturn;   /* A ma
1a70: 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
1a80: 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70  ailed */.  }.  p
1a90: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b  Parse->nested++;
1aa0: 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75  .  memcpy(saveBu
1ab0: 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72  f, &pParse->nVar
1ac0: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65  , SAVE_SZ);.  me
1ad0: 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56  mset(&pParse->nV
1ae0: 61 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b  ar, 0, SAVE_SZ);
1af0: 0a 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72  .  sqlite3RunPar
1b00: 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c  ser(pParse, zSql
1b10: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  , 0);.  sqliteFr
1b20: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63  ee(zSql);.  memc
1b30: 70 79 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72  py(&pParse->nVar
1b40: 2c 20 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f  , saveBuf, SAVE_
1b50: 53 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  SZ);.  pParse->n
1b60: 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a  ested--;.}../*.*
1b70: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
1b80: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
1b90: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
1ba0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
1bb0: 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67  abase.** table g
1bc0: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
1bd0: 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   that table and 
1be0: 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65  (optionally) the
1bf0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
1c00: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
1c10: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20  ing the table.  
1c20: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
1c30: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  ot found..**.** 
1c40: 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20  If zDatabase is 
1c50: 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  0, all databases
1c60: 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f   are searched fo
1c70: 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  r the table and 
1c80: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74  the.** first mat
1c90: 63 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72  ching table is r
1ca0: 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68  eturned.  (No ch
1cb0: 65 63 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69  ecking for dupli
1cc0: 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61  cate table.** na
1cd0: 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54  mes is done.)  T
1ce0: 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20  he search order 
1cf0: 69 73 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74  is TEMP first, t
1d00: 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61  hen MAIN, then a
1d10: 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20  ny.** auxiliary 
1d20: 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64 20  databases added 
1d30: 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48  using the ATTACH
1d40: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
1d50: 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
1d60: 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a  LocateTable()..*
1d70: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
1d80: 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65  FindTable(sqlite
1d90: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1da0: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
1db0: 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29  char *zDatabase)
1dc0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30  {.  Table *p = 0
1dd0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
1de0: 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29 3b  ert( zName!=0 );
1df0: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
1e00: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
1e10: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
1e20: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
1e30: 20 69 3b 20 20 20 2f 2a 20 53 65 61 72 63 68 20   i;   /* Search 
1e40: 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e  TEMP before MAIN
1e50: 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 61 74   */.    if( zDat
1e60: 61 62 61 73 65 21 3d 30 20 26 26 20 73 71 6c 69  abase!=0 && sqli
1e70: 74 65 33 53 74 72 49 43 6d 70 28 7a 44 61 74 61  te3StrICmp(zData
1e80: 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d  base, db->aDb[j]
1e90: 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e  .zName) ) contin
1ea0: 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  ue;.    p = sqli
1eb0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
1ec0: 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d  >aDb[j].pSchema-
1ed0: 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >tblHash, zName,
1ee0: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
1ef0: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62  );.    if( p ) b
1f00: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
1f10: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn p;.}../*.** L
1f20: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
1f30: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
1f40: 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70  at describes a p
1f50: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
1f60: 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65  se.** table give
1f70: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
1f80: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
1f90: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
1fa0: 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  me of the.** dat
1fb0: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
1fc0: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
1fd0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
1fe0: 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61  found.  Also lea
1ff0: 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d  ve an.** error m
2000: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
2010: 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
2020: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
2030: 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
2040: 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33  tine and sqlite3
2050: 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73 20 74  FindTable() is t
2060: 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hat this.** rout
2070: 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72  ine leaves an er
2080: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
2090: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77  Parse->zErrMsg w
20a0: 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46  here.** sqlite3F
20b0: 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20  indTable() does 
20c0: 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  not..*/.Table *s
20d0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
20e0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
20f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2100: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
2110: 7a 44 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  zDbase){.  Table
2120: 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20   *p;..  /* Read 
2130: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
2140: 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ema. If an error
2150: 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
2160: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
2170: 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e    ** and code in
2180: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
2190: 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66  rn NULL. */.  if
21a0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
21b0: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
21c0: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
21d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70  turn 0;.  }..  p
21e0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
21f0: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
2200: 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a  zName, zDbase);.
2210: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
2220: 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a    if( zDbase ){.
2230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2240: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
2250: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
2260: 2e 25 73 22 2c 20 7a 44 62 61 73 65 2c 20 7a 4e  .%s", zDbase, zN
2270: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
2280: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
2290: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
22a0: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
22b0: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
22c0: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
22d0: 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
22e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
22f0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
2300: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
2310: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
2320: 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74  ribes .** a part
2330: 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76  icular index giv
2340: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
2350: 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64  hat index.** and
2360: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
2370: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63   database that c
2380: 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65  ontains the inde
2390: 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c  x..** Return NUL
23a0: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
23b0: 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61  **.** If zDataba
23c0: 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74  se is 0, all dat
23d0: 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63  abases are searc
23e0: 68 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74  hed for the.** t
23f0: 61 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72  able and the fir
2400: 73 74 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65  st matching inde
2410: 78 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  x is returned.  
2420: 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  (No checking.** 
2430: 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e  for duplicate in
2440: 64 65 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e  dex names is don
2450: 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20  e.)  The search 
2460: 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50  order is.** TEMP
2470: 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49   first, then MAI
2480: 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69  N, then any auxi
2490: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20  liary databases 
24a0: 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74  added.** using t
24b0: 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e  he ATTACH comman
24c0: 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c  d..*/.Index *sql
24d0: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71  ite3FindIndex(sq
24e0: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
24f0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
2500: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a  nst char *zDb){.
2510: 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a    Index *p = 0;.
2520: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
2530: 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c  =OMIT_TEMPDB; i<
2540: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2550: 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29     int j = (i<2)
2560: 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20   ? i^1 : i;  /* 
2570: 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f  Search TEMP befo
2580: 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53  re MAIN */.    S
2590: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
25a0: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68   db->aDb[j].pSch
25b0: 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  ema;.    if( zDb
25c0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
25d0: 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b  mp(zDb, db->aDb[
25e0: 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74  j].zName) ) cont
25f0: 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
2600: 28 20 70 53 63 68 65 6d 61 20 7c 7c 20 28 6a 3d  ( pSchema || (j=
2610: 3d 31 20 26 26 20 21 64 62 2d 3e 61 44 62 5b 31  =1 && !db->aDb[1
2620: 5d 2e 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66  ].pBt) );.    if
2630: 28 20 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ( pSchema ){.   
2640: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
2650: 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d  shFind(&pSchema-
2660: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >idxHash, zName,
2670: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
2680: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2690: 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   p ) break;.  }.
26a0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
26b0: 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65  *.** Reclaim the
26c0: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
26d0: 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74  an index.*/.stat
26e0: 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e 64 65  ic void freeInde
26f0: 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73  x(Index *p){.  s
2700: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 43 6f  qliteFree(p->zCo
2710: 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 46  lAff);.  sqliteF
2720: 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ree(p);.}../*.**
2730: 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69 76 65   Remove the give
2740: 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65  n index from the
2750: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
2760: 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69  e, and free.** i
2770: 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ts memory struct
2780: 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ures..**.** The 
2790: 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76 65 64  index is removed
27a0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
27b0: 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 62  se hash tables b
27c0: 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  ut.** it is not 
27d0: 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68  unlinked from th
27e0: 65 20 54 61 62 6c 65 20 74 68 61 74 20 69 74 20  e Table that it 
27f0: 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69  indexes..** Unli
2800: 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 54  nking from the T
2810: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64 6f 6e  able must be don
2820: 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  e by the calling
2830: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
2840: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
2850: 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69  DeleteIndex(sqli
2860: 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a  te3 *db, Index *
2870: 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6c  p){.  Index *pOl
2880: 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d;.  const char 
2890: 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d  *zName = p->zNam
28a0: 65 3b 0a 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c  e;..  pOld = sql
28b0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
28c0: 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  p->pSchema->idxH
28d0: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  ash, zName, strl
28e0: 65 6e 28 20 7a 4e 61 6d 65 29 2b 31 2c 20 30 29  en( zName)+1, 0)
28f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64  ;.  assert( pOld
2900: 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29  ==0 || pOld==p )
2910: 3b 0a 20 20 66 72 65 65 49 6e 64 65 78 28 70 29  ;.  freeIndex(p)
2920: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  ;.}../*.** For t
2930: 68 65 20 69 6e 64 65 78 20 63 61 6c 6c 65 64 20  he index called 
2940: 7a 49 64 78 4e 61 6d 65 20 77 68 69 63 68 20 69  zIdxName which i
2950: 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64  s found in the d
2960: 61 74 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20  atabase iDb,.** 
2970: 75 6e 6c 69 6b 65 20 74 68 61 74 20 69 6e 64 65  unlike that inde
2980: 78 20 66 72 6f 6d 20 69 74 73 20 54 61 62 6c 65  x from its Table
2990: 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   then remove the
29a0: 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74   index from.** t
29b0: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
29c0: 62 6c 65 20 61 6e 64 20 66 72 65 65 20 61 6c 6c  ble and free all
29d0: 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
29e0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  es associated.**
29f0: 20 77 69 74 68 20 74 68 65 20 69 6e 64 65 78 2e   with the index.
2a00: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2a10: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49  UnlinkAndDeleteI
2a20: 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62  ndex(sqlite3 *db
2a30: 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74  , int iDb, const
2a40: 20 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29   char *zIdxName)
2a50: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
2a60: 78 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  x;.  int len;.  
2a70: 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 26 64  Hash *pHash = &d
2a80: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
2a90: 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 0a 20  ema->idxHash;.. 
2aa0: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 49   len = strlen(zI
2ab0: 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65  dxName);.  pInde
2ac0: 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  x = sqlite3HashI
2ad0: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64  nsert(pHash, zId
2ae0: 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31 2c 20 30 29  xName, len+1, 0)
2af0: 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
2b00: 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  {.    if( pIndex
2b10: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
2b20: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
2b30: 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
2b40: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
2b50: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  x->pNext;.    }e
2b60: 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
2b70: 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70   *p;.      for(p
2b80: 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d  =pIndex->pTable-
2b90: 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d  >pIndex; p && p-
2ba0: 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b 20  >pNext!=pIndex; 
2bb0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  p=p->pNext){}.  
2bc0: 20 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e      if( p && p->
2bd0: 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b  pNext==pIndex ){
2be0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  .        p->pNex
2bf0: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
2c00: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
2c10: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70  .    freeIndex(p
2c20: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62  Index);.  }.  db
2c30: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
2c40: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
2c50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
2c60: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
2c70: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
2c80: 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
2c90: 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 61 20 73 69  ables of.** a si
2ca0: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 2e 20 20  ngle database.  
2cb0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2cc0: 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61 69  called to reclai
2cd0: 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f  m memory.** befo
2ce0: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
2cf0: 63 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61  closes.  It is a
2d00: 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e  lso called durin
2d10: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  g a rollback.** 
2d20: 69 66 20 74 68 65 72 65 20 77 65 72 65 20 73 63  if there were sc
2d30: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72  hema changes dur
2d40: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74  ing the transact
2d50: 69 6f 6e 20 6f 72 20 69 66 20 61 0a 2a 2a 20 73  ion or if a.** s
2d60: 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69 73  chema-cookie mis
2d70: 6d 61 74 63 68 20 6f 63 63 75 72 73 2e 0a 2a 2a  match occurs..**
2d80: 0a 2a 2a 20 49 66 20 69 44 62 3c 3d 30 20 74 68  .** If iDb<=0 th
2d90: 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74  en reset the int
2da0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62  ernal schema tab
2db0: 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  les for all data
2dc0: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20  base.** files.  
2dd0: 49 66 20 69 44 62 3e 3d 32 20 74 68 65 6e 20 72  If iDb>=2 then r
2de0: 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61  eset the interna
2df0: 6c 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c  l schema for onl
2e00: 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20  y the.** single 
2e10: 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64 2e 0a  file indicated..
2e20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
2e30: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
2e40: 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ma(sqlite3 *db, 
2e50: 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20  int iDb){.  int 
2e60: 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65 72 74 28  i, j;..  assert(
2e70: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
2e80: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 66 6f 72 28  b->nDb );.  for(
2e90: 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44 62  i=iDb; i<db->nDb
2ea0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a  ; i++){.    Db *
2eb0: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
2ec0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
2ed0: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
2ee0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 46 72   sqlite3SchemaFr
2ef0: 65 65 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29  ee(pDb->pSchema)
2f00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2f10: 69 44 62 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb>0 ) return;.
2f20: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 44    }.  assert( iD
2f30: 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c  b==0 );.  db->fl
2f40: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
2f50: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 20  nternChanges;.. 
2f60: 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f   /* If one or mo
2f70: 72 65 20 6f 66 20 74 68 65 20 61 75 78 69 6c 69  re of the auxili
2f80: 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ary database fil
2f90: 65 73 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73  es has been clos
2fa0: 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65  ed,.  ** then re
2fb0: 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74  move them from t
2fc0: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
2fd0: 61 62 61 73 65 20 6c 69 73 74 2e 20 20 57 65 20  abase list.  We 
2fe0: 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20 6f 70  take the.  ** op
2ff0: 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 64 6f 20  portunity to do 
3000: 74 68 69 73 20 68 65 72 65 20 73 69 6e 63 65 20  this here since 
3010: 77 65 20 68 61 76 65 20 6a 75 73 74 20 64 65 6c  we have just del
3020: 65 74 65 64 20 61 6c 6c 20 6f 66 20 74 68 65 0a  eted all of the.
3030: 20 20 2a 2a 20 73 63 68 65 6d 61 20 68 61 73 68    ** schema hash
3040: 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 72   tables and ther
3050: 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68 61 76  efore do not hav
3060: 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 63 68  e to make any ch
3070: 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 61 6e  anges.  ** to an
3080: 79 20 6f 66 20 74 68 6f 73 65 20 74 61 62 6c 65  y of those table
3090: 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
30a0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
30b0: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
30c0: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
30d0: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
30e0: 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  b->pBt==0 ){.   
30f0: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 41 75 78     if( pDb->pAux
3100: 20 26 26 20 70 44 62 2d 3e 78 46 72 65 65 41 75   && pDb->xFreeAu
3110: 78 20 29 20 70 44 62 2d 3e 78 46 72 65 65 41 75  x ) pDb->xFreeAu
3120: 78 28 70 44 62 2d 3e 70 41 75 78 29 3b 0a 20 20  x(pDb->pAux);.  
3130: 20 20 20 20 70 44 62 2d 3e 70 41 75 78 20 3d 20      pDb->pAux = 
3140: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  0;.    }.  }.  f
3150: 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e  or(i=j=2; i<db->
3160: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nDb; i++){.    s
3170: 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20  truct Db *pDb = 
3180: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
3190: 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30   if( pDb->pBt==0
31a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
31b0: 46 72 65 65 28 70 44 62 2d 3e 7a 4e 61 6d 65 29  Free(pDb->zName)
31c0: 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61  ;.      pDb->zNa
31d0: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f  me = 0;.      co
31e0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
31f0: 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20    if( j<i ){.   
3200: 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20     db->aDb[j] = 
3210: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
3220: 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  }.    j++;.  }. 
3230: 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44 62   memset(&db->aDb
3240: 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62  [j], 0, (db->nDb
3250: 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61  -j)*sizeof(db->a
3260: 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e  Db[j]));.  db->n
3270: 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62  Db = j;.  if( db
3280: 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e  ->nDb<=2 && db->
3290: 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 74  aDb!=db->aDbStat
32a0: 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  ic ){.    memcpy
32b0: 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c 20  (db->aDbStatic, 
32c0: 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f  db->aDb, 2*sizeo
32d0: 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a  f(db->aDb[0]));.
32e0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 64      sqliteFree(d
32f0: 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d  b->aDb);.    db-
3300: 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74  >aDb = db->aDbSt
3310: 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  atic;.  }.}../*.
3320: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3330: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76  is called whenev
3340: 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  er a rollback oc
3350: 63 75 72 73 2e 20 20 49 66 20 74 68 65 72 65 20  curs.  If there 
3360: 77 65 72 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63  were.** schema c
3370: 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68  hanges during th
3380: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  e transaction, t
3390: 68 65 6e 20 77 65 20 68 61 76 65 20 74 6f 20 72  hen we have to r
33a0: 65 73 65 74 20 74 68 65 0a 2a 2a 20 69 6e 74 65  eset the.** inte
33b0: 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73  rnal hash tables
33c0: 20 61 6e 64 20 72 65 6c 6f 61 64 20 74 68 65 6d   and reload them
33d0: 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76   from disk..*/.v
33e0: 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  oid sqlite3Rollb
33f0: 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  ackInternalChang
3400: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
3410: 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  .  if( db->flags
3420: 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e   & SQLITE_Intern
3430: 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 73  Changes ){.    s
3440: 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
3450: 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29  nalSchema(db, 0)
3460: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3470: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
3480: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d  alled when a com
3490: 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76  mit occurs..*/.v
34a0: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
34b0: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
34c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
34d0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
34e0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
34f0: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ges;.}../*.** Cl
3500: 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
3510: 61 6d 65 73 20 66 72 6f 6d 20 61 20 74 61 62 6c  ames from a tabl
3520: 65 20 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a 73 74  e or view..*/.st
3530: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
3540: 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ResetColumnNames
3550: 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b  (Table *pTable){
3560: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75  .  int i;.  Colu
3570: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65  mn *pCol;.  asse
3580: 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b  rt( pTable!=0 );
3590: 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20 70  .  if( (pCol = p
35a0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20  Table->aCol)!=0 
35b0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
35c0: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
35d0: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
35e0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
35f0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
3600: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
3610: 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66 6c 74  lete(pCol->pDflt
3620: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
3630: 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29  ree(pCol->zType)
3640: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
3650: 65 65 28 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b  ee(pCol->zColl);
3660: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
3670: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
3680: 6f 6c 29 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  ol);.  }.  pTabl
3690: 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  e->aCol = 0;.  p
36a0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
36b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
36c0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61   the memory data
36d0: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
36e0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
36f0: 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20  given.** Table. 
3700: 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
3710: 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20  made to disk by 
3720: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
3730: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3740: 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68   just deletes th
3750: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
3760: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75  .  It does not u
3770: 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62  nlink.** the tab
3780: 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  le data structur
3790: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
37a0: 74 61 62 6c 65 2e 20 20 4e 6f 72 20 64 6f 65 73  table.  Nor does
37b0: 20 69 74 20 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f   it remove.** fo
37c0: 72 65 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d 20  reign keys from 
37d0: 74 68 65 20 73 71 6c 69 74 65 2e 61 46 4b 65 79  the sqlite.aFKey
37e0: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75   hash table.  Bu
37f0: 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f  t it does destro
3800: 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75  y.** memory stru
3810: 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e  ctures of the in
3820: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
3830: 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65  n keys associate
3840: 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74  d with .** the t
3850: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69  able..**.** Indi
3860: 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
3870: 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 61 72  ith the table ar
3880: 65 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  e unlinked from 
3890: 74 68 65 20 22 64 62 22 0a 2a 2a 20 64 61 74 61  the "db".** data
38a0: 20 73 74 72 75 63 74 75 72 65 20 69 66 20 64 62   structure if db
38b0: 21 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d 3d  !=NULL.  If db==
38c0: 4e 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61 74  NULL, indices at
38d0: 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68 65  tached to.** the
38e0: 20 74 61 62 6c 65 20 61 72 65 20 64 65 6c 65 74   table are delet
38f0: 65 64 2c 20 62 75 74 20 69 74 20 69 73 20 61 73  ed, but it is as
3900: 73 75 6d 65 64 20 74 68 65 79 20 68 61 76 65 20  sumed they have 
3910: 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20  already been.** 
3920: 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69  unlinked..*/.voi
3930: 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54  d sqlite3DeleteT
3940: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
3950: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
3960: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
3970: 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65  x, *pNext;.  FKe
3980: 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74  y *pFKey, *pNext
3990: 46 4b 65 79 3b 0a 0a 20 20 64 62 20 3d 20 30 3b  FKey;..  db = 0;
39a0: 0a 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ..  if( pTable==
39b0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  0 ) return;..  /
39c0: 2a 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  * Do not delete 
39d0: 74 68 65 20 74 61 62 6c 65 20 75 6e 74 69 6c 20  the table until 
39e0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
39f0: 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f  unt reaches zero
3a00: 2e 20 2a 2f 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  . */.  pTable->n
3a10: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 54 61  Ref--;.  if( pTa
3a20: 62 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20  ble->nRef>0 ){. 
3a30: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
3a40: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
3a50: 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >nRef==0 );..  /
3a60: 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64  * Delete all ind
3a70: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
3a80: 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 0a  with this table.
3a90: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65    */.  for(pInde
3aa0: 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64  x = pTable->pInd
3ab0: 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
3ac0: 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ex=pNext){.    p
3ad0: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
3ae0: 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74  Next;.    assert
3af0: 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  ( pIndex->pSchem
3b00: 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  a==pTable->pSche
3b10: 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ma );.    sqlite
3b20: 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20  DeleteIndex(db, 
3b30: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 23 69  pIndex);.  }..#i
3b40: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3b50: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
3b60: 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 66 6f  /* Delete all fo
3b70: 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63  reign keys assoc
3b80: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
3b90: 74 61 62 6c 65 2e 20 20 54 68 65 20 6b 65 79 73  table.  The keys
3ba0: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76  .  ** should hav
3bb0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 75  e already been u
3bc0: 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65  nlinked from the
3bd0: 20 64 62 2d 3e 61 46 4b 65 79 20 68 61 73 68 20   db->aFKey hash 
3be0: 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f  table .  */.  fo
3bf0: 72 28 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e  r(pFKey=pTable->
3c00: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46  pFKey; pFKey; pF
3c10: 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a  Key=pNextFKey){.
3c20: 20 20 20 20 70 4e 65 78 74 46 4b 65 79 20 3d 20      pNextFKey = 
3c30: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
3c40: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
3c50: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
3c60: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e  Table->pSchema->
3c70: 61 46 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20  aFKey,.         
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c90: 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74    pFKey->zTo, st
3ca0: 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29  rlen(pFKey->zTo)
3cb0: 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20  +1)!=pFKey );.  
3cc0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b    sqliteFree(pFK
3cd0: 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ey);.  }.#endif.
3ce0: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65  .  /* Delete the
3cf0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
3d00: 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20   itself..  */.  
3d10: 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d  sqliteResetColum
3d20: 6e 4e 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a  nNames(pTable);.
3d30: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
3d40: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  ble->zName);.  s
3d50: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
3d60: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71  ->zColAff);.  sq
3d70: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
3d80: 65 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  e(pTable->pSelec
3d90: 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
3da0: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
3db0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3dc0: 65 28 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b  e(pTable->pCheck
3dd0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
3de0: 74 65 46 72 65 65 28 70 54 61 62 6c 65 29 3b 0a  teFree(pTable);.
3df0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
3e00: 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20  the given table 
3e10: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
3e20: 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c  bles and the del
3e30: 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ete the.** table
3e40: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
3e50: 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20  all its indices 
3e60: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
3e70: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3e80: 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
3e90: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
3ea0: 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73  b, int iDb, cons
3eb0: 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65  t char *zTabName
3ec0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
3ed0: 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46 32   FKey *pF1, *pF2
3ee0: 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20  ;.  Db *pDb;..  
3ef0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
3f00: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
3f10: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
3f20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54   );.  assert( zT
3f30: 61 62 4e 61 6d 65 20 26 26 20 7a 54 61 62 4e 61  abName && zTabNa
3f40: 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62 20 3d  me[0] );.  pDb =
3f50: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
3f60: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
3f70: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
3f80: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
3f90: 7a 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  zTabName, strlen
3fa0: 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 30 29 3b  (zTabName)+1,0);
3fb0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 23 69 66 6e  .  if( p ){.#ifn
3fc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3fd0: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20  FOREIGN_KEY.    
3fe0: 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79  for(pF1=p->pFKey
3ff0: 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e  ; pF1; pF1=pF1->
4000: 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20  pNextFrom){.    
4010: 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c    int nTo = strl
4020: 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31  en(pF1->zTo) + 1
4030: 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73 71  ;.      pF2 = sq
4040: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
4050: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b  Db->pSchema->aFK
4060: 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54  ey, pF1->zTo, nT
4070: 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46  o);.      if( pF
4080: 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20 20  2==pF1 ){.      
4090: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73    sqlite3HashIns
40a0: 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  ert(&pDb->pSchem
40b0: 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a  a->aFKey, pF1->z
40c0: 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e  To, nTo, pF1->pN
40d0: 65 78 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d 65  extTo);.      }e
40e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69  lse{.        whi
40f0: 6c 65 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e  le( pF2 && pF2->
4100: 70 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20  pNextTo!=pF1 ){ 
4110: 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f  pF2=pF2->pNextTo
4120: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
4130: 70 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pF2 ){.         
4140: 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20   pF2->pNextTo = 
4150: 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20  pF1->pNextTo;.  
4160: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4170: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
4180: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
4190: 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ble(db, p);.  }.
41a0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
41b0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
41c0: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  ges;.}../*.** Gi
41d0: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74  ven a token, ret
41e0: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
41f0: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  t consists of th
4200: 65 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a  e text of that.*
4210: 2a 20 74 6f 6b 65 6e 20 77 69 74 68 20 61 6e 79  * token with any
4220: 20 71 75 6f 74 61 74 69 6f 6e 73 20 72 65 6d 6f   quotations remo
4230: 76 65 64 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ved.  Space to h
4240: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
4250: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62   string.** is ob
4260: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
4270: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
4280: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
4290: 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  the calling.** f
42a0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
42b0: 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20  okens are often 
42c0: 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e  just pointers in
42d0: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
42e0: 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a  SQL text and so.
42f0: 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20  ** are not \000 
4300: 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61  terminated and a
4310: 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e  re not persisten
4320: 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64  t.  The returned
4330: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30   string.** is \0
4340: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e  00 terminated an
4350: 64 20 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e  d is persistent.
4360: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
4370: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54  3NameFromToken(T
4380: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
4390: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69  char *zName;.  i
43a0: 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
43b0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
43c0: 72 4e 44 75 70 28 28 63 68 61 72 2a 29 70 4e 61  rNDup((char*)pNa
43d0: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
43e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71  ;.    sqlite3Deq
43f0: 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d  uote(zName);.  }
4400: 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  else{.    zName 
4410: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
4420: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zName;.}../*.*
4430: 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74  * Open the sqlit
4440: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73  e_master table s
4450: 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73  tored in databas
4460: 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72  e number iDb for
4470: 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65  .** writing. The
4480: 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64   table is opened
4490: 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e   using cursor 0.
44a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
44b0: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
44c0: 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44  Parse *p, int iD
44d0: 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
44e0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
44f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  );.  sqlite3Tabl
4500: 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41  eLock(p, iDb, MA
4510: 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53 43  STER_ROOT, 1, SC
4520: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29  HEMA_TABLE(iDb))
4530: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
4540: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
4550: 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 73  er, iDb, 0);.  s
4560: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4570: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
4580: 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 29   0, MASTER_ROOT)
4590: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
45a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
45b0: 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35 29 3b  mColumns, 0, 5);
45c0: 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   /* sqlite_maste
45d0: 72 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20  r has 5 columns 
45e0: 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  */.}../*.** The 
45f0: 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e  token *pName con
4600: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
4610: 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69  f a database (ei
4620: 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a  ther "main" or.*
4630: 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  * "temp" or the 
4640: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
4650: 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f  hed db). This ro
4660: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
4670: 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68  e.** index of th
4680: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
4690: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
46a0: 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  r -1 if the name
46b0: 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d db .** does no
46c0: 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  t exist..*/.int 
46d0: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71  sqlite3FindDb(sq
46e0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e  lite3 *db, Token
46f0: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *pName){.  int 
4700: 69 20 3d 20 2d 31 3b 20 20 20 20 2f 2a 20 44 61  i = -1;    /* Da
4710: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f  tabase number */
4720: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
4730: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
4740: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
4750: 20 6e 61 6d 65 20 2a 2f 0a 20 20 44 62 20 2a 70   name */.  Db *p
4760: 44 62 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 64  Db;       /* A d
4770: 61 74 61 62 61 73 65 20 77 68 6f 73 65 20 6e 61  atabase whose na
4780: 6d 65 20 73 70 61 63 65 20 69 73 20 62 65 69 6e  me space is bein
4790: 67 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20  g searched */.  
47a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f  char *zName;   /
47b0: 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65  * Name we are se
47c0: 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 0a  arching for */..
47d0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
47e0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
47f0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
4800: 6d 65 20 29 7b 0a 20 20 20 20 6e 20 3d 20 73 74  me ){.    n = st
4810: 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  rlen(zName);.   
4820: 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d   for(i=(db->nDb-
4830: 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62  1), pDb=&db->aDb
4840: 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  [i]; i>=0; i--, 
4850: 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  pDb--){.      if
4860: 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  ( (!OMIT_TEMPDB 
4870: 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d  || i!=1 ) && n==
4880: 73 74 72 6c 65 6e 28 70 44 62 2d 3e 7a 4e 61 6d  strlen(pDb->zNam
4890: 65 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  e) && .         
48a0: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
48b0: 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  mp(pDb->zName, z
48c0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
48d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
48e0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
48f0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d  Free(zName);.  }
4900: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a  .  return i;.}..
4910: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20  /* The table or 
4920: 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20  view or trigger 
4930: 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64 20 74  name is passed t
4940: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76  o this routine v
4950: 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61  ia tokens.** pNa
4960: 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20  me1 and pName2. 
4970: 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  If the table nam
4980: 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c  e was fully qual
4990: 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70  ified, for examp
49a0: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45  le:.**.** CREATE
49b0: 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28   TABLE xxx.yyy (
49c0: 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65  ...);.** .** The
49d0: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
49e0: 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61  to "xxx" and pNa
49f0: 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68  me2 "yyy". On th
4a00: 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a  e other hand if.
4a10: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  ** the table nam
4a20: 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71  e is not fully q
4a30: 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a  ualified, i.e.:.
4a40: 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42  **.** CREATE TAB
4a50: 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a  LE yyy(...);.**.
4a60: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
4a70: 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61  s set to "yyy" a
4a80: 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e  nd pName2 is "".
4a90: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
4aa0: 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70 70  ine sets the *pp
4ab0: 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74  Unqual pointer t
4ac0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74  o point at the t
4ad0: 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a  oken (pName1 or.
4ae0: 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20  ** pName2) that 
4af0: 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61  stores the unqua
4b00: 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d  lified table nam
4b10: 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66  e.  The index of
4b20: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
4b30: 20 22 78 78 78 22 20 69 73 20 72 65 74 75 72 6e   "xxx" is return
4b40: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
4b50: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20  e3TwoPartName(. 
4b60: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4b70: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
4b80: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
4b90: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
4ba0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
4bb0: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78       /* The "xxx
4bc0: 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78  " in the name "x
4bd0: 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22  xx.yyy" or "xxx"
4be0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
4bf0: 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me2,      /* The
4c00: 20 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61   "yyy" in the na
4c10: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a  me "xxx.yyy" */.
4c20: 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61    Token **pUnqua
4c30: 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  l     /* Write t
4c40: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f  he unqualified o
4c50: 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20  bject name here 
4c60: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b  */.){.  int iDb;
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c80: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
4c90: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65  holding the obje
4ca0: 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ct */.  sqlite3 
4cb0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
4cc0: 3b 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 20  ;..  if( pName2 
4cd0: 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29  && pName2->n>0 )
4ce0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64  {.    assert( !d
4cf0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a  b->init.busy );.
4d00: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
4d10: 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d  Name2;.    iDb =
4d20: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64   sqlite3FindDb(d
4d30: 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
4d40: 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20  if( iDb<0 ){.   
4d50: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4d60: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
4d70: 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22  own database %T"
4d80: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20  , pName1);.     
4d90: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
4da0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
4db0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
4dc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
4dd0: 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20  >init.iDb==0 || 
4de0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
4df0: 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69  .    iDb = db->i
4e00: 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55  nit.iDb;.    *pU
4e10: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a  nqual = pName1;.
4e20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62    }.  return iDb
4e30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
4e40: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
4e50: 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  to check if the 
4e60: 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61  UTF-8 string zNa
4e70: 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a  me is a legal.**
4e80: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   unqualified nam
4e90: 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65  e for a new sche
4ea0: 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65  ma object (table
4eb0: 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72  , index, view or
4ec0: 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c  .** trigger). Al
4ed0: 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61  l names are lega
4ee0: 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65 20 74  l except those t
4ef0: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 74  hat begin with t
4f00: 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71  he string.** "sq
4f10: 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72  lite_" (in upper
4f20: 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64  , lower or mixed
4f30: 20 63 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72   case). This por
4f40: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65  tion of the name
4f50: 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65  space.** is rese
4f60: 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61  rved for interna
4f70: 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  l use..*/.int sq
4f80: 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74  lite3CheckObject
4f90: 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72  Name(Parse *pPar
4fa0: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
4fb0: 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70  zName){.  if( !p
4fc0: 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e  Parse->db->init.
4fd0: 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e  busy && pParse->
4fe0: 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20  nested==0 .     
4ff0: 20 20 20 20 20 26 26 20 28 70 50 61 72 73 65 2d       && (pParse-
5000: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
5010: 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29  ITE_WriteSchema)
5020: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  ==0.          &&
5030: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49   0==sqlite3StrNI
5040: 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  Cmp(zName, "sqli
5050: 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20  te_", 7) ){.    
5060: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5070: 70 50 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20  pParse, "object 
5080: 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f  name reserved fo
5090: 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20  r internal use: 
50a0: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
50b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
50c0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
50d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
50e0: 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e  ./*.** Begin con
50f0: 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20  structing a new 
5100: 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61  table representa
5110: 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  tion in memory. 
5120: 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20   This is.** the 
5130: 66 69 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c  first of several
5140: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
5150: 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64   that get called
5160: 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20   in response.** 
5170: 74 6f 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  to a CREATE TABL
5180: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e  E statement.  In
5190: 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69   particular, thi
51a0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
51b0: 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65  led.** after see
51c0: 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41  ing tokens "CREA
51d0: 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20  TE" and "TABLE" 
51e0: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61  and the table na
51f0: 6d 65 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74 61  me.  The.** pSta
5200: 72 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20  rt token is the 
5210: 43 52 45 41 54 45 20 61 6e 64 20 70 4e 61 6d 65  CREATE and pName
5220: 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61   is the table na
5230: 6d 65 2e 20 20 54 68 65 20 69 73 54 65 6d 70 0a  me.  The isTemp.
5240: 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 20  ** flag is true 
5250: 69 66 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f  if the table sho
5260: 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e  uld be stored in
5270: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
5280: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
5290: 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68  instead of in th
52a0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
52b0: 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e  file.  This is n
52c0: 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65  ormally the case
52d0: 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45  .** when the "TE
52e0: 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52  MP" or "TEMPORAR
52f0: 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72  Y" keyword occur
5300: 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20  s in between.** 
5310: 43 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45  CREATE and TABLE
5320: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
5330: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20  table record is 
5340: 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20  initialized and 
5350: 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70  put in pParse->p
5360: 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20  NewTable..** As 
5370: 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45 41  more of the CREA
5380: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
5390: 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20 61 64  nt is parsed, ad
53a0: 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a  ditional action.
53b0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c  ** routines will
53c0: 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64   be called to ad
53d0: 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69  d more informati
53e0: 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72  on to this recor
53f0: 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  d..** At the end
5400: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
5410: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  ABLE statement, 
5420: 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61  the sqlite3EndTa
5430: 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  ble() routine.**
5440: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f   is called to co
5450: 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74  mplete the const
5460: 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  ruction of the n
5470: 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e  ew table record.
5480: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5490: 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61  StartTable(.  Pa
54a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
54b0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
54c0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
54d0: 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 22 43  art,   /* The "C
54e0: 52 45 41 54 45 22 20 74 6f 6b 65 6e 20 2a 2f 0a  REATE" token */.
54f0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
5500: 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
5510: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
5520: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
5530: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
5540: 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e  ame2,   /* Secon
5550: 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  d part of the na
5560: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
5570: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  or view */.  int
5580: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a   isTemp,      /*
5590: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
55a0: 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f   a TEMP table */
55b0: 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20  .  int isView,  
55c0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
55d0: 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f  his is a VIEW */
55e0: 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20  .  int noErr    
55f0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
5600: 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61  g if table alrea
5610: 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a  dy exists */.){.
5620: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
5630: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
5640: 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20   0; /* The name 
5650: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
5660: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
5670: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
5680: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
5690: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
56a0: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
56b0: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74   to create the t
56c0: 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b  able in */.  Tok
56d0: 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a  en *pName;    /*
56e0: 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
56f0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
5700: 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f  o create */..  /
5710: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76  * The table or v
5720: 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61  iew name to crea
5730: 74 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  te is passed to 
5740: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61  this routine via
5750: 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61   tokens.  ** pNa
5760: 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20  me1 and pName2. 
5770: 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  If the table nam
5780: 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c  e was fully qual
5790: 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70  ified, for examp
57a0: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52  le:.  **.  ** CR
57b0: 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79  EATE TABLE xxx.y
57c0: 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a  yy (...);.  ** .
57d0: 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31    ** Then pName1
57e0: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
57f0: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
5800: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
5810: 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65  hand if.  ** the
5820: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e   table name is n
5830: 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  ot fully qualifi
5840: 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20  ed, i.e.:.  **. 
5850: 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
5860: 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a   yyy(...);.  **.
5870: 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31    ** Then pName1
5880: 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22   is set to "yyy"
5890: 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22   and pName2 is "
58a0: 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  "..  **.  ** The
58b0: 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73   call below sets
58c0: 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74   the pName point
58d0: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
58e0: 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31  he token (pName1
58f0: 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29   or.  ** pName2)
5900: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
5910: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   unqualified tab
5920: 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72  le name. The var
5930: 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a  iable iDb is.  *
5940: 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  * set to the ind
5950: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
5960: 73 65 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  se that the tabl
5970: 65 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20  e or view is to 
5980: 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  be.  ** created 
5990: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d  in..  */.  iDb =
59a0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
59b0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
59c0: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
59d0: 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
59e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
59f0: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
5a00: 20 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e 31   isTemp && iDb>1
5a10: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72   ){.    /* If cr
5a20: 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61  eating a temp ta
5a30: 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61  ble, the name ma
5a40: 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69  y not be qualifi
5a50: 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ed */.    sqlite
5a60: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5a70: 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62  , "temporary tab
5a80: 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
5a90: 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20  unqualified");. 
5aa0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
5ab0: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
5ac0: 42 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44  B && isTemp ) iD
5ad0: 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65  b = 1;..  pParse
5ae0: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a  ->sNameToken = *
5af0: 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d  pName;.  zName =
5b00: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
5b10: 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20  Token(pName);.  
5b20: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72  if( zName==0 ) r
5b30: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c  eturn;.  if( SQL
5b40: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43  ITE_OK!=sqlite3C
5b50: 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70  heckObjectName(p
5b60: 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  Parse, zName) ){
5b70: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
5b80: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
5b90: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
5ba0: 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20  iDb==1 ) isTemp 
5bb0: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
5bc0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
5bd0: 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28  ZATION.  assert(
5be0: 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69   (isTemp & 1)==i
5bf0: 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20  sTemp );.  {.   
5c00: 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63   int code;.    c
5c10: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
5c20: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
5c30: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
5c40: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
5c50: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
5c60: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65  CHEMA_TABLE(isTe
5c70: 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  mp), 0, zDb) ){.
5c80: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
5c90: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
5ca0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
5cb0: 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
5cc0: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
5cd0: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
5ce0: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
5cf0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
5d00: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5d10: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
5d20: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
5d30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
5d40: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
5d50: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
5d60: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
5d70: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
5d80: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
5d90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5da0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
5db0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
5dc0: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
5dd0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
5de0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
5df0: 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30  , code, zName, 0
5e00: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
5e10: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
5e20: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
5e30: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  }.#endif..  /* M
5e40: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77  ake sure the new
5e50: 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73   table name does
5e60: 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74   not collide wit
5e70: 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20  h an existing.  
5e80: 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
5e90: 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61  e name in the sa
5ea0: 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73  me database.  Is
5eb0: 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  sue an error mes
5ec0: 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20  sage if.  ** it 
5ed0: 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  does..  */.  if(
5ee0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
5ef0: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
5f00: 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  arse) ){.    got
5f10: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
5f20: 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  ror;.  }.  pTabl
5f30: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  e = sqlite3FindT
5f40: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
5f50: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
5f60: 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  me);.  if( pTabl
5f70: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6e 6f  e ){.    if( !no
5f80: 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Err ){.      sql
5f90: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5fa0: 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61  rse, "table %T a
5fb0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
5fc0: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pName);.    }.  
5fd0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
5fe0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  le_error;.  }.  
5ff0: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
6000: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
6010: 30 29 21 3d 30 20 26 26 20 28 69 44 62 3d 3d 30  0)!=0 && (iDb==0
6020: 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75   || !db->init.bu
6030: 73 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sy) ){.    sqlit
6040: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6050: 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
6060: 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61  eady an index na
6070: 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
6080: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
6090: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
60a0: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
60b0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
60c0: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
60d0: 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20   pTable==0 ){.  
60e0: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
60f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
6100: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
6110: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
6120: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
6130: 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  .  pTable->zName
6140: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62   = zName;.  pTab
6150: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->nCol = 0;.  
6160: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30  pTable->aCol = 0
6170: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65  ;.  pTable->iPKe
6180: 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65  y = -1;.  pTable
6190: 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  ->pIndex = 0;.  
61a0: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20  pTable->pSchema 
61b0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
61c0: 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65  Schema;.  pTable
61d0: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 69 66  ->nRef = 1;.  if
61e0: 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ( pParse->pNewTa
61f0: 62 6c 65 20 29 20 73 71 6c 69 74 65 33 44 65 6c  ble ) sqlite3Del
6200: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 50 61  eteTable(db, pPa
6210: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b  rse->pNewTable);
6220: 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
6230: 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a  able = pTable;..
6240: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
6250: 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65  the magic sqlite
6260: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
6270: 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72  used by autoincr
6280: 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e  ement,.  ** then
6290: 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   record a pointe
62a0: 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  r to this table 
62b0: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
62c0: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  base structure. 
62d0: 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45   ** so that INSE
62e0: 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20  RT can find the 
62f0: 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20  table easily..  
6300: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
6310: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
6320: 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72  MENT.  if( !pPar
6330: 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74  se->nested && st
6340: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  rcmp(zName, "sql
6350: 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d  ite_sequence")==
6360: 30 20 29 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d  0 ){.    pTable-
6370: 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  >pSchema->pSeqTa
6380: 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a  b = pTable;.  }.
6390: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67  #endif..  /* Beg
63a0: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
63b0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
63c0: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
63d0: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
63e0: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
63f0: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
6400: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
6410: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
6420: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
6430: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
6440: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
6450: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
6460: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
6470: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
6480: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
6490: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
64a0: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
64b0: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
64c0: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
64d0: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
64e0: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
64f0: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
6500: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
6510: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
6520: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
6530: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
6540: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
6550: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
6560: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28  ->init.busy && (
6570: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
6580: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
6590: 7b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 3b 0a 20  {.    int lbl;. 
65a0: 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61     int fileForma
65b0: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  t;.    sqlite3Be
65c0: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
65d0: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
65e0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
65f0: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e  e file format an
6600: 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68  d encoding in th
6610: 65 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20  e database have 
6620: 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20  not been set, . 
6630: 20 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e     ** set them n
6640: 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ow..    */.    s
6650: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6660: 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65  v, OP_ReadCookie
6670: 2c 20 69 44 62 2c 20 31 29 3b 20 20 20 2f 2a 20  , iDb, 1);   /* 
6680: 66 69 6c 65 5f 66 6f 72 6d 61 74 20 2a 2f 0a 20  file_format */. 
6690: 20 20 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33     lbl = sqlite3
66a0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
66b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
66c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c  eAddOp(v, OP_If,
66d0: 20 30 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 66 69   0, lbl);.    fi
66e0: 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e  leFormat = (db->
66f0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c  flags & SQLITE_L
6700: 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30  egacyFileFmt)!=0
6710: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
6720: 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f       1 : SQLITE_
6730: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52  DEFAULT_FILE_FOR
6740: 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  MAT;.    sqlite3
6750: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6760: 49 6e 74 65 67 65 72 2c 20 66 69 6c 65 46 6f 72  Integer, fileFor
6770: 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  mat, 0);.    sql
6780: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6790: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
67a0: 44 62 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  Db, 1);.    sqli
67b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
67c0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 45 4e 43 28  OP_Integer, ENC(
67d0: 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  db), 0);.    sql
67e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
67f0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
6800: 44 62 2c 20 34 29 3b 0a 20 20 20 20 73 71 6c 69  Db, 4);.    sqli
6810: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
6820: 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 0a 20 20  bel(v, lbl);..  
6830: 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63    /* This just c
6840: 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68  reates a place-h
6850: 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20  older record in 
6860: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
6870: 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  r table..    ** 
6880: 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74  The record creat
6890: 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  ed does not cont
68a0: 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74  ain anything yet
68b0: 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65  .  It will be re
68c0: 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79  placed.    ** by
68d0: 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20   the real entry 
68e0: 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  in code generate
68f0: 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54  d at sqlite3EndT
6900: 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  able()..    **. 
6910: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
6920: 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72  for the new entr
6930: 79 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65  y is left on the
6940: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
6950: 6b 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  k..    ** The ro
6960: 77 69 64 20 76 61 6c 75 65 20 69 73 20 6e 65 65  wid value is nee
6970: 64 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20  ded by the code 
6980: 74 68 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54  that sqlite3EndT
6990: 61 62 6c 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  able will.    **
69a0: 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a   generate..    *
69b0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
69c0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 69  _OMIT_VIEW.    i
69d0: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
69e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
69f0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
6a00: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65  r, 0, 0);.    }e
6a10: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
6a20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6a30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72  beAddOp(v, OP_Cr
6a40: 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62 2c 20  eateTable, iDb, 
6a50: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
6a60: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
6a70: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62  able(pParse, iDb
6a80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6a90: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
6aa0: 77 52 6f 77 69 64 2c 20 30 2c 20 30 29 3b 0a 20  wRowid, 0, 0);. 
6ab0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6ac0: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
6ad0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6ae0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
6af0: 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20  _Null, 0, 0);.  
6b00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6b10: 4f 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  Op(v, OP_Insert,
6b20: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
6b30: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6b40: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
6b50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6b60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
6b70: 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 1, 0);.  }..  
6b80: 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65  /* Normal (non-e
6b90: 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f  rror) return. */
6ba0: 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a  .  return;..  /*
6bb0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
6bc0: 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72  urs, we jump her
6bd0: 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65  e */.begin_table
6be0: 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65  _error:.  sqlite
6bf0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72  Free(zName);.  r
6c00: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
6c10: 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73  This macro is us
6c20: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77  ed to compare tw
6c30: 6f 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20 63  o strings in a c
6c40: 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20  ase-insensitive 
6c50: 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73  manner..** It is
6c60: 20 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72   slightly faster
6c70: 20 74 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71   than calling sq
6c80: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 29 20 64  lite3StrICmp() d
6c90: 69 72 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20  irectly, but.** 
6ca0: 70 72 6f 64 75 63 65 73 20 6c 61 72 67 65 72 20  produces larger 
6cb0: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e  code..**.** WARN
6cc0: 49 4e 47 3a 20 54 68 69 73 20 6d 61 63 72 6f 20  ING: This macro 
6cd0: 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c  is not compatibl
6ce0: 65 20 77 69 74 68 20 74 68 65 20 73 74 72 63 6d  e with the strcm
6cf0: 70 28 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a  p() family. It.*
6d00: 2a 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69  * returns true i
6d10: 66 20 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67  f the two string
6d20: 73 20 61 72 65 20 65 71 75 61 6c 2c 20 6f 74 68  s are equal, oth
6d30: 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f  erwise false..*/
6d40: 0a 23 64 65 66 69 6e 65 20 53 54 52 49 43 4d 50  .#define STRICMP
6d50: 28 78 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74 65  (x, y) (\.sqlite
6d60: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28  3UpperToLower[*(
6d70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
6d80: 28 78 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74  (x)]==   \.sqlit
6d90: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  e3UpperToLower[*
6da0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
6db0: 29 28 79 29 5d 20 20 20 20 20 5c 0a 26 26 20 73  )(y)]     \.&& s
6dc0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 28 78  qlite3StrICmp((x
6dd0: 29 2b 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a  )+1,(y)+1)==0 ).
6de0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
6df0: 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74   column to the t
6e00: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62  able currently b
6e10: 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
6e20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  ..**.** The pars
6e30: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
6e40: 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65  utine once for e
6e50: 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61  ach column decla
6e60: 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43  ration.** in a C
6e70: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
6e80: 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53  ement.  sqlite3S
6e90: 74 61 72 74 54 61 62 6c 65 28 29 20 67 65 74 73  tartTable() gets
6ea0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74   called.** first
6eb0: 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67   to get things g
6ec0: 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73  oing.  Then this
6ed0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
6ee0: 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63  ed for each.** c
6ef0: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olumn..*/.void s
6f00: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28  qlite3AddColumn(
6f10: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
6f20: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
6f30: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
6f40: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
6f50: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
6f60: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
6f70: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
6f80: 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73   return;.  z = s
6f90: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
6fa0: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66  ken(pName);.  if
6fb0: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
6fc0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
6fd0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
6fe0: 20 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20   if( STRICMP(z, 
6ff0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
7000: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
7010: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7020: 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f  e, "duplicate co
7030: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20  lumn name: %s", 
7040: 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
7050: 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72  Free(z);.      r
7060: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
7070: 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20  .  if( (p->nCol 
7080: 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20  & 0x7)==0 ){.   
7090: 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20   Column *aNew;. 
70a0: 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65     aNew = sqlite
70b0: 52 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c  Realloc( p->aCol
70c0: 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69  , (p->nCol+8)*si
70d0: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
70e0: 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d  );.    if( aNew=
70f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
7100: 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20  teFree(z);.     
7110: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
7120: 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65     p->aCol = aNe
7130: 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20  w;.  }.  pCol = 
7140: 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c  &p->aCol[p->nCol
7150: 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c  ];.  memset(pCol
7160: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61  , 0, sizeof(p->a
7170: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c  Col[0]));.  pCol
7180: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20  ->zName = z;. . 
7190: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
71a0: 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65  no type specifie
71b0: 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20  d, columns have 
71c0: 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69  the default affi
71d0: 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27  nity.  ** 'NONE'
71e0: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
71f0: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
7200: 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43  then sqlite3AddC
7210: 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c  olumnType() will
7220: 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  .  ** be called 
7230: 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c  next to set pCol
7240: 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65  ->affinity corre
7250: 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f  ctly..  */.  pCo
7260: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
7270: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
7280: 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f   p->nCol++;.}../
7290: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
72a0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
72b0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
72c0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
72d0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
72e0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
72f0: 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55  ment.  A "NOT NU
7300: 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68  LL" constraint h
7310: 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20  as.** been seen 
7320: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  on a column.  Th
7330: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
7340: 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67  the notNull flag
7350: 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   on.** the colum
7360: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
7370: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
7380: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
7390: 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20  ddNotNull(Parse 
73a0: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45  *pParse, int onE
73b0: 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a  rror){.  Table *
73c0: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  p;.  int i;.  if
73d0: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
73e0: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
73f0: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
7400: 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e  nCol-1;.  if( i>
7410: 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  =0 ) p->aCol[i].
7420: 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f  notNull = onErro
7430: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e  r;.}../*.** Scan
7440: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
7450: 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e   name zType (len
7460: 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72  gth nType) and r
7470: 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73  eturn the.** ass
7480: 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69 74 79  ociated affinity
7490: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   type..**.** Thi
74a0: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61  s routine does a
74b0: 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e   case-independen
74c0: 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70  t search of zTyp
74d0: 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75  e for the .** su
74e0: 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20  bstrings in the 
74f0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e  following table.
7500: 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   If one of the s
7510: 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20  ubstrings is.** 
7520: 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65  found, the corre
7530: 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74  sponding affinit
7540: 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  y is returned. I
7550: 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73  f zType contains
7560: 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  .** more than on
7570: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
7580: 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77  ngs, entries tow
7590: 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a  ard the top of .
75a0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b  ** the table tak
75b0: 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20  e priority. For 
75c0: 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70  example, if zTyp
75d0: 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20  e is 'BLOBINT', 
75e0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  .** SQLITE_AFF_I
75f0: 4e 54 45 47 45 52 20 69 73 20 72 65 74 75 72 6e  NTEGER is return
7600: 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72  ed..**.** Substr
7610: 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69  ing     | Affini
7620: 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ty.** ----------
7630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7640: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20  ------.** 'INT' 
7650: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
7660: 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20  _AFF_INTEGER.** 
7670: 27 43 48 41 52 27 20 20 20 20 20 20 20 20 7c 20  'CHAR'        | 
7680: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
7690: 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20  ** 'CLOB'       
76a0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
76b0: 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20  XT.** 'TEXT'    
76c0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
76d0: 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20  _TEXT.** 'BLOB' 
76e0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
76f0: 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41  AFF_NONE.** 'REA
7700: 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  L'        | SQLI
7710: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27  TE_AFF_REAL.** '
7720: 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53  FLOA'        | S
7730: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a  QLITE_AFF_REAL.*
7740: 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20 20 20  * 'DOUB'        
7750: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
7760: 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20  L.**.** If none 
7770: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
7780: 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74  s in the above t
7790: 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a  able are found,.
77a0: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  ** SQLITE_AFF_NU
77b0: 4d 45 52 49 43 20 69 73 20 72 65 74 75 72 6e 65  MERIC is returne
77c0: 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74  d..*/.char sqlit
77d0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 63  e3AffinityType(c
77e0: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 79 70  onst Token *pTyp
77f0: 65 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b  e){.  u32 h = 0;
7800: 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 53 51  .  char aff = SQ
7810: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
7820: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
7830: 65 64 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 70  ed char *zIn = p
7840: 54 79 70 65 2d 3e 7a 3b 0a 20 20 63 6f 6e 73 74  Type->z;.  const
7850: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
7860: 7a 45 6e 64 20 3d 20 26 70 54 79 70 65 2d 3e 7a  zEnd = &pType->z
7870: 5b 70 54 79 70 65 2d 3e 6e 5d 3b 0a 0a 20 20 77  [pType->n];..  w
7880: 68 69 6c 65 28 20 7a 49 6e 21 3d 7a 45 6e 64 20  hile( zIn!=zEnd 
7890: 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38  ){.    h = (h<<8
78a0: 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72  ) + sqlite3Upper
78b0: 54 6f 4c 6f 77 65 72 5b 2a 7a 49 6e 5d 3b 0a 20  ToLower[*zIn];. 
78c0: 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66     zIn++;.    if
78d0: 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b  ( h==(('c'<<24)+
78e0: 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('h'<<16)+('a'<<
78f0: 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20  8)+'r') ){      
7900: 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a         /* CHAR *
7910: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
7920: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 20 0a  LITE_AFF_TEXT; .
7930: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
7940: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('c'<<24)+('l'
7950: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
7960: 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  b') ){       /* 
7970: 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66  CLOB */.      af
7980: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
7990: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
79a0: 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29  f( h==(('t'<<24)
79b0: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c  +('e'<<16)+('x'<
79c0: 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20  <8)+'t') ){     
79d0: 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20    /* TEXT */.   
79e0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
79f0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
7a00: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27  lse if( h==(('b'
7a10: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
7a20: 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20  ('o'<<8)+'b')   
7a30: 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a         /* BLOB *
7a40: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28 61 66  /.        && (af
7a50: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
7a60: 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51  MERIC || aff==SQ
7a70: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29  LITE_AFF_REAL) )
7a80: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
7a90: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23  LITE_AFF_NONE;.#
7aa0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7ab0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
7ac0: 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  T.    }else if( 
7ad0: 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27  h==(('r'<<24)+('
7ae0: 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  e'<<16)+('a'<<8)
7af0: 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'l')          /
7b00: 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20  * REAL */.      
7b10: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
7b20: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
7b30: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
7b40: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
7b50: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
7b60: 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'f'<<24)+('l'<<1
7b70: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29  6)+('o'<<8)+'a')
7b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f            /* FLO
7b90: 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  A */.        && 
7ba0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
7bb0: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
7bc0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
7bd0: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
7be0: 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c  e if( h==(('d'<<
7bf0: 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27  24)+('o'<<16)+('
7c00: 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  u'<<8)+'b')     
7c10: 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a       /* DOUB */.
7c20: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
7c30: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
7c40: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
7c50: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
7c60: 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  L;.#endif.    }e
7c70: 6c 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46  lse if( (h&0x00F
7c80: 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31  FFFFF)==(('i'<<1
7c90: 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29  6)+('n'<<8)+'t')
7ca0: 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f   ){    /* INT */
7cb0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
7cc0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
7cd0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7ce0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
7cf0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
7d00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
7d10: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
7d20: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
7d30: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
7d40: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
7d50: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
7d60: 20 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b    The pFirst tok
7d70: 65 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  en is the first.
7d80: 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ** token in the 
7d90: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65  sequence of toke
7da0: 6e 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ns that describe
7db0: 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65   the type of the
7dc0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  .** column curre
7dd0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
7de0: 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74  ruction.   pLast
7df0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b   is the last tok
7e00: 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71  en.** in the seq
7e10: 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73  uence.  Use this
7e20: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
7e30: 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69  construct a stri
7e40: 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61  ng.** that conta
7e50: 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65  ins the typename
7e60: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
7e70: 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74  nd store that st
7e80: 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  ring.** in zType
7e90: 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/ .void sqlit
7ea0: 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  e3AddColumnType(
7eb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
7ec0: 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20  oken *pType){.  
7ed0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
7ee0: 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  i;.  Column *pCo
7ef0: 6c 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70  l;..  if( (p = p
7f00: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
7f10: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
7f20: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
7f30: 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75    if( i<0 ) retu
7f40: 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d  rn;.  pCol = &p-
7f50: 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 73 71 6c 69  >aCol[i];.  sqli
7f60: 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79  teFree(pCol->zTy
7f70: 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79  pe);.  pCol->zTy
7f80: 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  pe = sqlite3Name
7f90: 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 79 70 65 29  FromToken(pType)
7fa0: 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  ;.  pCol->affini
7fb0: 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69  ty = sqlite3Affi
7fc0: 6e 69 74 79 54 79 70 65 28 70 54 79 70 65 29 3b  nityType(pType);
7fd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78  .}../*.** The ex
7fe0: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
7ff0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
8000: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
8010: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
8020: 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65  .** of the table
8030: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
8040: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
8050: 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c  *.** Default val
8060: 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d  ue expressions m
8070: 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e  ust be constant.
8080: 20 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70    Raise an excep
8090: 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20  tion if this.** 
80a0: 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e  is not the case.
80b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
80c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
80d0: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
80e0: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
80f0: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
8100: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
8110: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
8120: 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c  sqlite3AddDefaul
8130: 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50  tValue(Parse *pP
8140: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
8150: 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  r){.  Table *p;.
8160: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
8170: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
8180: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 21 3d 30  e->pNewTable)!=0
8190: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26   ){.    pCol = &
81a0: 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c  (p->aCol[p->nCol
81b0: 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73  -1]);.    if( !s
81c0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
81d0: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70  tantOrFunction(p
81e0: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73  Expr) ){.      s
81f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8200: 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20  Parse, "default 
8210: 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20  value of column 
8220: 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73  [%s] is not cons
8230: 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20  tant",.         
8240: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
8250: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8260: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8270: 65 28 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  e(pCol->pDflt);.
8280: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c        pCol->pDfl
8290: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
82a0: 75 70 28 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  up(pExpr);.    }
82b0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
82c0: 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b  prDelete(pExpr);
82d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e  .}../*.** Design
82e0: 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ate the PRIMARY 
82f0: 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c  KEY for the tabl
8300: 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c  e.  pList is a l
8310: 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a  ist of names .**
8320: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
8330: 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72   form the primar
8340: 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74  y key.  If pList
8350: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
8360: 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e  he.** most recen
8370: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
8380: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   of the table is
8390: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
83a0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20  ..**.** A table 
83b0: 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74  can have at most
83c0: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
83d0: 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  .  If the table 
83e0: 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61  already has.** a
83f0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e   primary key (an
8400: 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65  d this is the se
8410: 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79  cond primary key
8420: 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e  ) then create an
8430: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a  .** error..**.**
8440: 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   If the PRIMARY 
8450: 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67  KEY is on a sing
8460: 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20  le column whose 
8470: 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45  datatype is INTE
8480: 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20  GER,.** then we 
8490: 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20  will try to use 
84a0: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74  that column as t
84b0: 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74  he rowid.  Set t
84c0: 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a  he Table.iPKey.*
84d0: 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74  * field of the t
84e0: 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
84f0: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68  ruction to be th
8500: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a  e index of the.*
8510: 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  * INTEGER PRIMAR
8520: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54  Y KEY column.  T
8530: 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65  able.iPKey is se
8540: 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65  t to -1 if there
8550: 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45   is.** no INTEGE
8560: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
8570: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20  *.** If the key 
8580: 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45  is not an INTEGE
8590: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74  R PRIMARY KEY, t
85a0: 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69  hen create a uni
85b0: 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72  que.** index for
85c0: 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e   the key.  No in
85d0: 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66  dex is created f
85e0: 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  or INTEGER PRIMA
85f0: 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64  RY KEYs..*/.void
8600: 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61   sqlite3AddPrima
8610: 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  ryKey(.  Parse *
8620: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
8630: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
8640: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
8650: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
8660: 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62  field names to b
8670: 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
8680: 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
8690: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
86a0: 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73  ith a uniqueness
86b0: 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69   conflict */.  i
86c0: 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20  nt autoInc,     
86d0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
86e0: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65  AUTOINCREMENT ke
86f0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
8700: 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
8710: 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54  der     /* SQLIT
8720: 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49  E_SO_ASC or SQLI
8730: 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b  TE_SO_DESC */.){
8740: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
8750: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
8760: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70  le;.  char *zTyp
8770: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  e = 0;.  int iCo
8780: 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28  l = -1, i;.  if(
8790: 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   pTab==0 ) goto 
87a0: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
87b0: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61  ;.  if( pTab->ha
87c0: 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20  sPrimKey ){.    
87d0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
87e0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
87f0: 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73  table \"%s\" has
8800: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70   more than one p
8810: 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61  rimary key", pTa
8820: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
8830: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
8840: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62  exit;.  }.  pTab
8850: 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31  ->hasPrimKey = 1
8860: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
8870: 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
8880: 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20  Tab->nCol - 1;. 
8890: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43     pTab->aCol[iC
88a0: 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20  ol].isPrimKey = 
88b0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
88c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
88d0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
88e0: 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
88f0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
8900: 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
8910: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
8920: 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
8930: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
8940: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
8950: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8960: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
8970: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
8980: 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  if( iCol<pTab->n
8990: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Col ){.        p
89a0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
89b0: 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  isPrimKey = 1;. 
89c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
89d0: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70   if( pList->nExp
89e0: 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b  r>1 ) iCol = -1;
89f0: 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
8a00: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
8a10: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79  >nCol ){.    zTy
8a20: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
8a30: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d  iCol].zType;.  }
8a40: 0a 20 20 69 66 28 20 7a 54 79 70 65 20 26 26 20  .  if( zType && 
8a50: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
8a60: 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29  Type, "INTEGER")
8a70: 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 73  ==0.        && s
8a80: 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45  ortOrder==SQLITE
8a90: 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 70  _SO_ASC ){.    p
8aa0: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f  Tab->iPKey = iCo
8ab0: 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79  l;.    pTab->key
8ac0: 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  Conf = onError;.
8ad0: 20 20 20 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e      pTab->autoIn
8ae0: 63 20 3d 20 61 75 74 6f 49 6e 63 3b 0a 20 20 7d  c = autoInc;.  }
8af0: 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63  else if( autoInc
8b00: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
8b10: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
8b20: 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65  EMENT.    sqlite
8b30: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8b40: 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  , "AUTOINCREMENT
8b50: 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64   is only allowed
8b60: 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20   on an ".       
8b70: 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59  "INTEGER PRIMARY
8b80: 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20   KEY");.#endif. 
8b90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
8ba0: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
8bb0: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Parse, 0, 0, 0, 
8bc0: 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20  pList, onError, 
8bd0: 30 2c 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c  0, 0, sortOrder,
8be0: 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d   0);.    pList =
8bf0: 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79   0;.  }..primary
8c00: 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c  _key_exit:.  sql
8c10: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
8c20: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  te(pList);.  ret
8c30: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  urn;.}../*.** Ad
8c40: 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f  d a new CHECK co
8c50: 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20  nstraint to the 
8c60: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
8c70: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
8c80: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
8c90: 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74  te3AddCheckConst
8ca0: 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
8cb0: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
8cc0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
8cd0: 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45  .  Expr *pCheckE
8ce0: 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63  xpr  /* The chec
8cf0: 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  k expression */.
8d00: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
8d10: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54  E_OMIT_CHECK.  T
8d20: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
8d30: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
8d40: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
8d50: 20 20 2f 2a 20 54 68 65 20 43 48 45 43 4b 20 65    /* The CHECK e
8d60: 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62  xpression must b
8d70: 65 20 64 75 70 6c 69 63 61 74 65 64 20 73 6f 20  e duplicated so 
8d80: 74 68 61 74 20 74 6f 6b 65 6e 73 20 72 65 66 65  that tokens refe
8d90: 72 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6c 6c  r.    ** to mall
8da0: 6f 63 65 64 20 73 70 61 63 65 20 61 6e 64 20 6e  oced space and n
8db0: 6f 74 20 74 68 65 20 28 65 70 68 65 6d 65 72 61  ot the (ephemera
8dc0: 6c 29 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  l) text of the C
8dd0: 52 45 41 54 45 20 54 41 42 4c 45 0a 20 20 20 20  REATE TABLE.    
8de0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ** statement */.
8df0: 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b      pTab->pCheck
8e00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
8e10: 64 28 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20  d(pTab->pCheck, 
8e20: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
8e30: 43 68 65 63 6b 45 78 70 72 29 29 3b 0a 20 20 7d  CheckExpr));.  }
8e40: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
8e50: 33 45 78 70 72 44 65 6c 65 74 65 28 70 43 68 65  3ExprDelete(pChe
8e60: 63 6b 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ckExpr);.}../*.*
8e70: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
8e80: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20  ion function of 
8e90: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
8ea0: 79 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63  y parsed table c
8eb0: 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  olumn.** to the 
8ec0: 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a  CollSeq given..*
8ed0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
8ee0: 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72  dCollateType(Par
8ef0: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
8f00: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69  t char *zType, i
8f10: 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20 54 61 62  nt nType){.  Tab
8f20: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
8f30: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
8f40: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
8f50: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
8f60: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20  = p->nCol-1;..  
8f70: 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  if( sqlite3Locat
8f80: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
8f90: 20 7a 54 79 70 65 2c 20 6e 54 79 70 65 29 20 29   zType, nType) )
8fa0: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
8fb0: 78 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69  x;.    p->aCol[i
8fc0: 5d 2e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  ].zColl = sqlite
8fd0: 33 53 74 72 4e 44 75 70 28 7a 54 79 70 65 2c 20  3StrNDup(zType, 
8fe0: 6e 54 79 70 65 29 3b 0a 20 20 0a 20 20 20 20 2f  nType);.  .    /
8ff0: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
9000: 69 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 22  is declared as "
9010: 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b  <name> PRIMARY K
9020: 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65  EY COLLATE <type
9030: 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  >",.    ** then 
9040: 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76  an index may hav
9050: 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f  e been created o
9060: 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65  n this column be
9070: 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  fore the.    ** 
9080: 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77  collation type w
9090: 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63  as added. Correc
90a0: 74 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20  t this if it is 
90b0: 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  the case..    */
90c0: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d  .    for(pIdx=p-
90d0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
90e0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
90f0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9100: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31  pIdx->nColumn==1
9110: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
9120: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
9130: 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =i ){.        pI
9140: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20  dx->azColl[0] = 
9150: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c  p->aCol[i].zColl
9160: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9170: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
9180: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
9190: 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ns the collation
91a0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61   sequence for da
91b0: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74 65  tabase native te
91c0: 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69  xt.** encoding i
91d0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
91e0: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c   string zName, l
91f0: 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a  ength nName..**.
9200: 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
9210: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ted collation se
9220: 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76  quence is not av
9230: 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20  ailable, or not 
9240: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20  available.** in 
9250: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 74  the database nat
9260: 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ive encoding, th
9270: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
9280: 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ory is invoked t
9290: 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e  o.** request it.
92a0: 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   If the collatio
92b0: 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e  n factory does n
92c0: 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20 61  ot supply such a
92d0: 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e   sequence,.** an
92e0: 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 69  d the sequence i
92f0: 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61  s available in a
9300: 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f  nother text enco
9310: 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20  ding, then that 
9320: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69  is.** returned i
9330: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
9340: 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   no versions of 
9350: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
9360: 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63  llations sequenc
9370: 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c  e are available,
9380: 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65   or.** another e
9390: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
93a0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
93b0: 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
93c0: 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  ge written into.
93d0: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 43 6f  ** pParse..*/.Co
93e0: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f  llSeq *sqlite3Lo
93f0: 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73  cateCollSeq(Pars
9400: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
9410: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
9420: 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69  t nName){.  sqli
9430: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9440: 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d  ->db;.  u8 enc =
9450: 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69   ENC(db);.  u8 i
9460: 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e  nitbusy = db->in
9470: 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53  it.busy;.  CollS
9480: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43  eq *pColl;..  pC
9490: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
94a0: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63  dCollSeq(db, enc
94b0: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  , zName, nName, 
94c0: 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28  initbusy);.  if(
94d0: 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21   !initbusy && (!
94e0: 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d  pColl || !pColl-
94f0: 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43  >xCmp) ){.    pC
9500: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
9510: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 70 43 6f 6c  CollSeq(db, pCol
9520: 6c 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  l, zName, nName)
9530: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c  ;.    if( !pColl
9540: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e   ){.      if( nN
9550: 61 6d 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ame<0 ){.       
9560: 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
9570: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
9580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9590: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
95a0: 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e  o such collation
95b0: 20 73 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22   sequence: %.*s"
95c0: 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  , nName, zName);
95d0: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30  .      pColl = 0
95e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
95f0: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
9600: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
9610: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
9620: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68  ncrement the sch
9630: 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a  ema cookie..**.*
9640: 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * The schema coo
9650: 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  kie is used to d
9660: 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68  etermine when th
9670: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65  e schema for the
9680: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
9690: 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63  nges.  After eac
96a0: 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c  h schema change,
96b0: 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75   the cookie valu
96c0: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57  e.** changes.  W
96d0: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69  hen a process fi
96e0: 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63  rst reads the sc
96f0: 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20  hema it records 
9700: 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20  the.** cookie.  
9710: 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e  Thereafter, when
9720: 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20  ever it goes to 
9730: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
9740: 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b  ase,.** it check
9750: 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  s the cookie to 
9760: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63  make sure the sc
9770: 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61  hema has not cha
9780: 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74  nged.** since it
9790: 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a   was last read..
97a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20  **.** This plan 
97b0: 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  is not completel
97c0: 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20  y bullet-proof. 
97d0: 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
97e0: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d  for.** the schem
97f0: 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74  a to change mult
9800: 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66  iple times and f
9810: 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  or the cookie to
9820: 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20   be.** set back 
9830: 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20  to prior value. 
9840: 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e   But schema chan
9850: 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65  ges are infreque
9860: 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72  nt.** and the pr
9870: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74  obability of hit
9880: 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f  ting the same co
9890: 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e  okie value is on
98a0: 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69  ly.** 1 chance i
98b0: 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72  n 2^32.  So we'r
98c0: 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a  e safe enough..*
98d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68  /.void sqlite3Ch
98e0: 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74  angeCookie(sqlit
98f0: 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 2c  e3 *db, Vdbe *v,
9900: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c   int iDb){.  sql
9910: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9920: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d   OP_Integer, db-
9930: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
9940: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
9950: 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  +1, 0);.  sqlite
9960: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
9970: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
9980: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65   0);.}../*.** Me
9990: 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72  asure the number
99a0: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e   of characters n
99b0: 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20  eeded to output 
99c0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65  the given.** ide
99d0: 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75  ntifier.  The nu
99e0: 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e  mber returned in
99f0: 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65  cludes any quote
9a00: 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f  s used.** but do
9a10: 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74  es not include t
9a20: 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74  he null terminat
9a30: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73  or..**.** The es
9a40: 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72  timate is conser
9a50: 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68  vative.  It migh
9a60: 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 74  t be larger that
9a70: 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c   what is.** real
9a80: 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  ly needed..*/.st
9a90: 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65  atic int identLe
9aa0: 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  ngth(const char 
9ab0: 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *z){.  int n;.  
9ac0: 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b  for(n=0; *z; n++
9ad0: 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , z++){.    if( 
9ae0: 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20  *z=='"' ){ n++; 
9af0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
9b00: 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   + 2;.}../*.** W
9b10: 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66 69  rite an identifi
9b20: 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  er onto the end 
9b30: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  of the given str
9b40: 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f  ing.  Add.** quo
9b50: 74 65 20 63 68 61 72 61 63 74 65 72 73 20 61 73  te characters as
9b60: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
9b70: 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74  ic void identPut
9b80: 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70  (char *z, int *p
9b90: 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e  Idx, char *zSign
9ba0: 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69  edIdent){.  unsi
9bb0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e  gned char *zIden
9bc0: 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  t = (unsigned ch
9bd0: 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74  ar*)zSignedIdent
9be0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65  ;.  int i, j, ne
9bf0: 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a  edQuote;.  i = *
9c00: 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  pIdx;.  for(j=0;
9c10: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
9c20: 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e  {.    if( !isaln
9c30: 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26  um(zIdent[j]) &&
9c40: 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20   zIdent[j]!='_' 
9c50: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e  ) break;.  }.  n
9c60: 65 65 64 51 75 6f 74 65 20 3d 20 20 7a 49 64 65  eedQuote =  zIde
9c70: 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69  nt[j]!=0 || isdi
9c80: 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20  git(zIdent[0]). 
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ca0: 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f   || sqlite3Keywo
9cb0: 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a  rdCode(zIdent, j
9cc0: 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20  )!=TK_ID;.  if( 
9cd0: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
9ce0: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28  +] = '"';.  for(
9cf0: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
9d00: 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d  j++){.    z[i++]
9d10: 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20   = zIdent[j];.  
9d20: 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d    if( zIdent[j]=
9d30: 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  ='"' ) z[i++] = 
9d40: 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  '"';.  }.  if( n
9d50: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
9d60: 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20  ] = '"';.  z[i] 
9d70: 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69  = 0;.  *pIdx = i
9d80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
9d90: 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42  ate a CREATE TAB
9da0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70  LE statement app
9db0: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
9dc0: 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e   given.** table.
9dd0: 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64    Memory to hold
9de0: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
9df0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62   statement is ob
9e00: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73  tained.** from s
9e10: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
9e20: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
9e30: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
9e40: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
9e50: 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54  ic char *createT
9e60: 61 62 6c 65 53 74 6d 74 28 54 61 62 6c 65 20 2a  ableStmt(Table *
9e70: 70 2c 20 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a  p, int isTemp){.
9e80: 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20    int i, k, n;. 
9e90: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
9ea0: 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65  char *zSep, *zSe
9eb0: 70 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20  p2, *zEnd, *z;. 
9ec0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
9ed0: 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   n = 0;.  for(pC
9ee0: 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d  ol = p->aCol, i=
9ef0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
9f00: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
9f10: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
9f20: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
9f30: 20 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79     z = pCol->zTy
9f40: 70 65 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b  pe;.    if( z ){
9f50: 0a 20 20 20 20 20 20 6e 20 2b 3d 20 28 73 74 72  .      n += (str
9f60: 6c 65 6e 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20  len(z) + 1);.   
9f70: 20 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64   }.  }.  n += id
9f80: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61  entLength(p->zNa
9f90: 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20  me);.  if( n<50 
9fa0: 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22  ){.    zSep = ""
9fb0: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
9fc0: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29  ";.    zEnd = ")
9fd0: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
9fe0: 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20  zSep = "\n  ";. 
9ff0: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20     zSep2 = ",\n 
a000: 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22   ";.    zEnd = "
a010: 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d  \n)";.  }.  n +=
a020: 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b   35 + 6*p->nCol;
a030: 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  zStmt = sqlit
a040: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b  eMallocRaw( n );
a050: 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20  .  if( zStmt==0 
a060: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74  ) return 0;.  st
a070: 72 63 70 79 28 7a 53 74 6d 74 2c 20 21 4f 4d 49  rcpy(zStmt, !OMI
a080: 54 5f 54 45 4d 50 44 42 26 26 69 73 54 65 6d 70  T_TEMPDB&&isTemp
a090: 20 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50 20   ? "CREATE TEMP 
a0a0: 54 41 42 4c 45 20 22 3a 22 43 52 45 41 54 45 20  TABLE ":"CREATE 
a0b0: 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20  TABLE ");.  k = 
a0c0: 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20  strlen(zStmt);. 
a0d0: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
a0e0: 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a   &k, p->zName);.
a0f0: 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27    zStmt[k++] = '
a100: 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70  (';.  for(pCol=p
a110: 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70  ->aCol, i=0; i<p
a120: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
a130: 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79  l++){.    strcpy
a140: 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70  (&zStmt[k], zSep
a150: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c  );.    k += strl
a160: 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20  en(&zStmt[k]);. 
a170: 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b     zSep = zSep2;
a180: 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53  .    identPut(zS
a190: 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a  tmt, &k, pCol->z
a1a0: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 28  Name);.    if( (
a1b0: 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29  z = pCol->zType)
a1c0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 74  !=0 ){.      zSt
a1d0: 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20  mt[k++] = ' ';. 
a1e0: 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74       strcpy(&zSt
a1f0: 6d 74 5b 6b 5d 2c 20 7a 29 3b 0a 20 20 20 20 20  mt[k], z);.     
a200: 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 29 3b   k += strlen(z);
a210: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 72  .    }.  }.  str
a220: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
a230: 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  End);.  return z
a240: 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Stmt;.}../*.** T
a250: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
a260: 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20  alled to report 
a270: 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68  the final ")" th
a280: 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a  at terminates.**
a290: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
a2a0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
a2b0: 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63   The table struc
a2c0: 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20  ture that other 
a2d0: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
a2e0: 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69  have been buildi
a2f0: 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ng.** is added t
a300: 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68  o the internal h
a310: 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75  ash tables, assu
a320: 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68  ming no errors h
a330: 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e  ave.** occurred.
a340: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20  .**.** An entry 
a350: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73  for the table is
a360: 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73   made in the mas
a370: 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73  ter table on dis
a380: 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69  k, unless.** thi
a390: 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
a3a0: 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e   table or db->in
a3b0: 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65  it.busy==1.  Whe
a3c0: 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  n db->init.busy=
a3d0: 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77  =1.** it means w
a3e0: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
a3f0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
a400: 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65  table because we
a410: 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74   just.** connect
a420: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
a430: 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  se or because th
a440: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
a450: 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63  table has.** rec
a460: 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73  ently changed, s
a470: 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  o the entry for 
a480: 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61  this table alrea
a490: 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20  dy exists in.** 
a4a0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
a4b0: 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20  r table.  We do 
a4c0: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61  not want to crea
a4d0: 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a  te it again..**.
a4e0: 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63  ** If the pSelec
a4f0: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  t argument is no
a500: 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73  t NULL, it means
a510: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
a520: 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64  ne.** was called
a530: 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62   to create a tab
a540: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  le generated fro
a550: 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20  m a .** "CREATE 
a560: 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c  TABLE ... AS SEL
a570: 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65  ECT ..." stateme
a580: 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20  nt.  The column 
a590: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
a5a0: 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d  new table will m
a5b0: 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20  atch the result 
a5c0: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
a5d0: 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
a5e0: 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61  e3EndTable(.  Pa
a5f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
a600: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
a610: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
a620: 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20  n *pCons,       
a630: 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74      /* The ',' t
a640: 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c  oken after the l
a650: 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e  ast column defn.
a660: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e   */.  Token *pEn
a670: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d,            /*
a680: 20 54 68 65 20 66 69 6e 61 6c 20 27 29 27 20 74   The final ')' t
a690: 6f 6b 65 6e 20 69 6e 20 74 68 65 20 43 52 45 41  oken in the CREA
a6a0: 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65  TE TABLE */.  Se
a6b0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
a6c0: 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20        /* Select 
a6d0: 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e  from a "CREATE .
a6e0: 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f  .. AS SELECT" */
a6f0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
a700: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
a710: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
a720: 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 28 70  t iDb;..  if( (p
a730: 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63  End==0 && pSelec
a740: 74 3d 3d 30 29 20 7c 7c 20 0a 20 20 20 20 20 20  t==0) || .      
a750: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
a760: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
a770: 61 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 6d 61 6c  aReadOnly()->mal
a780: 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20 20  locFailed ) {.  
a790: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
a7a0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
a7b0: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
a7c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  0 ) return;..  a
a7d0: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
a7e0: 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63  .busy || !pSelec
a7f0: 74 20 29 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71  t );..  iDb = sq
a800: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
a810: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
a820: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66  ->pSchema);..#if
a830: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a840: 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f  _CHECK.  /* Reso
a850: 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c  lve names in all
a860: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
a870: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20  t expressions.. 
a880: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68   */.  if( p->pCh
a890: 65 63 6b 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  eck ){.    SrcLi
a8a0: 73 74 20 73 53 72 63 3b 20 20 20 20 20 20 20 20  st sSrc;        
a8b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61             /* Fa
a8c0: 6b 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70  ke SrcList for p
a8d0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
a8e0: 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74   */.    NameCont
a8f0: 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20  ext sNC;        
a900: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
a910: 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72  context for pPar
a920: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f  se->pNewTable */
a930: 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  ..    memset(&sN
a940: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
a950: 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ));.    memset(&
a960: 73 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sSrc, 0, sizeof(
a970: 73 53 72 63 29 29 3b 0a 20 20 20 20 73 53 72 63  sSrc));.    sSrc
a980: 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 73  .nSrc = 1;.    s
a990: 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d  Src.a[0].zName =
a9a0: 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73   p->zName;.    s
a9b0: 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20  Src.a[0].pTab = 
a9c0: 70 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d  p;.    sSrc.a[0]
a9d0: 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  .iCursor = -1;. 
a9e0: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
a9f0: 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e  pParse;.    sNC.
aa00: 70 53 72 63 4c 69 73 74 20 3d 20 26 73 53 72 63  pSrcList = &sSrc
aa10: 3b 0a 20 20 20 20 73 4e 43 2e 69 73 43 68 65 63  ;.    sNC.isChec
aa20: 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 73  k = 1;.    if( s
aa30: 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
aa40: 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
aa50: 70 43 68 65 63 6b 29 20 29 7b 0a 20 20 20 20 20  pCheck) ){.     
aa60: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
aa70: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
aa80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
aa90: 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f  T_CHECK) */..  /
aaa0: 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
aab0: 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d  t.busy is 1 it m
aac0: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
aad0: 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20  ing the SQL off 
aae0: 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65  the.  ** "sqlite
aaf0: 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c  _master" or "sql
ab00: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22  ite_temp_master"
ab10: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
ab20: 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e  sk..  ** So do n
ab30: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
ab40: 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74  disk again.  Ext
ab50: 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61  ract the root pa
ab60: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66  ge number.  ** f
ab70: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  or the table fro
ab80: 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e  m the db->init.n
ab90: 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28  ewTnum field.  (
aba0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  The page number.
abb0: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65    ** should have
abc0: 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20   been put there 
abd0: 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65  by the sqliteOpe
abe0: 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20  nCb routine.).  
abf0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
ac00: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d  t.busy ){.    p-
ac10: 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
ac20: 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20  .newTnum;.  }.. 
ac30: 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69   /* If not initi
ac40: 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72  alizing, then cr
ac50: 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f  eate a record fo
ac60: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a  r the new table.
ac70: 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49    ** in the SQLI
ac80: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
ac90: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
aca0: 20 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d    The record num
acb0: 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ber.  ** for the
acc0: 20 6e 65 77 20 74 61 62 6c 65 20 65 6e 74 72 79   new table entry
acd0: 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
ace0: 62 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  be on the stack.
acf0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
ad00: 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52  is is a TEMPORAR
ad10: 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74  Y table, write t
ad20: 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  he entry into th
ad30: 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
ad40: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
ad50: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
ad60: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
ad70: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
ad80: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69  it.busy ){.    i
ad90: 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt n;.    Vdbe *
ada0: 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  v;.    char *zTy
adb0: 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22  pe;    /* "view"
adc0: 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20   or "table" */. 
add0: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b     char *zType2;
ade0: 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20     /* "VIEW" or 
adf0: 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63  "TABLE" */.    c
ae00: 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f  har *zStmt;    /
ae10: 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52  * Text of the CR
ae20: 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52  EATE TABLE or CR
ae30: 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d  EATE VIEW statem
ae40: 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20  ent */..    v = 
ae50: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
ae60: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
ae70: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  v==0 ) return;..
ae80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ae90: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
aea0: 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  , 0, 0);..    /*
aeb0: 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74   Create the root
aec0: 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65 77  page for the new
aed0: 20 74 61 62 6c 65 20 61 6e 64 20 70 75 73 68 20   table and push 
aee0: 69 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  it onto the stac
aef0: 6b 2e 0a 20 20 20 20 2a 2a 20 41 20 76 69 65 77  k..    ** A view
af00: 20 68 61 73 20 6e 6f 20 72 6f 6f 74 70 61 67 65   has no rootpage
af10: 2c 20 73 6f 20 6a 75 73 74 20 70 75 73 68 20 61  , so just push a
af20: 20 7a 65 72 6f 20 6f 6e 74 6f 20 74 68 65 20 73   zero onto the s
af30: 74 61 63 6b 20 66 6f 72 0a 20 20 20 20 2a 2a 20  tack for.    ** 
af40: 76 69 65 77 73 2e 20 20 49 6e 69 74 69 61 6c 69  views.  Initiali
af50: 7a 65 20 7a 54 79 70 65 20 61 74 20 74 68 65 20  ze zType at the 
af60: 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 2a  same time..    *
af70: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65  /.    if( p->pSe
af80: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lect==0 ){.     
af90: 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61   /* A regular ta
afa0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  ble */.      zTy
afb0: 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20  pe = "table";.  
afc0: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41      zType2 = "TA
afd0: 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51  BLE";.#ifndef SQ
afe0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
aff0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b000: 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20  /* A view */.   
b010: 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77     zType = "view
b020: 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20  ";.      zType2 
b030: 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66  = "VIEW";.#endif
b040: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
b050: 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41  f this is a CREA
b060: 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53  TE TABLE xx AS S
b070: 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75  ELECT ..., execu
b080: 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  te the SELECT.  
b090: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
b0a0: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e  o populate the n
b0b0: 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f  ew table. The ro
b0c0: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66  ot-page number f
b0d0: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65  or the.    ** ne
b0e0: 77 20 74 61 62 6c 65 20 69 73 20 6f 6e 20 74 68  w table is on th
b0f0: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 76 64 62  e top of the vdb
b100: 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a  e stack..    **.
b110: 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20      ** Once the 
b120: 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20  SELECT has been 
b130: 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33  coded by sqlite3
b140: 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20  Select(), it is 
b150: 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74  in a.    ** suit
b160: 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75  able state to qu
b170: 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ery for the colu
b180: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70  mn names and typ
b190: 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20  es to be used.  
b1a0: 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20    ** by the new 
b1b0: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  table..    **.  
b1c0: 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61    ** A shared-ca
b1d0: 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69  che write-lock i
b1e0: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
b1f0: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e  o write to the n
b200: 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a  ew table,.    **
b210: 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63   as a schema-loc
b220: 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  k must have alre
b230: 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ady been obtaine
b240: 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20  d to create it. 
b250: 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73  Since.    ** a s
b260: 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75  chema-lock exclu
b270: 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61  des all other da
b280: 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68  tabase users, th
b290: 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75  e write-lock wou
b2a0: 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64  ld.    ** be red
b2b0: 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  undant..    */. 
b2c0: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
b2d0: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
b2e0: 53 65 6c 54 61 62 3b 0a 20 20 20 20 20 20 73 71  SelTab;.      sq
b2f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b300: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
b310: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b320: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
b330: 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a  teger, iDb, 0);.
b340: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b350: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
b360: 6e 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20  nWrite, 1, 0);. 
b370: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
b380: 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  b = 2;.      sql
b390: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
b3a0: 65 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f  e, pSelect, SRT_
b3b0: 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20  Table, 1, 0, 0, 
b3c0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
b3d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b3e0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29   OP_Close, 1, 0)
b3f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
b400: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
b410: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d         pSelTab =
b420: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
b430: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
b440: 2c 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  , 0, pSelect);. 
b450: 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54         if( pSelT
b460: 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ab==0 ) return;.
b470: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b480: 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  p->aCol==0 );.  
b490: 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20        p->nCol = 
b4a0: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
b4b0: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d         p->aCol =
b4c0: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a   pSelTab->aCol;.
b4d0: 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d          pSelTab-
b4e0: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
b4f0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
b500: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
b510: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
b520: 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  (0, pSelTab);.  
b530: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
b540: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
b550: 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
b560: 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74   the CREATE stat
b570: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28  ement */.    if(
b580: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
b590: 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65    zStmt = create
b5a0: 54 61 62 6c 65 53 74 6d 74 28 70 2c 20 70 2d 3e  TableStmt(p, p->
b5b0: 70 53 63 68 65 6d 61 3d 3d 70 50 61 72 73 65 2d  pSchema==pParse-
b5c0: 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  >db->aDb[1].pSch
b5d0: 65 6d 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ema);.    }else{
b5e0: 0a 20 20 20 20 20 20 6e 20 3d 20 70 45 6e 64 2d  .      n = pEnd-
b5f0: 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61  >z - pParse->sNa
b600: 6d 65 54 6f 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20  meToken.z + 1;. 
b610: 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c       zStmt = sql
b620: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 43 52 45  ite3MPrintf("CRE
b630: 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54  ATE %s %.*s", zT
b640: 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d  ype2, n, pParse-
b650: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a  >sNameToken.z);.
b660: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20      }..    /* A 
b670: 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63  slot for the rec
b680: 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ord has already 
b690: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69  been allocated i
b6a0: 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51  n the .    ** SQ
b6b0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
b6c0: 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64  e.  We just need
b6d0: 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20   to update that 
b6e0: 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20  slot with all.  
b6f0: 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61    ** the informa
b700: 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65  tion we've colle
b710: 63 74 65 64 2e 20 20 54 68 65 20 72 6f 77 69 64  cted.  The rowid
b720: 20 66 6f 72 20 74 68 65 20 70 72 65 61 6c 6c 6f   for the preallo
b730: 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 73 6c 6f  cated.    ** slo
b740: 74 20 69 73 20 74 68 65 20 32 6e 64 20 69 74 65  t is the 2nd ite
b750: 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  m on the stack. 
b760: 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   The top of the 
b770: 73 74 61 63 6b 20 69 73 20 74 68 65 0a 20 20 20  stack is the.   
b780: 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 66 6f   ** root page fo
b790: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  r the new table 
b7a0: 28 6f 72 20 61 20 30 20 69 66 20 74 68 69 73 20  (or a 0 if this 
b7b0: 69 73 20 61 20 76 69 65 77 29 2e 0a 20 20 20 20  is a view)..    
b7c0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
b7d0: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
b7e0: 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20  ,.      "UPDATE 
b7f0: 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20  %Q.%s ".        
b800: 20 22 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c   "SET type='%s',
b810: 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61   name=%Q, tbl_na
b820: 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d  me=%Q, rootpage=
b830: 23 30 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20  #0, sql=%Q ".   
b840: 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64      "WHERE rowid
b850: 3d 23 31 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e  =#1",.      db->
b860: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
b870: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
b880: 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a  ),.      zType,.
b890: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
b8a0: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
b8b0: 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20        zStmt.    
b8c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
b8d0: 65 28 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71  e(zStmt);.    sq
b8e0: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
b8f0: 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 0a  e(db, v, iDb);..
b900: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b910: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
b920: 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  T.    /* Check t
b930: 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65 64  o see if we need
b940: 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71   to create an sq
b950: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
b960: 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b  ble for.    ** k
b970: 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20  eeping track of 
b980: 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65  autoincrement ke
b990: 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ys..    */.    i
b9a0: 66 28 20 70 2d 3e 61 75 74 6f 49 6e 63 20 29 7b  f( p->autoInc ){
b9b0: 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d  .      Db *pDb =
b9c0: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
b9d0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
b9e0: 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d  Schema->pSeqTab=
b9f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
ba00: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
ba10: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
ba20: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
ba30: 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
ba40: 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a  nce(name,seq)",.
ba50: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a            pDb->z
ba60: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  Name.        );.
ba70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
ba80: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70  ndif..    /* Rep
ba90: 61 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20  arse everything 
baa0: 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e  to update our in
bab0: 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75  ternal data stru
bac0: 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71  ctures */.    sq
bad0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
bae0: 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20  OP_ParseSchema, 
baf0: 69 44 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  iDb, 0,.        
bb00: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
bb10: 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70  tbl_name='%q'",p
bb20: 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e  ->zName), P3_DYN
bb30: 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  AMIC);.  }...  /
bb40: 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20  * Add the table 
bb50: 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  to the in-memory
bb60: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
bb70: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
bb80: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
bb90: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61  init.busy && pPa
bba0: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
bbb0: 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b      Table *pOld;
bbc0: 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  .    FKey *pFKey
bbd0: 3b 20 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  ; .    Schema *p
bbe0: 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68  Schema = p->pSch
bbf0: 65 6d 61 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20  ema;.    pOld = 
bc00: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
bc10: 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  t(&pSchema->tblH
bc20: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73  ash, p->zName, s
bc30: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
bc40: 31 2c 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  1,p);.    if( pO
bc50: 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ld ){.      asse
bc60: 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20  rt( p==pOld );  
bc70: 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
bc80: 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64  ave failed insid
bc90: 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a  e HashInsert() *
bca0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  /.      return;.
bcb0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
bcc0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
bcd0: 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28 70 46  N_KEY.    for(pF
bce0: 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46  Key=p->pFKey; pF
bcf0: 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79  Key; pFKey=pFKey
bd00: 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20  ->pNextFrom){.  
bd10: 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74      int nTo = st
bd20: 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29  rlen(pFKey->zTo)
bd30: 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65   + 1;.      pFKe
bd40: 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c  y->pNextTo = sql
bd50: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53  ite3HashFind(&pS
bd60: 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46  chema->aFKey, pF
bd70: 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a  Key->zTo, nTo);.
bd80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73        sqlite3Has
bd90: 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61  hInsert(&pSchema
bda0: 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e  ->aFKey, pFKey->
bdb0: 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29  zTo, nTo, pFKey)
bdc0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
bdd0: 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
bde0: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
bdf0: 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20  ->nTable++;.    
be00: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
be10: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
be20: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
be30: 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42  TE_OMIT_ALTERTAB
be40: 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70  LE.    if( !p->p
be50: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
be60: 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74  assert( !pSelect
be70: 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e   && pCons && pEn
be80: 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  d );.      if( p
be90: 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 20 70 43 6f  Cons->z==0 ) pCo
bea0: 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  ns = pEnd;.     
beb0: 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74   p->addColOffset
bec0: 20 3d 20 31 33 20 2b 20 28 70 43 6f 6e 73 2d 3e   = 13 + (pCons->
bed0: 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d  z - pParse->sNam
bee0: 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 7d  eToken.z);.    }
bef0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23  .#endif.  }.}..#
bf00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
bf10: 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68  IT_VIEW./*.** Th
bf20: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
bf30: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f  his routine in o
bf40: 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61  rder to create a
bf50: 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69   new VIEW.*/.voi
bf60: 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56  d sqlite3CreateV
bf70: 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50  iew(.  Parse *pP
bf80: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65  arse,     /* The
bf90: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
bfa0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65   */.  Token *pBe
bfb0: 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  gin,     /* The 
bfc0: 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
bfd0: 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61  t begins the sta
bfe0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
bff0: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
c000: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
c010: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
c020: 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
c030: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
c040: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
c050: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
c060: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
c070: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
c080: 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45  elect,   /* A SE
c090: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
c0a0: 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
c0b0: 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a  the new view */.
c0c0: 20 20 69 6e 74 20 69 73 54 65 6d 70 20 20 20 20    int isTemp    
c0d0: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72       /* TRUE for
c0e0: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65   a TEMPORARY vie
c0f0: 77 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  w */.){.  Table 
c100: 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  *p;.  int n;.  c
c110: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
c120: 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73  ar *z;.  Token s
c130: 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73  End;.  DbFixer s
c140: 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  Fix;.  Token *pN
c150: 61 6d 65 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  ame;.  int iDb;.
c160: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
c170: 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  Var>0 ){.    sql
c180: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
c190: 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73  rse, "parameters
c1a0: 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
c1b0: 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20   in views");.   
c1c0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
c1d0: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
c1e0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
c1f0: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
c200: 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65 67 69  le(pParse, pBegi
c210: 6e 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  n, pName1, pName
c220: 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 29  2, isTemp, 1, 0)
c230: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
c240: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
c250: 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
c260: 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c  >nErr ){.    sql
c270: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
c280: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72  (pSelect);.    r
c290: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
c2a0: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
c2b0: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
c2c0: 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
c2d0: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
c2e0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
c2f0: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63  arse->db, p->pSc
c300: 68 65 6d 61 29 3b 0a 20 20 69 66 28 20 73 71 6c  hema);.  if( sql
c310: 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
c320: 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20  x, pParse, iDb, 
c330: 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20  "view", pName). 
c340: 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 78     && sqlite3Fix
c350: 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53  Select(&sFix, pS
c360: 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20 20  elect).  ){.    
c370: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
c380: 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ete(pSelect);.  
c390: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
c3a0: 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20   /* Make a copy 
c3b0: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45  of the entire SE
c3c0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
c3d0: 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
c3e0: 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20  view..  ** This 
c3f0: 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74  will force all t
c400: 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20  he Expr.token.z 
c410: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e  values to be dyn
c420: 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c  amically.  ** al
c430: 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74  located rather t
c440: 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  han point to the
c450: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20   input string - 
c460: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
c470: 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20  .  ** they will 
c480: 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68  persist after th
c490: 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65  e current sqlite
c4a0: 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65  3_exec() call re
c4b0: 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d  turns..  */.  p-
c4c0: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
c4d0: 65 33 53 65 6c 65 63 74 44 75 70 28 70 53 65 6c  e3SelectDup(pSel
c4e0: 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ect);.  sqlite3S
c4f0: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
c500: 65 63 74 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ect);.  if( sqli
c510: 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61  te3ThreadDataRea
c520: 64 4f 6e 6c 79 28 29 2d 3e 6d 61 6c 6c 6f 63 46  dOnly()->mallocF
c530: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
c540: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  urn;.  }.  if( !
c550: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74  pParse->db->init
c560: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c  .busy ){.    sql
c570: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
c580: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
c590: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  );.  }..  /* Loc
c5a0: 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
c5b0: 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73  he CREATE VIEW s
c5c0: 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20  tatement.  Make 
c5d0: 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20  sEnd point to.  
c5e0: 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f  ** the end..  */
c5f0: 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65  .  sEnd = pParse
c600: 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20  ->sLastToken;.  
c610: 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30  if( sEnd.z[0]!=0
c620: 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27   && sEnd.z[0]!='
c630: 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a  ;' ){.    sEnd.z
c640: 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a   += sEnd.n;.  }.
c650: 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20    sEnd.n = 0;.  
c660: 6e 20 3d 20 73 45 6e 64 2e 7a 20 2d 20 70 42 65  n = sEnd.z - pBe
c670: 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 28 63  gin->z;.  z = (c
c680: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
c690: 61 72 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20  ar*)pBegin->z;. 
c6a0: 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 28   while( n>0 && (
c6b0: 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69  z[n-1]==';' || i
c6c0: 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20  sspace(z[n-1])) 
c6d0: 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64  ){ n--; }.  sEnd
c6e0: 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20  .z = &z[n-1];.  
c6f0: 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f  sEnd.n = 1;..  /
c700: 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64  * Use sqlite3End
c710: 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74  Table() to add t
c720: 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53  he view to the S
c730: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
c740: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  le */.  sqlite3E
c750: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  ndTable(pParse, 
c760: 30 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20  0, &sEnd, 0);.  
c770: 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66  return;.}.#endif
c780: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
c790: 56 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  VIEW */..#ifndef
c7a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
c7b0: 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  W./*.** The Tabl
c7c0: 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62  e structure pTab
c7d0: 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56  le is really a V
c7e0: 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68  IEW.  Fill in th
c7f0: 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  e names of.** th
c800: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
c810: 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61   view in the pTa
c820: 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ble structure.  
c830: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
c840: 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20  r.** of errors. 
c850: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
c860: 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72  seen leave an er
c870: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
c880: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
c890: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69  */.int sqlite3Vi
c8a0: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
c8b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c8c0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
c8d0: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
c8e0: 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61  ;   /* A fake ta
c8f0: 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77  ble from which w
c900: 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c 74  e get the result
c910: 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74   set */.  Select
c920: 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43   *pSel;     /* C
c930: 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
c940: 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  T that implement
c950: 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  s the view */.  
c960: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20  int nErr = 0;   
c970: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
c980: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
c990: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
c9a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
c9b0: 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68  orarily holds th
c9c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  e number of curs
c9d0: 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a  ors assigned */.
c9e0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
c9f0: 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73  e );..  /* A pos
ca00: 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73  itive nCol means
ca10: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d   the columns nam
ca20: 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77  es for this view
ca30: 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64   are.  ** alread
ca40: 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20  y known..  */.  
ca50: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
ca60: 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  >0 ) return 0;..
ca70: 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20    /* A negative 
ca80: 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61  nCol is a specia
ca90: 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67  l marker meaning
caa0: 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72   that we are cur
cab0: 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69  rently.  ** tryi
cac0: 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ng to compute th
cad0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20  e column names. 
cae0: 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69   If we enter thi
caf0: 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20  s routine with. 
cb00: 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e   ** a negative n
cb10: 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77  Col, it means tw
cb20: 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20  o or more views 
cb30: 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b  form a loop, lik
cb40: 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  e this:.  **.  *
cb50: 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
cb60: 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20  W one AS SELECT 
cb70: 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a  * FROM two;.  **
cb80: 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
cb90: 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a   two AS SELECT *
cba0: 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a   FROM one;.  **.
cbb0: 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
cbc0: 68 69 73 20 65 72 72 6f 72 20 69 73 20 63 61 75  his error is cau
cbd0: 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61  ght previously a
cbe0: 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nd so the follow
cbf0: 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68  ing test.  ** sh
cc00: 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c  ould always fail
cc10: 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c  .  But we will l
cc20: 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65  eave it in place
cc30: 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65   just to be safe
cc40: 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 69  ..  */.#if 0.  i
cc50: 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c  f( pTable->nCol<
cc60: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
cc70: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
cc80: 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72   "view %s is cir
cc90: 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22  cularly defined"
cca0: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
ccb0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
ccc0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73    }.#endif.  ass
ccd0: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ert( pTable->nCo
cce0: 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  l>=0 );..  /* If
ccf0: 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
cd00: 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65  , it means we ne
cd10: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
cd20: 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20  e table names.. 
cd30: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
cd40: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
cd50: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
cd60: 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64  ct() will expand
cd70: 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c   any.  ** "*" el
cd80: 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65  ements in the re
cd90: 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65  sults set of the
cda0: 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61   view and will a
cdb0: 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20  ssign cursors.  
cdc0: 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e  ** to the elemen
cdd0: 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ts of the FROM c
cde0: 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64  lause.  But we d
cdf0: 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65  o not want these
ce00: 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f   changes.  ** to
ce10: 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20   be permanent.  
ce20: 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  So the computati
ce30: 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20  on is done on a 
ce40: 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
ce50: 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  CT.  ** statemen
ce60: 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
ce70: 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20  he view..  */.  
ce80: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
ce90: 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65  pSelect );.  pSe
cea0: 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  l = sqlite3Selec
ceb0: 74 44 75 70 28 70 54 61 62 6c 65 2d 3e 70 53 65  tDup(pTable->pSe
cec0: 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 70 53 65  lect);.  if( pSe
ced0: 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61  l ){.    n = pPa
cee0: 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73  rse->nTab;.    s
cef0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
cf00: 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
cf10: 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a  e, pSel->pSrc);.
cf20: 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
cf30: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 53 65 6c 54   = -1;.    pSelT
cf40: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
cf50: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
cf60: 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a  arse, 0, pSel);.
cf70: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
cf80: 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 53   = n;.    if( pS
cf90: 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20 61  elTab ){.      a
cfa0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61  ssert( pTable->a
cfb0: 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Col==0 );.      
cfc0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70  pTable->nCol = p
cfd0: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
cfe0: 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
cff0: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
d000: 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
d010: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
d020: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
d030: 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
d040: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  3DeleteTable(0, 
d050: 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20  pSelTab);.      
d060: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
d070: 3e 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72  >flags |= DB_Unr
d080: 65 73 65 74 56 69 65 77 73 3b 0a 20 20 20 20 7d  esetViews;.    }
d090: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62  else{.      pTab
d0a0: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->nCol = 0;.  
d0b0: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
d0c0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  }.    sqlite3Sel
d0d0: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 29 3b  ectDelete(pSel);
d0e0: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
d0f0: 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nErr++;.  }.  re
d100: 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23  turn nErr;  .}.#
d110: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d120: 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69  OMIT_VIEW */..#i
d130: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d140: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65  T_VIEW./*.** Cle
d150: 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
d160: 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56  mes from every V
d170: 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20  IEW in database 
d180: 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  idx..*/.static v
d190: 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
d1a0: 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  setAll(sqlite3 *
d1b0: 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20  db, int idx){.  
d1c0: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69  HashElem *i;.  i
d1d0: 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  f( !DbHasPropert
d1e0: 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
d1f0: 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65  resetViews) ) re
d200: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71  turn;.  for(i=sq
d210: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
d220: 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68  b->aDb[idx].pSch
d230: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69  ema->tblHash); i
d240: 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  ;i=sqliteHashNex
d250: 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  t(i)){.    Table
d260: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
d270: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
d280: 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
d290: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
d2a0: 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  eResetColumnName
d2b0: 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  s(pTab);.    }. 
d2c0: 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70   }.  DbClearProp
d2d0: 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
d2e0: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a  _UnresetViews);.
d2f0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
d300: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
d310: 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20  All(A,B).#endif 
d320: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
d330: 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  IEW */../*.** Th
d340: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
d350: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42  alled by the VDB
d360: 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  E to adjust the 
d370: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a  internal schema.
d380: 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74  ** used by SQLit
d390: 65 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65  e when the btree
d3a0: 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74   layer moves a t
d3b0: 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20  able root page. 
d3c0: 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65  The.** root-page
d3d0: 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69   of a table or i
d3e0: 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65  ndex in database
d3f0: 20 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64   iDb has changed
d400: 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74   from iFrom.** t
d410: 6f 20 69 54 6f 2e 0a 2a 2f 0a 23 69 66 6e 64 65  o iTo..*/.#ifnde
d420: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
d430: 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71  TOVACUUM.void sq
d440: 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76  lite3RootPageMov
d450: 65 64 28 44 62 20 2a 70 44 62 2c 20 69 6e 74 20  ed(Db *pDb, int 
d460: 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
d470: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  .  HashElem *pEl
d480: 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73  em;.  Hash *pHas
d490: 68 3b 0a 0a 20 20 70 48 61 73 68 20 3d 20 26 70  h;..  pHash = &p
d4a0: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
d4b0: 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65  Hash;.  for(pEle
d4c0: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
d4d0: 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  t(pHash); pElem;
d4e0: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
d4f0: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
d500: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
d510: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
d520: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  pElem);.    if( 
d530: 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f  pTab->tnum==iFro
d540: 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d  m ){.      pTab-
d550: 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20  >tnum = iTo;.   
d560: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
d570: 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26  .  }.  pHash = &
d580: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  pDb->pSchema->id
d590: 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c  xHash;.  for(pEl
d5a0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
d5b0: 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
d5c0: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
d5d0: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
d5e0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
d5f0: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
d600: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
d610: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pIdx->tnum==iFr
d620: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  om ){.      pIdx
d630: 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
d640: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
d650: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 30  }.  }.  assert(0
d660: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
d670: 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f  ** Write code to
d680: 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65   erase the table
d690: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
d6a0: 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61  iTable from data
d6b0: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73  base iDb..** Als
d6c0: 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20  o write code to 
d6d0: 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74  modify the sqlit
d6e0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
d6f0: 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
d700: 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d  ma.** if a root-
d710: 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  page of another 
d720: 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
d730: 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65  y the btree-laye
d740: 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73  r whilst.** eras
d750: 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73  ing iTable (this
d760: 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
d770: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
d780: 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73  database)..*/ .s
d790: 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
d7a0: 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65  oyRootPage(Parse
d7b0: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
d7c0: 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  able, int iDb){.
d7d0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
d7e0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
d7f0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
d800: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73  eAddOp(v, OP_Des
d810: 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 69 44  troy, iTable, iD
d820: 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  b);.#ifndef SQLI
d830: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
d840: 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72  UM.  /* OP_Destr
d850: 6f 79 20 70 75 73 68 65 73 20 61 6e 20 69 6e 74  oy pushes an int
d860: 65 67 65 72 20 6f 6e 74 6f 20 74 68 65 20 73 74  eger onto the st
d870: 61 63 6b 2e 20 49 66 20 74 68 69 73 20 69 6e 74  ack. If this int
d880: 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e  eger.  ** is non
d890: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69  -zero, then it i
d8a0: 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
d8b0: 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c  number of a tabl
d8c0: 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20  e moved to.  ** 
d8d0: 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e  location iTable.
d8e0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
d8f0: 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65  ode modifies the
d900: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
d910: 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66  able to.  ** ref
d920: 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a  lect this..  **.
d930: 20 20 2a 2a 20 54 68 65 20 22 23 30 22 20 69 6e    ** The "#0" in
d940: 20 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70   the SQL is a sp
d950: 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74  ecial constant t
d960: 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76  hat means whatev
d970: 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73  er value.  ** is
d980: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74   on the top of t
d990: 68 65 20 73 74 61 63 6b 2e 20 20 53 65 65 20 73  he stack.  See s
d9a0: 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 45 78  qlite3RegisterEx
d9b0: 70 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  pr()..  */.  sql
d9c0: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
d9d0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55  pParse, .     "U
d9e0: 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54 20  PDATE %Q.%s SET 
d9f0: 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52  rootpage=%d WHER
da00: 45 20 23 30 20 41 4e 44 20 72 6f 6f 74 70 61 67  E #0 AND rootpag
da10: 65 3d 23 30 22 2c 0a 20 20 20 20 20 70 50 61 72  e=#0",.     pPar
da20: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
da30: 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
da40: 41 42 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c  ABLE(iDb), iTabl
da50: 65 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  e);.#endif.}../*
da60: 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63  .** Write VDBE c
da70: 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62  ode to erase tab
da80: 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20  le pTab and all 
da90: 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63  associated indic
daa0: 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43  es on disk..** C
dab0: 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  ode to update th
dac0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
dad0: 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72  tables and inter
dae0: 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e  nal schema defin
daf0: 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73  itions.** in cas
db00: 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65  e a root-page be
db10: 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68  longing to anoth
db20: 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
db30: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c  d by the btree l
db40: 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20  ayer.** is also 
db50: 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20  added (this can 
db60: 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
db70: 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
db80: 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
db90: 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c  void destroyTabl
dba0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
dbb0: 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23   Table *pTab){.#
dbc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
dbd0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49  T_AUTOVACUUM.  I
dbe0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
dbf0: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
dc00: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
dc10: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
dc20: 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74 72  Schema);.  destr
dc30: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
dc40: 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69  e, pTab->tnum, i
dc50: 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  Db);.  for(pIdx=
dc60: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
dc70: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
dc80: 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72  Next){.    destr
dc90: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
dca0: 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  e, pIdx->tnum, i
dcb0: 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  Db);.  }.#else. 
dcc0: 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
dcd0: 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d  ase may be auto-
dce0: 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28  vacuum capable (
dcf0: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  if SQLITE_OMIT_A
dd00: 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69  UTOVACUUM.  ** i
dd10: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20  s not defined), 
dd20: 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72  then it is impor
dd30: 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f  tant to call OP_
dd40: 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20  Destroy on the. 
dd50: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e   ** table and in
dd60: 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69  dex root-pages i
dd70: 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e  n order, startin
dd80: 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72  g with the numer
dd90: 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72  ically .  ** lar
dda0: 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
ddb0: 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72  umber. This guar
ddc0: 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65  antees that none
ddd0: 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   of the root-pag
dde0: 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65  es.  ** to be de
ddf0: 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63  stroyed is reloc
de00: 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ated by an earli
de10: 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69  er OP_Destroy. i
de20: 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  .e. if the.  ** 
de30: 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63  following were c
de40: 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oded:.  **.  ** 
de50: 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20  OP_Destroy 4 0. 
de60: 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f   ** ....  ** OP_
de70: 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a  Destroy 5 0.  **
de80: 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70  .  ** and root p
de90: 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74  age 5 happened t
dea0: 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74  o be the largest
deb0: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
dec0: 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  r in the.  ** da
ded0: 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f  tabase, then roo
dee0: 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62  t page 5 would b
def0: 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20  e moved to page 
df00: 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22  4 by the .  ** "
df10: 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20  OP_Destroy 4 0" 
df20: 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73  opcode. The subs
df30: 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72  equent "OP_Destr
df40: 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69  oy 5 0" would hi
df50: 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69  t.  ** a free-li
df60: 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  st page..  */.  
df70: 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d  int iTab = pTab-
df80: 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65  >tnum;.  int iDe
df90: 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20  stroyed = 0;..  
dfa0: 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
dfb0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
dfc0: 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20   int iLargest = 
dfd0: 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73  0;..    if( iDes
dfe0: 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61  troyed==0 || iTa
dff0: 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a  b<iDestroyed ){.
e000: 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
e010: 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20   iTab;.    }.   
e020: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
e030: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
e040: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
e050: 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20  .      int iIdx 
e060: 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20  = pIdx->tnum;.  
e070: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
e080: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
e090: 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
e0a0: 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65    if( (iDestroye
e0b0: 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44  d==0 || (iIdx<iD
e0c0: 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49  estroyed)) && iI
e0d0: 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20  dx>iLargest ){. 
e0e0: 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20         iLargest 
e0f0: 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a  = iIdx;.      }.
e100: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c      }.    if( iL
e110: 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20  argest==0 ){.   
e120: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
e130: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
e140: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
e150: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
e160: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
e170: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 64 65 73  hema);.      des
e180: 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
e190: 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69  rse, iLargest, i
e1a0: 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74  Db);.      iDest
e1b0: 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74  royed = iLargest
e1c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
e1d0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  if.}../*.** This
e1e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
e1f0: 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  ed to do the wor
e200: 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c  k of a DROP TABL
e210: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  E statement..** 
e220: 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  pName is the nam
e230: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
e240: 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f  o be dropped..*/
e250: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
e260: 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
e270: 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
e280: 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77  Name, int isView
e290: 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20  , int noErr){.  
e2a0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56  Table *pTab;.  V
e2b0: 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
e2c0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
e2d0: 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
e2e0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
e2f0: 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 54 68 72  rr || sqlite3Thr
e300: 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28  eadDataReadOnly(
e310: 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  )->mallocFailed 
e320: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
e330: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
e340: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
e350: 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70  ->nSrc==1 );.  p
e360: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
e370: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
e380: 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
e390: 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
e3a0: 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20 69  zDatabase);..  i
e3b0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
e3c0: 20 20 69 66 28 20 6e 6f 45 72 72 20 29 7b 0a 20    if( noErr ){. 
e3d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
e3e0: 72 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  rClear(pParse);.
e3f0: 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 65      }.    goto e
e400: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
e410: 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
e420: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
e430: 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
e440: 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ma);.  assert( i
e450: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
e460: 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65 66 20  >nDb );.#ifndef 
e470: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
e480: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
e490: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
e4a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
e4b0: 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
e4c0: 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  iDb);.    const 
e4d0: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
e4e0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
e4f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
e500: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
e510: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
e520: 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a  zTab, 0, zDb)){.
e530: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
e540: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
e550: 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
e560: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f   ){.      if( !O
e570: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
e580: 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
e590: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
e5a0: 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  OP_TEMP_VIEW;.  
e5b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e5c0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
e5d0: 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20  _DROP_VIEW;.    
e5e0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
e5f0: 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
e600: 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
e610: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
e620: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
e630: 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
e640: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
e650: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
e660: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
e670: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
e680: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
e690: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
e6a0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  ab->zName, 0, zD
e6b0: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
e6c0: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
e6d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e6e0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
e6f0: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
e700: 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e  DELETE, pTab->zN
e710: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
e720: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
e730: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
e740: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
e750: 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c  f( pTab->readOnl
e760: 79 20 7c 7c 20 70 54 61 62 3d 3d 64 62 2d 3e 61  y || pTab==db->a
e770: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
e780: 3e 70 53 65 71 54 61 62 20 29 7b 0a 20 20 20 20  >pSeqTab ){.    
e790: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
e7a0: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
e7b0: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f  s may not be dro
e7c0: 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  pped", pTab->zNa
e7d0: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
e7e0: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
e7f0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
e800: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
e810: 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41  * Ensure DROP TA
e820: 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20  BLE is not used 
e830: 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44  on a view, and D
e840: 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20  ROP VIEW is not 
e850: 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74  used.  ** on a t
e860: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
e870: 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d   isView && pTab-
e880: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
e890: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
e8a0: 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
e8b0: 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65  DROP TABLE to de
e8c0: 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20  lete table %s", 
e8d0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
e8e0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
e8f0: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  _table;.  }.  if
e900: 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61  ( !isView && pTa
e910: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
e920: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
e930: 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
e940: 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65  ROP VIEW to dele
e950: 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61  te view %s", pTa
e960: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
e970: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
e980: 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ble;.  }.#endif.
e990: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
e9a0: 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
e9b0: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
e9c0: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20   master table.  
e9d0: 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  ** on disk..  */
e9e0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
e9f0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
ea00: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72   if( v ){.    Tr
ea10: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
ea20: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
ea30: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
ea40: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
ea50: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
ea60: 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 20  rse, 0, iDb);.. 
ea70: 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74     /* Drop all t
ea80: 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74  riggers associat
ea90: 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
eaa0: 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
eab0: 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73 20   Code.    ** is 
eac0: 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d  generated to rem
ead0: 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ove entries from
eae0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61   sqlite_master a
eaf0: 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c  nd/or.    ** sql
eb00: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
eb10: 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  if required..   
eb20: 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72   */.    pTrigger
eb30: 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65   = pTab->pTrigge
eb40: 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54  r;.    while( pT
eb50: 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20  rigger ){.      
eb60: 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
eb70: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
eb80: 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20  >pSchema || .   
eb90: 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d         pTrigger-
eba0: 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
ebb0: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
ebc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f        sqlite3Dro
ebd0: 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72  pTriggerPtr(pPar
ebe0: 73 65 2c 20 70 54 72 69 67 67 65 72 2c 20 31 29  se, pTrigger, 1)
ebf0: 3b 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72  ;.      pTrigger
ec00: 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
ec10: 78 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  xt;.    }..#ifnd
ec20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
ec30: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
ec40: 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65   /* Remove any e
ec50: 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71  ntries of the sq
ec60: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
ec70: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
ec80: 69 74 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  ith.    ** the t
ec90: 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
eca0: 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  ed. This is done
ecb0: 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c   before the tabl
ecc0: 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 20  e is dropped.   
ecd0: 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65   ** at the btree
ece0: 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20   level, in case 
ecf0: 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
ed00: 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20  nce table needs 
ed10: 74 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61  to.    ** move a
ed20: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
ed30: 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70  e drop (can happ
ed40: 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  en in auto-vacuu
ed50: 6d 20 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a  m mode)..    */.
ed60: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 75      if( pTab->au
ed70: 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 73  toInc ){.      s
ed80: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
ed90: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
eda0: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
edb0: 73 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  s.sqlite_sequenc
edc0: 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  e WHERE name=%Q"
edd0: 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  ,.        pDb->z
ede0: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
edf0: 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
ee00: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
ee10: 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f  Drop all SQLITE_
ee20: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64  MASTER table and
ee30: 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74   index entries t
ee40: 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
ee50: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54  .    ** table. T
ee60: 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20  he program name 
ee70: 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68  loops through th
ee80: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e master table a
ee90: 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a  nd deletes.    *
eea0: 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74  * every row that
eeb0: 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
eec0: 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  le of the same n
eed0: 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62  ame as the one b
eee0: 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70  eing.    ** drop
eef0: 70 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72  ped. Triggers ar
ef00: 65 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61  e handled sepera
ef10: 74 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74  tely because a t
ef20: 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20  rigger can be.  
ef30: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20    ** created in 
ef40: 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
ef50: 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  e that refers to
ef60: 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74   a table in anot
ef70: 68 65 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  her.    ** datab
ef80: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
ef90: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
efa0: 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
efb0: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
efc0: 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c   %Q.%s WHERE tbl
efd0: 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70  _name=%Q and typ
efe0: 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20  e!='trigger'",. 
eff0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d         pDb->zNam
f000: 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
f010: 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  iDb), pTab->zNam
f020: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56  e);.    if( !isV
f030: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 64 65 73  iew ){.      des
f040: 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65  troyTable(pParse
f050: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 0a  , pTab);.    }..
f060: 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
f070: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72  e table entry fr
f080: 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65  om SQLite's inte
f090: 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20  rnal schema and 
f0a0: 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a 20 74 68  modify.    ** th
f0b0: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
f0c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
f0d0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
f0e0: 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c  _DropTable, iDb,
f0f0: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   0, pTab->zName,
f100: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
f110: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
f120: 20 76 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20   v, iDb);.  }.  
f130: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
f140: 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78  ll(db, iDb);..ex
f150: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20  it_drop_table:. 
f160: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
f170: 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a  elete(pName);.}.
f180: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
f190: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
f1a0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f   create a new fo
f1b0: 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65  reign key on the
f1c0: 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e   table.** curren
f1d0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
f1e0: 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f  uction.  pFromCo
f1f0: 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  l determines whi
f200: 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  ch columns.** in
f210: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
f220: 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  le point to the 
f230: 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66  foreign key.  If
f240: 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65   pFromCol==0 the
f250: 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65  n.** connect the
f260: 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74   key to the last
f270: 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64   column inserted
f280: 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61  .  pTo is the na
f290: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62  me of.** the tab
f2a0: 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20  le referred to. 
f2b0: 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73   pToCol is a lis
f2c0: 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  t of tables in t
f2d0: 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20  he other.** pTo 
f2e0: 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66  table that the f
f2f0: 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74  oreign key point
f300: 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e  s to.  flags con
f310: 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66  tains all.** inf
f320: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
f330: 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  he conflict reso
f340: 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
f350: 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69  s specified.** i
f360: 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c  n the ON DELETE,
f370: 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f   ON UPDATE and O
f380: 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73  N INSERT clauses
f390: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20  ..**.** An FKey 
f3a0: 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
f3b0: 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74  ated and added t
f3c0: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
f3d0: 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63  ently.** under c
f3e0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74  onstruction in t
f3f0: 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  he pParse->pNewT
f400: 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65  able field.  The
f410: 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20   new FKey.** is 
f420: 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20  not linked into 
f430: 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69  db->aFKey at thi
f440: 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64  s point - that d
f450: 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a  oes not happen.*
f460: 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 45  * until sqlite3E
f470: 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a  ndTable()..**.**
f480: 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   The foreign key
f490: 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45   is set for IMME
f4a0: 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67  DIATE processing
f4b0: 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  .  A subsequent 
f4c0: 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  call.** to sqlit
f4d0: 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
f4e0: 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65  y() might change
f4f0: 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45   this to DEFERRE
f500: 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  D..*/.void sqlit
f510: 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b  e3CreateForeignK
f520: 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
f530: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
f540: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
f550: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72  .  ExprList *pFr
f560: 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d  omCol,  /* Colum
f570: 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65  ns in this table
f580: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
f590: 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
f5a0: 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20  Token *pTo,     
f5b0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
f5c0: 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
f5d0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
f5e0: 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c  ToCol,    /* Col
f5f0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65  umns in the othe
f600: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  r table */.  int
f610: 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
f620: 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
f630: 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
f640: 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  hms. */.){.#ifnd
f650: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
f660: 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65  OREIGN_KEY.  FKe
f670: 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20  y *pFKey = 0;.  
f680: 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73  Table *p = pPars
f690: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
f6a0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  int nByte;.  int
f6b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a   i;.  int nCol;.
f6c0: 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73    char *z;..  as
f6d0: 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a  sert( pTo!=0 );.
f6e0: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50    if( p==0 || pP
f6f0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
f700: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20  o fk_end;.  if( 
f710: 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
f720: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
f730: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28  >nCol-1;.    if(
f740: 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66   iCol<0 ) goto f
f750: 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70  k_end;.    if( p
f760: 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
f770: 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
f780: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
f790: 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65  sg(pParse, "fore
f7a0: 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20  ign key on %s". 
f7b0: 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64          " should
f7c0: 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20   reference only 
f7d0: 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  one column of ta
f7e0: 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20  ble %T",.       
f7f0: 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e    p->aCol[iCol].
f800: 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20  zName, pTo);.   
f810: 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
f820: 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d      }.    nCol =
f830: 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
f840: 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
f850: 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f  ->nExpr!=pFromCo
f860: 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  l->nExpr ){.    
f870: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f880: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
f890: 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d  "number of colum
f8a0: 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  ns in foreign ke
f8b0: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
f8c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22   the number of "
f8d0: 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e  .        "column
f8e0: 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e  s in the referen
f8f0: 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20  ced table");.   
f900: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
f910: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20  }else{.    nCol 
f920: 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  = pFromCol->nExp
f930: 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  r;.  }.  nByte =
f940: 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20   sizeof(*pFKey) 
f950: 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46  + nCol*sizeof(pF
f960: 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20  Key->aCol[0]) + 
f970: 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66  pTo->n + 1;.  if
f980: 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
f990: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f  for(i=0; i<pToCo
f9a0: 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  l->nExpr; i++){.
f9b0: 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73        nByte += s
f9c0: 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b  trlen(pToCol->a[
f9d0: 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
f9e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
f9f0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
fa00: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
fa10: 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20  pFKey==0 ) goto 
fa20: 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d  fk_end;.  pFKey-
fa30: 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46  >pFrom = p;.  pF
fa40: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d  Key->pNextFrom =
fa50: 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d   p->pFKey;.  z =
fa60: 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31   (char*)&pFKey[1
fa70: 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  ];.  pFKey->aCol
fa80: 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d   = (struct sColM
fa90: 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69  ap*)z;.  z += si
faa0: 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c  zeof(struct sCol
fab0: 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b  Map)*nCol;.  pFK
fac0: 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d  ey->zTo = z;.  m
fad0: 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c  emcpy(z, pTo->z,
fae0: 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54   pTo->n);.  z[pT
faf0: 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b  o->n] = 0;.  z +
fb00: 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46  = pTo->n+1;.  pF
fb10: 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30  Key->pNextTo = 0
fb20: 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20  ;.  pFKey->nCol 
fb30: 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46  = nCol;.  if( pF
fb40: 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
fb50: 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e   pFKey->aCol[0].
fb60: 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  iFrom = p->nCol-
fb70: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
fb80: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
fb90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
fba0: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
fbb0: 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b  0; j<p->nCol; j+
fbc0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
fbd0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
fbe0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
fbf0: 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
fc00: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
fc10: 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43         pFKey->aC
fc20: 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b  ol[i].iFrom = j;
fc30: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
fc40: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fc50: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e    }.      if( j>
fc60: 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  =p->nCol ){.    
fc70: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
fc80: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
fc90: 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20         "unknown 
fca0: 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e  column \"%s\" in
fcb0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
fcc0: 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20  inition", .     
fcd0: 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61       pFromCol->a
fce0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
fcf0: 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
fd00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
fd10: 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20   }.  if( pToCol 
fd20: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
fd30: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
fd40: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
fd50: 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  en(pToCol->a[i].
fd60: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
fd70: 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
fd80: 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d  l = z;.      mem
fd90: 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  cpy(z, pToCol->a
fda0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  [i].zName, n);. 
fdb0: 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20       z[n] = 0;. 
fdc0: 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20       z += n+1;. 
fdd0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
fde0: 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30  ->isDeferred = 0
fdf0: 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74  ;.  pFKey->delet
fe00: 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20  eConf = flags & 
fe10: 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75  0xff;.  pFKey->u
fe20: 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61  pdateConf = (fla
fe30: 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66  gs >> 8 ) & 0xff
fe40: 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72  ;.  pFKey->inser
fe50: 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e  tConf = (flags >
fe60: 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a  > 16 ) & 0xff;..
fe70: 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
fe80: 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
fe90: 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
fea0: 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
feb0: 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
fec0: 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
fed0: 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
fee0: 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 23 65 6e  Free(pFKey);.#en
fef0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
ff00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
ff10: 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71  IGN_KEY) */.  sq
ff20: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
ff30: 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20  ete(pFromCol);. 
ff40: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ff50: 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a  Delete(pToCol);.
ff60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
ff70: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
ff80: 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c  when an INITIALL
ff90: 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49  Y IMMEDIATE or I
ffa0: 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
ffb0: 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73  D.** clause is s
ffc0: 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61  een as part of a
ffd0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
ffe0: 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73  inition.  The is
fff0: 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61  Deferred.** para
10000 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49  meter is 1 for I
10010 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
10020 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54  D and 0 for INIT
10030 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e  IALLY IMMEDIATE.
10040 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72  .** The behavior
10050 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
10060 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f  ently created fo
10070 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a  reign key is adj
10080 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69  usted.** accordi
10090 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ngly..*/.void sq
100a0 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
100b0 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72  nKey(Parse *pPar
100c0 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72  se, int isDeferr
100d0 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ed){.#ifndef SQL
100e0 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
100f0 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54  _KEY.  Table *pT
10100 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  ab;.  FKey *pFKe
10110 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d  y;.  if( (pTab =
10120 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
10130 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79  le)==0 || (pFKey
10140 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d   = pTab->pFKey)=
10150 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
10160 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
10170 20 3d 20 69 73 44 65 66 65 72 72 65 64 3b 0a 23   = isDeferred;.#
10180 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  endif.}../*.** G
10190 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
101a0 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64  t will erase and
101b0 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70   refill index *p
101c0 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  Idx.  This is.**
101d0 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c   used to initial
101e0 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61  ize a newly crea
101f0 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20  ted index or to 
10200 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  recompute the.**
10210 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69   content of an i
10220 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65  ndex in response
10230 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f   to a REINDEX co
10240 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20  mmand..**.** if 
10250 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e  memRootPage is n
10260 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20  ot negative, it 
10270 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 69  means that the i
10280 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a  ndex is newly.**
10290 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 6d   created.  The m
102a0 65 6d 6f 72 79 20 63 65 6c 6c 20 73 70 65 63 69  emory cell speci
102b0 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50  fied by memRootP
102c0 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  age contains the
102d0 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  .** root page nu
102e0 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
102f0 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61  x.  If memRootPa
10300 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
10310 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65  then.** the inde
10320 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
10330 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65   and must be cle
10340 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ared before bein
10350 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a  g refilled and.*
10360 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * the root page 
10370 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
10380 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  dex is taken fro
10390 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a  m pIndex->tnum..
103a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
103b0 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
103c0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
103d0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20   Index *pIndex, 
103e0 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29  int memRootPage)
103f0 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
10400 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
10410 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  ;  /* The table 
10420 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20  that is indexed 
10430 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
10440 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 20 20 20  pParse->nTab;   
10450 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
10460 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61  sor used for pTa
10470 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20  b */.  int iIdx 
10480 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 31  = pParse->nTab+1
10490 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63  ;     /* Btree c
104a0 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
104b0 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61  Index */.  int a
104c0 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  ddr1;           
104d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
104e0 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c  ress of top of l
104f0 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75  oop */.  int tnu
10500 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
10510 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
10520 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  page of index */
10530 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10550 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
10560 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72  de into this vir
10570 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a  tual machine */.
10580 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b    KeyInfo *pKey;
10590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105a0 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20   /* KeyInfo for 
105b0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
105c0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
105d0 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
105e0 2d 3e 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  ->db, pIndex->pS
105f0 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
10600 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
10610 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
10620 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
10630 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
10640 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78  _REINDEX, pIndex
10650 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20  ->zName, 0,.    
10660 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44    pParse->db->aD
10670 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29  b[iDb].zName ) )
10680 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
10690 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
106a0 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  equire a write-l
106b0 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
106c0 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73   to perform this
106d0 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
106e0 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
106f0 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
10700 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61  ab->tnum, 1, pTa
10710 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20  b->zName);..  v 
10720 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
10730 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
10740 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
10750 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
10760 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
10770 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10780 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 52 6f  P_MemLoad, memRo
10790 6f 74 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  otPage, 0);.    
107a0 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tnum = 0;.  }els
107b0 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49  e{.    tnum = pI
107c0 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20  ndex->tnum;.    
107d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
107e0 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e  (v, OP_Clear, tn
107f0 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20  um, iDb);.  }.  
10800 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10810 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
10820 69 44 62 2c 20 30 29 3b 0a 20 20 70 4b 65 79 20  iDb, 0);.  pKey 
10830 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
10840 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
10850 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  ndex);.  sqlite3
10860 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
10870 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74  enWrite, iIdx, t
10880 6e 75 6d 2c 20 28 63 68 61 72 20 2a 29 70 4b 65  num, (char *)pKe
10890 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  y, P3_KEYINFO_HA
108a0 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74 65  NDOFF);.  sqlite
108b0 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
108c0 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
108d0 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
108e0 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
108f0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10900 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
10910 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65   0);.  sqlite3Ge
10920 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 76  nerateIndexKey(v
10930 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62 29 3b  , pIndex, iTab);
10940 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f  .  if( pIndex->o
10950 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
10960 29 7b 0a 20 20 20 20 69 6e 74 20 63 75 72 61 64  ){.    int curad
10970 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
10980 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
10990 20 20 20 20 69 6e 74 20 61 64 64 72 32 20 3d 20      int addr2 = 
109a0 63 75 72 61 64 64 72 2b 34 3b 0a 20 20 20 20 73  curaddr+4;.    s
109b0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
109c0 50 32 28 76 2c 20 63 75 72 61 64 64 72 2d 31 2c  P2(v, curaddr-1,
109d0 20 61 64 64 72 32 29 3b 0a 20 20 20 20 73 71 6c   addr2);.    sql
109e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
109f0 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c   OP_Rowid, iTab,
10a00 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
10a10 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10a20 41 64 64 49 6d 6d 2c 20 31 2c 20 30 29 3b 0a 20  AddImm, 1, 0);. 
10a30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10a40 64 4f 70 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71  dOp(v, OP_IsUniq
10a50 75 65 2c 20 69 49 64 78 2c 20 61 64 64 72 32 29  ue, iIdx, addr2)
10a60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10a70 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  eOp3(v, OP_Halt,
10a80 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
10a90 4e 54 2c 20 4f 45 5f 41 62 6f 72 74 2c 0a 20 20  NT, OE_Abort,.  
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ab0 20 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d    "indexed colum
10ac0 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75  ns are not uniqu
10ad0 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  e", P3_STATIC);.
10ae0 20 20 20 20 61 73 73 65 72 74 28 20 61 64 64 72      assert( addr
10af0 32 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 43 75  2==sqlite3VdbeCu
10b00 72 72 65 6e 74 41 64 64 72 28 76 29 20 29 3b 0a  rrentAddr(v) );.
10b10 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
10b20 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
10b30 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 30 29  Insert, iIdx, 0)
10b40 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
10b50 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
10b60 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b   iTab, addr1+1);
10b70 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
10b80 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
10b90 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
10ba0 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
10bb0 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 73 71  , iTab, 0);.  sq
10bc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10bd0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78  , OP_Close, iIdx
10be0 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  , 0);.}../*.** C
10bf0 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  reate a new inde
10c00 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62  x for an SQL tab
10c10 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d  le.  pName1.pNam
10c20 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  e2 is the name o
10c30 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  f the index .** 
10c40 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20  and pTblList is 
10c50 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
10c60 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
10c70 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
10c80 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
10c90 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
10ca0 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
10cb0 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
10cc0 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
10cd0 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
10ce0 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
10cf0 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
10d00 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
10d10 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
10d20 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
10d30 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
10d40 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
10d50 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
10d60 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
10d70 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
10d80 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
10d90 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
10da0 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
10db0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
10dc0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
10dd0 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
10de0 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
10df0 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
10e00 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
10e10 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
10e20 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
10e30 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
10e40 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
10e50 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
10e60 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10e70 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
10e80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10e90 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61    /* All informa
10ea0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
10eb0 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  parse */.  Token
10ec0 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
10ed0 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69   First part of i
10ee0 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
10ef0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  e NULL */.  Toke
10f00 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
10f10 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
10f20 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
10f30 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72   be NULL */.  Sr
10f40 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c  cList *pTblName,
10f50 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64   /* Table to ind
10f60 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e  ex. Use pParse->
10f70 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a  pNewTable if 0 *
10f80 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
10f90 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74  ist,   /* A list
10fa0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
10fb0 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
10fc0 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
10fd0 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
10fe0 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
10ff0 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
11000 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
11010 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  art,     /* The 
11020 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
11030 74 20 62 65 67 69 6e 73 20 61 20 43 52 45 41 54  t begins a CREAT
11040 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
11050 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45  t */.  Token *pE
11060 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  nd,       /* The
11070 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73   ")" that closes
11080 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
11090 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  X statement */. 
110a0 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20   int sortOrder, 
110b0 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65      /* Sort orde
110c0 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79  r of primary key
110d0 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c   when pList==NUL
110e0 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74  L */.  int ifNot
110f0 45 78 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69  Exist     /* Omi
11100 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78  t error if index
11110 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
11120 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
11130 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Tab = 0;     /* 
11140 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
11150 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
11160 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a  pIndex = 0;   /*
11170 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
11180 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68   created */.  ch
11190 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20  ar *zName = 0;  
111a0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
111b0 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
111c0 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
111d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
111e0 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61  haracters in zNa
111f0 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  me */.  int i, j
11200 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64  ;.  Token nullId
11210 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65  ;        /* Fake
11220 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d   token for an em
11230 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20  pty ID list */. 
11240 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20   DbFixer sFix;  
11250 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73        /* For ass
11260 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  igning database 
11270 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20  names to pTable 
11280 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
11290 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74  erMask;   /* 1 t
112a0 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20  o honor DESC in 
112b0 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e  index.  0 to ign
112c0 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ore. */.  sqlite
112d0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
112e0 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  db;.  Db *pDb;  
112f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11300 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65  e specific table
11310 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
11320 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65  indexed database
11330 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
11340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
11350 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
11360 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e  ase that is bein
11370 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54  g written */.  T
11380 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
11390 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
113a0 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  ed name of the i
113b0 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a  ndex to create *
113c0 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  /.  struct ExprL
113d0 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49  ist_item *pListI
113e0 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  tem; /* For loop
113f0 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a  ing over pList *
11400 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  /.  int nCol;.  
11410 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a  int nExtra = 0;.
11420 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a    char *zExtra;.
11430 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
11440 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 54 68  Err || sqlite3Th
11450 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79  readDataReadOnly
11460 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  ()->mallocFailed
11470 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
11480 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11490 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
114a0 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68  ind the table th
114b0 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
114c0 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72  xed.  Return ear
114d0 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ly if not found.
114e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c  .  */.  if( pTbl
114f0 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20  Name!=0 ){..    
11500 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70  /* Use the two-p
11510 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74  art index name t
11520 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
11530 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
11540 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74   to search for t
11550 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20  he table. 'Fix' 
11560 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  the table name t
11570 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a  o this db.    **
11580 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20   before looking 
11590 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  up the table..  
115a0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
115b0 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65   pName1 && pName
115c0 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  2 );.    iDb = s
115d0 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
115e0 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
115f0 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
11600 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
11610 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
11620 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 23 69 66 6e  ate_index;..#ifn
11630 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11640 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66  TEMPDB.    /* If
11650 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20   the index name 
11660 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
11670 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 68   check if the th
11680 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  e table.    ** i
11690 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20  s a temp table. 
116a0 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64  If so, set the d
116b0 61 74 61 62 61 73 65 20 74 6f 20 31 2e 0a 20 20  atabase to 1..  
116c0 20 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20    */.    pTab = 
116d0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f  sqlite3SrcListLo
116e0 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62  okup(pParse, pTb
116f0 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  lName);.    if( 
11700 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32  pName2 && pName2
11710 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26  ->n==0 && pTab &
11720 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d  & pTab->pSchema=
11730 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  =db->aDb[1].pSch
11740 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 69 44 62  ema ){.      iDb
11750 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
11760 69 66 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69  if..    if( sqli
11770 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
11780 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
11790 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26  index", pName) &
117a0 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  &.        sqlite
117b0 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69  3FixSrcList(&sFi
117c0 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20  x, pTblName).   
117d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63   ){.      /* Bec
117e0 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20  ause the parser 
117f0 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e  constructs pTblN
11800 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  ame from a singl
11810 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20  e identifier,.  
11820 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69      ** sqlite3Fi
11830 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76  xSrcList can nev
11840 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20  er fail. */.    
11850 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20    assert(0);.   
11860 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71   }.    pTab = sq
11870 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
11880 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d  (pParse, pTblNam
11890 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a  e->a[0].zName, .
118a0 20 20 20 20 20 20 20 20 70 54 62 6c 4e 61 6d 65          pTblName
118b0 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
118c0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62  );.    if( !pTab
118d0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
118e0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61  ate_index;.    a
118f0 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69  ssert( db->aDb[i
11900 44 62 5d 2e 70 53 63 68 65 6d 61 3d 3d 70 54 61  Db].pSchema==pTa
11910 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
11920 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
11930 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  t( pName==0 );. 
11940 20 20 20 70 54 61 62 20 3d 20 70 50 61 72 73 65     pTab = pParse
11950 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20  ->pNewTable;.   
11960 20 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74   if( !pTab ) got
11970 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
11980 64 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  dex;.    iDb = s
11990 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
119a0 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
119b0 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44  chema);.  }.  pD
119c0 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
119d0 5d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  ];..  if( pTab==
119e0 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
119f0 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  r ) goto exit_cr
11a00 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66  eate_index;.  if
11a10 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79  ( pTab->readOnly
11a20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
11a30 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11a40 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f  "table %s may no
11a50 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70  t be indexed", p
11a60 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
11a70 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
11a80 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66  e_index;.  }.#if
11a90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11aa0 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62  _VIEW.  if( pTab
11ab0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
11ac0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11ad0 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20  (pParse, "views 
11ae0 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
11af0 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ed");.    goto e
11b00 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
11b10 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
11b20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
11b30 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
11b40 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  ex.  Make sure t
11b50 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  here is not alre
11b60 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a  ady another.  **
11b70 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
11b80 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
11b90 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  me.  .  **.  ** 
11ba0 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77  Exception:  If w
11bb0 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
11bc0 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61  e names of perma
11bd0 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f  nent indices fro
11be0 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  m the.  ** sqlit
11bf0 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28  e_master table (
11c00 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68  because some oth
11c10 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67  er process chang
11c20 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61  ed the schema) a
11c30 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74  nd.  ** one of t
11c40 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63  he index names c
11c50 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65  ollides with the
11c60 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f   name of a tempo
11c70 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20  rary table or.  
11c80 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77  ** index, then w
11c90 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
11ca0 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20  to process this 
11cb0 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
11cc0 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20   If pName==0 it 
11cd0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72  means that we ar
11ce0 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77  e.  ** dealing w
11cf0 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65  ith a primary ke
11d00 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  y or UNIQUE cons
11d10 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65  traint.  We have
11d20 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20   to invent our. 
11d30 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20   ** own name..  
11d40 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29  */.  if( pName )
11d50 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
11d60 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
11d70 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  en(pName);.    i
11d80 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
11d90 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
11da0 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65  pParse) ) goto e
11db0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
11dc0 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
11dd0 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
11de0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
11df0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
11e00 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
11e10 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
11e20 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67  Name) ){.      g
11e30 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
11e40 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
11e50 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
11e60 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  usy ){.      if(
11e70 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
11e80 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
11e90 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69  arse) ) goto exi
11ea0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11eb0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
11ec0 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
11ed0 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65  Name, pDb->zName
11ee0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
11ef0 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20  if( !ifNotExist 
11f00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
11f10 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11f20 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61  rse, "index %s a
11f30 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
11f40 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
11f50 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  }.        goto e
11f60 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
11f70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11f80 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
11f90 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
11fa0 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)!=0 ){.       
11fb0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11fc0 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
11fd0 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62  is already a tab
11fe0 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  le named %s", zN
11ff0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
12000 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
12010 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
12020 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
12030 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
12040 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49      int n;.    I
12050 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20  ndex *pLoop;.   
12060 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d   for(pLoop=pTab-
12070 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c  >pIndex, n=1; pL
12080 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
12090 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a  ->pNext, n++){}.
120a0 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
120b0 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20 20 20 20 7a  ,"_%d",n);.    z
120c0 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71  Name = 0;.    sq
120d0 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
120e0 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61  zName, "sqlite_a
120f0 75 74 6f 69 6e 64 65 78 5f 22 2c 20 70 54 61 62  utoindex_", pTab
12100 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66 2c 20 28  ->zName, zBuf, (
12110 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 69 66  char*)0);.    if
12120 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
12130 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
12140 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  dex;.  }..  /* C
12150 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69  heck for authori
12160 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65  zation to create
12170 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a   an index..  */.
12180 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12190 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
121a0 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  N.  {.    const 
121b0 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d  char *zDb = pDb-
121c0 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  >zName;.    if( 
121d0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
121e0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
121f0 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
12200 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44  ABLE(iDb), 0, zD
12210 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
12220 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
12230 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  ex;.    }.    i 
12240 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
12250 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21  INDEX;.    if( !
12260 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
12270 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49  Db==1 ) i = SQLI
12280 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
12290 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
122a0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
122b0 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c  Parse, i, zName,
122c0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
122d0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
122e0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
122f0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
12300 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c  ndif..  /* If pL
12310 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73  ist==0, it means
12320 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
12330 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65  s called to make
12340 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20   a primary.  ** 
12350 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  key out of the l
12360 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ast column added
12370 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e   to the table un
12380 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
12390 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65  ..  ** So create
123a0 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20   a fake list to 
123b0 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20  simulate this.. 
123c0 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
123d0 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64  =0 ){.    nullId
123e0 2e 7a 20 3d 20 28 75 38 2a 29 70 54 61 62 2d 3e  .z = (u8*)pTab->
123f0 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d  aCol[pTab->nCol-
12400 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75  1].zName;.    nu
12410 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28  llId.n = strlen(
12420 28 63 68 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29  (char*)nullId.z)
12430 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
12440 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
12450 65 6e 64 28 30 2c 20 30 2c 20 26 6e 75 6c 6c 49  end(0, 0, &nullI
12460 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  d);.    if( pLis
12470 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  t==0 ) goto exit
12480 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
12490 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73     pList->a[0].s
124a0 6f 72 74 4f 72 64 65 72 20 3d 20 73 6f 72 74 4f  ortOrder = sortO
124b0 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rder;.  }..  /* 
124c0 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
124d0 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70 61  any bytes of spa
124e0 63 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ce are required 
124f0 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69  to store explici
12500 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69  tly.  ** specifi
12510 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
12520 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  uence names..  *
12530 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
12540 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
12550 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
12560 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
12570 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
12580 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 6e  pExpr ){.      n
12590 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20 73 74  Extra += (1 + st
125a0 72 6c 65 6e 28 70 45 78 70 72 2d 3e 70 43 6f 6c  rlen(pExpr->pCol
125b0 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  l->zName));.    
125c0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a  }.  }..  /* .  *
125d0 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  * Allocate the i
125e0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
125f0 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20  .  */.  nName = 
12600 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
12610 20 6e 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e   nCol = pList->n
12620 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 20 3d  Expr;.  pIndex =
12630 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 0a   sqliteMalloc( .
12640 20 20 20 20 20 20 73 69 7a 65 6f 66 28 49 6e 64        sizeof(Ind
12650 65 78 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  ex) +           
12660 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75     /* Index stru
12670 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20  cture  */.      
12680 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c  sizeof(int)*nCol
12690 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
126a0 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20  Index.aiColumn  
126b0 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
126c0 28 69 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b  (int)*(nCol+1) +
126d0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
126e0 61 69 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20 20  aiRowEst   */.  
126f0 20 20 20 20 73 69 7a 65 6f 66 28 63 68 61 72 20      sizeof(char 
12700 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20  *)*nCol +       
12710 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c   /* Index.azColl
12720 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69       */.      si
12730 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 20 2b 20  zeof(u8)*nCol + 
12740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
12750 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a  dex.aSortOrder *
12760 2f 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20  /.      nName + 
12770 31 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  1 +             
12780 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 7a 4e       /* Index.zN
12790 61 6d 65 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ame      */.    
127a0 20 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20    nExtra        
127b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
127c0 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  * Collation sequ
127d0 65 6e 63 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  ence names */.  
127e0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
127f0 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e  ThreadDataReadOn
12800 6c 79 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ly()->mallocFail
12810 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  ed ) goto exit_c
12820 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70  reate_index;.  p
12830 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20  Index->aiColumn 
12840 3d 20 28 69 6e 74 20 2a 29 28 26 70 49 6e 64 65  = (int *)(&pInde
12850 78 5b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d  x[1]);.  pIndex-
12860 3e 61 69 52 6f 77 45 73 74 20 3d 20 28 69 6e 74  >aiRowEst = (int
12870 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69 43   *)(&pIndex->aiC
12880 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d 29 3b 0a 20 20  olumn[nCol]);.  
12890 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d  pIndex->azColl =
128a0 20 28 63 68 61 72 20 2a 2a 29 28 26 70 49 6e 64   (char **)(&pInd
128b0 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b 6e 43 6f  ex->aiRowEst[nCo
128c0 6c 2b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d  l+1]);.  pIndex-
128d0 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
128e0 38 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a  8 *)(&pIndex->az
128f0 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70  Coll[nCol]);.  p
12900 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28  Index->zName = (
12910 63 68 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d  char *)(&pIndex-
12920 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c  >aSortOrder[nCol
12930 5d 29 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 28  ]);.  zExtra = (
12940 63 68 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d  char *)(&pIndex-
12950 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29  >zName[nName+1])
12960 3b 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64 65  ;.  strcpy(pInde
12970 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  x->zName, zName)
12980 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  ;.  pIndex->pTab
12990 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e  le = pTab;.  pIn
129a0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70  dex->nColumn = p
129b0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
129c0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d  Index->onError =
129d0 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64   onError;.  pInd
129e0 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20  ex->autoIndex = 
129f0 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64  pName==0;.  pInd
12a00 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62  ex->pSchema = db
12a10 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
12a20 6d 61 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ma;..  /* Check 
12a30 74 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f  to see if we sho
12a40 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72  uld honor DESC r
12a50 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78  equests on index
12a60 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20   columns.  */.  
12a70 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
12a80 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ->file_format>=4
12a90 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65   ){.    sortOrde
12aa0 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a  rMask = -1;   /*
12ab0 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20   Honor DESC */. 
12ac0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74   }else{.    sort
12ad0 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20  OrderMask = 0;  
12ae0 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43    /* Ignore DESC
12af0 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63   */.  }..  /* Sc
12b00 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  an the names of 
12b10 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
12b20 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
12b30 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20  ndexed and.  ** 
12b40 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  load the column 
12b50 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65  indices into the
12b60 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
12b70 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  .  Report an err
12b80 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63  or.  ** if any c
12b90 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75  olumn is not fou
12ba0 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  nd..  */.  for(i
12bb0 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c  =0, pListItem=pL
12bc0 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
12bd0 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69  >nExpr; i++, pLi
12be0 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63  stItem++){.    c
12bf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e  onst char *zColN
12c00 61 6d 65 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  ame = pListItem-
12c10 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 75  >zName;.    Colu
12c20 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 20  mn *pTabCol;.   
12c30 20 69 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f   int requestedSo
12c40 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 63 68 61  rtOrder;.    cha
12c50 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20  r *zColl;       
12c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
12c70 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
12c80 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d  e */..    for(j=
12c90 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d  0, pTabCol=pTab-
12ca0 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e  >aCol; j<pTab->n
12cb0 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43 6f  Col; j++, pTabCo
12cc0 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l++){.      if( 
12cd0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
12ce0 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f 6c  ColName, pTabCol
12cf0 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ->zName)==0 ) br
12d00 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
12d10 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c  f( j>=pTab->nCol
12d20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12d30 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
12d40 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20  , "table %s has 
12d50 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20  no column named 
12d60 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
12d70 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61  b->zName, zColNa
12d80 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
12d90 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12da0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
12db0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
12dc0 20 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c   = j;.    if( pL
12dd0 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 20 29  istItem->pExpr )
12de0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
12df0 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
12e00 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20  ->pColl );.     
12e10 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b   zColl = zExtra;
12e20 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 7a 45  .      strcpy(zE
12e30 78 74 72 61 2c 20 70 4c 69 73 74 49 74 65 6d 2d  xtra, pListItem-
12e40 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a  >pExpr->pColl->z
12e50 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 45 78  Name);.      zEx
12e60 74 72 61 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a  tra += (strlen(z
12e70 43 6f 6c 6c 29 20 2b 20 31 29 3b 0a 20 20 20 20  Coll) + 1);.    
12e80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43 6f  }else{.      zCo
12e90 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ll = pTab->aCol[
12ea0 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  j].zColl;.      
12eb0 69 66 28 20 21 7a 43 6f 6c 6c 20 29 7b 0a 20 20  if( !zColl ){.  
12ec0 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 64 62        zColl = db
12ed0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e 61  ->pDfltColl->zNa
12ee0 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  me;.      }.    
12ef0 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  }.    if( !db->i
12f00 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c  nit.busy && !sql
12f10 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
12f20 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c  q(pParse, zColl,
12f30 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 67 6f   -1) ){.      go
12f40 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
12f50 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
12f60 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
12f70 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72  ] = zColl;.    r
12f80 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
12f90 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73  r = pListItem->s
12fa0 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f  ortOrder & sortO
12fb0 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49  rderMask;.    pI
12fc0 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
12fd0 5b 69 5d 20 3d 20 72 65 71 75 65 73 74 65 64 53  [i] = requestedS
12fe0 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20  ortOrder;.  }.  
12ff0 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f  sqlite3DefaultRo
13000 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 0a 20  wEst(pIndex);.. 
13010 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73   if( pTab==pPars
13020 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a  e->pNewTable ){.
13030 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74      /* This rout
13040 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c  ine has been cal
13050 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e  led to create an
13060 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
13070 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73   as a.    ** res
13080 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59  ult of a PRIMARY
13090 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
130a0 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d  lause on a colum
130b0 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72  n definition, or
130c0 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52  .    ** a PRIMAR
130d0 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
130e0 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67  clause following
130f0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69   the column defi
13100 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20  nitions..    ** 
13110 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20  i.e. one of:.   
13120 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54   **.    ** CREAT
13130 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d  E TABLE t(x PRIM
13140 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20  ARY KEY, y);.   
13150 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
13160 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28   t(x, y, UNIQUE(
13170 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20  x, y));.    **. 
13180 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79     ** Either way
13190 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
131a0 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
131b0 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e 20  ady has such an 
131c0 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a  index. If.    **
131d0 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65   so, don't bothe
131e0 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73 20  r creating this 
131f0 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61  one. This only a
13200 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a  pplies to.    **
13210 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
13220 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20  reated indices. 
13230 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20  Users can do as 
13240 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a 20  they wish with. 
13250 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69     ** explicit i
13260 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  ndices..    */. 
13270 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
13280 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
13290 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
132a0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
132b0 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b  t){.      int k;
132c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
132d0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  Idx->onError!=OE
132e0 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20 61  _None );.      a
132f0 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 75 74  ssert( pIdx->aut
13300 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20 20 20 20  oIndex );.      
13310 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e  assert( pIndex->
13320 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
13330 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70   );..      if( p
13340 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49  Idx->nColumn!=pI
13350 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20  ndex->nColumn ) 
13360 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
13370 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d  for(k=0; k<pIdx-
13380 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a  >nColumn; k++){.
13390 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
133a0 61 72 20 2a 7a 31 20 3d 20 70 49 64 78 2d 3e 61  ar *z1 = pIdx->a
133b0 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  zColl[k];.      
133c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
133d0 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
133e0 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[k];.        if
133f0 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
13400 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43  [k]!=pIndex->aiC
13410 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b  olumn[k] ) break
13420 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
13430 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6b  dx->aSortOrder[k
13440 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74  ]!=pIndex->aSort
13450 4f 72 64 65 72 5b 6b 5d 20 29 20 62 72 65 61 6b  Order[k] ) break
13460 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 31  ;.        if( z1
13470 21 3d 7a 32 20 26 26 20 73 71 6c 69 74 65 33 53  !=z2 && sqlite3S
13480 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29  trICmp(z1, z2) )
13490 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
134a0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64        if( k==pId
134b0 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  x->nColumn ){.  
134c0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
134d0 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d  onError!=pIndex-
134e0 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  >onError ){.    
134f0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f        /* This co
13500 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73  nstraint creates
13510 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20   the same index 
13520 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  as a previous.  
13530 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
13540 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20  raint specified 
13550 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65  somewhere in the
13560 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
13570 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20  atement..       
13580 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68     ** However th
13590 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  e ON CONFLICT cl
135a0 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72  auses are differ
135b0 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69  ent. If both thi
135c0 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
135d0 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74  constraint and t
135e0 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69  he previous equi
135f0 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e  valent constrain
13600 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a  t have explicit.
13610 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20            ** ON 
13620 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
13630 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f   this is an erro
13640 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  r. Otherwise, us
13650 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  e the.          
13660 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  ** explicitly sp
13670 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 75  ecified behaviou
13680 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e  r for the index.
13690 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
136a0 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49          if( !(pI
136b0 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
136c0 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65  Default || pInde
136d0 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
136e0 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20  efault) ){.     
136f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
13700 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
13710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13720 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20  "conflicting ON 
13730 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
13740 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b   specified", 0);
13750 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
13760 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
13770 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
13780 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ault ){.        
13790 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f      pIdx->onErro
137a0 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  r = pIndex->onEr
137b0 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ror;.          }
137c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
137d0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
137e0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
137f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
13800 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
13810 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
13820 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64  to its table and
13830 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20   to the other.  
13840 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
13850 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73  abase structures
13860 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  . .  */.  if( db
13870 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
13880 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
13890 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
138a0 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e  Insert(&pIndex->
138b0 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
138c0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
138d0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64              pInd
138e0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  ex->zName, strle
138f0 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  n(pIndex->zName)
13900 2b 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20  +1, pIndex);.   
13910 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
13920 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65  assert( p==pInde
13930 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  x );  /* Malloc 
13940 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
13950 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   */.      goto e
13960 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13970 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
13980 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
13990 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
139a0 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21     if( pTblName!
139b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  =0 ){.      pInd
139c0 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69  ex->tnum = db->i
139d0 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20  nit.newTnum;.   
139e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
139f0 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  the db->init.bus
13a00 79 20 69 73 20 30 20 74 68 65 6e 20 63 72 65 61  y is 0 then crea
13a10 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  te the index on 
13a20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  disk.  This.  **
13a30 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e   involves writin
13a40 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f  g the index into
13a50 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
13a60 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e  e and filling in
13a70 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
13a80 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
13a90 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e   table contents.
13aa0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64  .  **.  ** The d
13ab0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
13ac0 30 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  0 when the user 
13ad0 66 69 72 73 74 20 65 6e 74 65 72 73 20 61 20 43  first enters a C
13ae0 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a  REATE INDEX .  *
13af0 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e  * command.  db->
13b00 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 77  init.busy is 1 w
13b10 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 69  hen a database i
13b20 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20  s opened and .  
13b30 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  ** CREATE INDEX 
13b40 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72  statements are r
13b50 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ead out of the m
13b60 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e  aster table.  In
13b70 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72  .  ** the latter
13b80 20 63 61 73 65 20 74 68 65 20 69 6e 64 65 78 20   case the index 
13b90 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 6f  already exists o
13ba0 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73  n disk, which is
13bb0 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e   why.  ** we don
13bc0 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65  't want to recre
13bd0 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a  ate it..  **.  *
13be0 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  * If pTblName==0
13bf0 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69   it means this i
13c00 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65  ndex is generate
13c10 64 20 61 73 20 61 20 70 72 69 6d 61 72 79 20 6b  d as a primary k
13c20 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55  ey.  ** or UNIQU
13c30 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20  E constraint of 
13c40 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
13c50 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65  tatement.  Since
13c60 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20   the table.  ** 
13c70 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72  has just been cr
13c80 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69  eated, it contai
13c90 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74  ns no data and t
13ca0 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c  he index initial
13cb0 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65  ization.  ** ste
13cc0 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64  p can be skipped
13cd0 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
13ce0 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
13cf0 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =0 ){.    Vdbe *
13d00 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  v;.    char *zSt
13d10 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d  mt;.    int iMem
13d20 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
13d30 2b 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  +;..    v = sqli
13d40 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
13d50 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
13d60 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
13d70 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20 20  ate_index;...   
13d80 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72   /* Create the r
13d90 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20  ootpage for the 
13da0 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20  index.    */.   
13db0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
13dc0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
13dd0 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20  se, 1, iDb);.   
13de0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13df0 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e  p(v, OP_CreateIn
13e00 64 65 78 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  dex, iDb, 0);.  
13e10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13e20 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
13e30 65 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 0a 20 20  e, iMem, 0);..  
13e40 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20    /* Gather the 
13e50 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
13e60 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
13e70 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f  X statement into
13e80 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d  .    ** the zStm
13e90 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  t variable.    *
13ea0 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  /.    if( pStart
13eb0 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20   && pEnd ){.    
13ec0 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64    /* A named ind
13ed0 65 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69  ex with an expli
13ee0 63 69 74 20 43 52 45 41 54 45 20 49 4e 44 45 58  cit CREATE INDEX
13ef0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
13f00 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69      zStmt = sqli
13f10 74 65 33 4d 50 72 69 6e 74 66 28 22 43 52 45 41  te3MPrintf("CREA
13f20 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22  TE%s INDEX %.*s"
13f30 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f  ,.        onErro
13f40 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20  r==OE_None ? "" 
13f50 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a 20 20 20  : " UNIQUE",.   
13f60 20 20 20 20 20 70 45 6e 64 2d 3e 7a 20 2d 20 70       pEnd->z - p
13f70 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c 0a 20 20 20  Name->z + 1,.   
13f80 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a       pName->z);.
13f90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13fa0 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63   /* An automatic
13fb0 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62   index created b
13fc0 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  y a PRIMARY KEY 
13fd0 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
13fe0 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  aint */.      /*
13ff0 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
14000 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a  MPrintf(""); */.
14010 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b        zStmt = 0;
14020 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
14030 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73  dd an entry in s
14040 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72  qlite_master for
14050 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20   this index.    
14060 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
14070 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
14080 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45  , .        "INSE
14090 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41  RT INTO %Q.%s VA
140a0 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c  LUES('index',%Q,
140b0 25 51 2c 23 30 2c 25 51 29 3b 22 2c 0a 20 20 20  %Q,#0,%Q);",.   
140c0 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
140d0 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
140e0 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20  TABLE(iDb),.    
140f0 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
14100 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  e,.        pTab-
14110 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
14120 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20  zStmt.    );.   
14130 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14140 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
14150 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  0);.    sqliteFr
14160 65 65 28 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20  ee(zStmt);..    
14170 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65  /* Fill the inde
14180 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20  x with data and 
14190 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65  reparse the sche
141a0 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45  ma. Code an OP_E
141b0 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20  xpire.    ** to 
141c0 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70  invalidate all p
141d0 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  re-compiled stat
141e0 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  ements..    */. 
141f0 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20     if( pTblName 
14200 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14210 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
14220 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d  se, pIndex, iMem
14230 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14240 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
14250 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20   v, iDb);.      
14260 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
14270 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61  , OP_ParseSchema
14280 2c 20 69 44 62 2c 20 30 2c 0a 20 20 20 20 20 20  , iDb, 0,.      
14290 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
142a0 66 28 22 6e 61 6d 65 3d 27 25 71 27 22 2c 20 70  f("name='%q'", p
142b0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50  Index->zName), P
142c0 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  3_DYNAMIC);.    
142d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
142e0 4f 70 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c  Op(v, OP_Expire,
142f0 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
14300 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64  }..  /* When add
14310 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ing an index to 
14320 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69  the list of indi
14330 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c  ces for a table,
14340 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20   make.  ** sure 
14350 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65  all indices labe
14360 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63  led OE_Replace c
14370 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68  ome after all th
14380 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a  ose labeled.  **
14390 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69   OE_Ignore.  Thi
143a0 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66  s is necessary f
143b0 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f  or the correct o
143c0 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41  peration of UPDA
143d0 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45  TE.  ** and INSE
143e0 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  RT..  */.  if( d
143f0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
14400 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  pTblName==0 ){. 
14410 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d     if( onError!=
14420 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54  OE_Replace || pT
14430 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20  ab->pIndex==0.  
14440 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e         || pTab->
14450 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d  pIndex->onError=
14460 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20  =OE_Replace){.  
14470 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
14480 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  t = pTab->pIndex
14490 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49  ;.      pTab->pI
144a0 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20  ndex = pIndex;. 
144b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
144c0 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20  Index *pOther = 
144d0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
144e0 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65      while( pOthe
144f0 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68  r->pNext && pOth
14500 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72  er->pNext->onErr
14510 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29  or!=OE_Replace )
14520 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65 72  {.        pOther
14530 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
14540 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14550 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
14560 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
14570 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65       pOther->pNe
14580 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  xt = pIndex;.   
14590 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20   }.    pIndex = 
145a0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65  0;.  }..  /* Cle
145b0 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69  an up before exi
145c0 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65  ting */.exit_cre
145d0 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28  ate_index:.  if(
145e0 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 66   pIndex ){.    f
145f0 72 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29  reeIndex(pIndex)
14600 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
14610 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  xprListDelete(pL
14620 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
14630 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54 62  rcListDelete(pTb
14640 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
14650 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72  Free(zName);.  r
14660 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
14670 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
14680 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 66   make sure the f
14690 69 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65  ile format numbe
146a0 72 20 69 73 20 61 74 20 6c 65 61 73 74 20 6d 69  r is at least mi
146b0 6e 46 6f 72 6d 61 74 2e 0a 2a 2a 20 54 68 65 20  nFormat..** The 
146c0 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20 77  generated code w
146d0 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74 68 65  ill increase the
146e0 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d   file format num
146f0 62 65 72 20 69 66 20 6e 65 63 65 73 73 61 72 79  ber if necessary
14700 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14710 33 4d 69 6e 69 6d 75 6d 46 69 6c 65 46 6f 72 6d  3MinimumFileForm
14720 61 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  at(Parse *pParse
14730 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 6d  , int iDb, int m
14740 69 6e 46 6f 72 6d 61 74 29 7b 0a 20 20 56 64 62  inFormat){.  Vdb
14750 65 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69  e *v;.  v = sqli
14760 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
14770 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
14780 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14790 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f  dOp(v, OP_ReadCo
147a0 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20  okie, iDb, 1);. 
147b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
147c0 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
147d0 72 2c 20 6d 69 6e 46 6f 72 6d 61 74 2c 20 30 29  r, minFormat, 0)
147e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
147f0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 65 2c  eAddOp(v, OP_Ge,
14800 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43   0, sqlite3VdbeC
14810 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
14820 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14830 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
14840 65 67 65 72 2c 20 6d 69 6e 46 6f 72 6d 61 74 2c  eger, minFormat,
14850 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
14860 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14870 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
14880 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
14890 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e   Fill the Index.
148a0 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79  aiRowEst[] array
148b0 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e   with default in
148c0 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f  formation - info
148d0 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65  rmation.** to be
148e0 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 61   used when we ha
148f0 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41  ve not run the A
14900 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a  NALYZE command..
14910 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30  **.** aiRowEst[0
14920 5d 20 69 73 20 73 75 70 70 6f 73 65 20 74 6f 20  ] is suppose to 
14930 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62  contain the numb
14940 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
14950 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20  n the index..** 
14960 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20  Since we do not 
14970 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69  know, guess 1 mi
14980 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74  llion.  aiRowEst
14990 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61  [1] is an estima
149a0 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d  te of the.** num
149b0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
149c0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61  he table that ma
149d0 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c  tch any particul
149e0 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  ar value of the.
149f0 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20  ** first column 
14a00 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61  of the index.  a
14a10 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e  iRowEst[2] is an
14a20 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
14a30 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f   number.** of ro
14a40 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e  ws that match an
14a50 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d  y particular com
14a60 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74 68 65  biniation of the
14a70 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73   first 2 columns
14a80 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78  .** of the index
14a90 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  .  And so forth.
14aa0 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73    It must always
14ab0 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
14ac0 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  t.*.**          
14ad0 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69   aiRowEst[N]<=ai
14ae0 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20  RowEst[N-1].**  
14af0 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73           aiRowEs
14b00 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70  t[N]>=1.**.** Ap
14b10 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77  art from that, w
14b20 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f  e have little to
14b30 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69   go on besides i
14b40 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a  ntuition as to.*
14b50 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d  * how aiRowEst[]
14b60 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
14b70 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d  alized.  The num
14b80 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68  bers generated h
14b90 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64  ere.** are based
14ba0 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75   on typical valu
14bb0 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75  es found in actu
14bc0 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76  al indices..*/.v
14bd0 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75  oid sqlite3Defau
14be0 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a  ltRowEst(Index *
14bf0 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pIdx){.  unsigne
14c00 64 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52  d *a = pIdx->aiR
14c10 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b 0a  owEst;.  int i;.
14c20 20 20 61 73 73 65 72 74 28 20 61 21 3d 30 20 29    assert( a!=0 )
14c30 3b 0a 20 20 61 5b 30 5d 20 3d 20 31 30 30 30 30  ;.  a[0] = 10000
14c40 30 30 3b 0a 20 20 66 6f 72 28 69 3d 70 49 64 78  00;.  for(i=pIdx
14c50 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d 31 3b  ->nColumn; i>=1;
14c60 20 69 2d 2d 29 7b 0a 20 20 20 20 61 5b 69 5d 20   i--){.    a[i] 
14c70 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  = 10;.  }.  if( 
14c80 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
14c90 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61 5b  E_None ){.    a[
14ca0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d  pIdx->nColumn] =
14cb0 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
14cc0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
14cd0 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74  ll drop an exist
14ce0 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e  ing named index.
14cf0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
14d00 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  * implements the
14d10 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74   DROP INDEX stat
14d20 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
14d30 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28  qlite3DropIndex(
14d40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
14d50 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69  rcList *pName, i
14d60 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20  nt ifExists){.  
14d70 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
14d80 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
14d90 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
14da0 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
14db0 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
14dc0 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 54  nErr || sqlite3T
14dd0 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c  hreadDataReadOnl
14de0 79 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  y()->mallocFaile
14df0 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
14e00 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
14e10 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61   }.  assert( pNa
14e20 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
14e30 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
14e40 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
14e50 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
14e60 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14e70 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e  index;.  }.  pIn
14e80 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
14e90 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65  dIndex(db, pName
14ea0 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e  ->a[0].zName, pN
14eb0 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
14ec0 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  ase);.  if( pInd
14ed0 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ex==0 ){.    if(
14ee0 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a 20 20   !ifExists ){.  
14ef0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14f00 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
14f10 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c  such index: %S",
14f20 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   pName, 0);.    
14f30 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
14f40 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
14f50 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14f60 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  p_index;.  }.  i
14f70 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49  f( pIndex->autoI
14f80 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
14f90 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14fa0 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63  se, "index assoc
14fb0 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55  iated with UNIQU
14fc0 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52  E ".      "or PR
14fd0 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
14fe0 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64  aint cannot be d
14ff0 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20  ropped", 0);.   
15000 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
15010 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62  index;.  }.  iDb
15020 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
15030 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  ToIndex(db, pInd
15040 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69  ex->pSchema);.#i
15050 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15060 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
15070 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
15080 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49   = SQLITE_DROP_I
15090 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20  NDEX;.    Table 
150a0 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
150b0 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  pTable;.    cons
150c0 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
150d0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
150e0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
150f0 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
15100 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
15110 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
15120 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
15130 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
15140 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
15150 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
15160 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  p_index;.    }. 
15170 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
15180 50 44 42 20 26 26 20 69 44 62 20 29 20 63 6f 64  PDB && iDb ) cod
15190 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
151a0 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
151b0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
151c0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
151d0 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  e, pIndex->zName
151e0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
151f0 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
15200 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
15210 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
15220 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
15230 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
15240 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  e the index and 
15250 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
15260 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73  table */.  v = s
15270 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
15280 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
15290 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  {.    sqlite3Nes
152a0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
152b0 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20  .       "DELETE 
152c0 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
152d0 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20   name=%Q",.     
152e0 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
152f0 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
15300 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20  LE(iDb),.       
15310 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20  pIndex->zName.  
15320 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
15330 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
15340 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65   v, iDb);.    de
15350 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
15360 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e  arse, pIndex->tn
15370 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  um, iDb);.    sq
15380 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
15390 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44  OP_DropIndex, iD
153a0 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  b, 0, pIndex->zN
153b0 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78  ame, 0);.  }..ex
153c0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20  it_drop_index:. 
153d0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
153e0 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a  elete(pName);.}.
153f0 0a 2f 2a 0a 2a 2a 20 70 70 41 72 72 61 79 20 70  ./*.** ppArray p
15400 6f 69 6e 74 73 20 69 6e 74 6f 20 61 20 73 74 72  oints into a str
15410 75 63 74 75 72 65 20 77 68 65 72 65 20 74 68 65  ucture where the
15420 72 65 20 69 73 20 61 6e 20 61 72 72 61 79 20 70  re is an array p
15430 6f 69 6e 74 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  ointer.** follow
15440 65 64 20 62 79 20 74 77 6f 20 69 6e 74 65 67 65  ed by two intege
15450 72 73 2e 20 54 68 65 20 66 69 72 73 74 20 69 6e  rs. The first in
15460 74 65 67 65 72 20 69 73 20 74 68 65 0a 2a 2a 20  teger is the.** 
15470 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
15480 74 73 20 69 6e 20 74 68 65 20 73 74 72 75 63 74  ts in the struct
15490 75 72 65 20 61 72 72 61 79 2e 20 20 54 68 65 20  ure array.  The 
154a0 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 0a 2a  second integer.*
154b0 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  * is the number 
154c0 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f  of allocated slo
154d0 74 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e  ts in the array.
154e0 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
154f0 77 6f 72 64 73 2c 20 74 68 65 20 73 74 72 75 63  words, the struc
15500 74 75 72 65 20 6c 6f 6f 6b 73 20 73 6f 6d 65 74  ture looks somet
15510 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a  hing like this:.
15520 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 72  **.**        str
15530 75 63 74 20 45 78 61 6d 70 6c 65 31 20 7b 0a 2a  uct Example1 {.*
15540 2a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  *          struc
15550 74 20 73 75 62 45 6c 65 6d 20 2a 61 45 6e 74 72  t subElem *aEntr
15560 79 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  y;.**          i
15570 6e 74 20 6e 45 6e 74 72 79 3b 0a 2a 2a 20 20 20  nt nEntry;.**   
15580 20 20 20 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f         int nAllo
15590 63 3b 0a 2a 2a 20 20 20 20 20 20 20 20 7d 0a 2a  c;.**        }.*
155a0 2a 0a 2a 2a 20 54 68 65 20 70 6e 45 6e 74 72 79  *.** The pnEntry
155b0 20 70 61 72 61 6d 65 74 65 72 20 70 6f 69 6e 74   parameter point
155c0 73 20 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c  s to the equival
155d0 65 6e 74 20 6f 66 20 45 78 61 6d 70 6c 65 31 2e  ent of Example1.
155e0 6e 45 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  nEntry..**.** Th
155f0 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
15600 61 74 65 73 20 61 20 6e 65 77 20 73 6c 6f 74 20  ates a new slot 
15610 69 6e 20 74 68 65 20 61 72 72 61 79 2c 20 7a 65  in the array, ze
15620 72 6f 73 20 69 74 20 6f 75 74 2c 0a 2a 2a 20 61  ros it out,.** a
15630 6e 64 20 72 65 74 75 72 6e 73 20 69 74 73 20 69  nd returns its i
15640 6e 64 65 78 2e 20 20 49 66 20 6d 61 6c 6c 6f 63  ndex.  If malloc
15650 20 66 61 69 6c 73 20 61 20 6e 65 67 61 74 69 76   fails a negativ
15660 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 74 75  e number is retu
15670 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 7a 45 6e  rned..**.** szEn
15680 74 72 79 20 69 73 20 74 68 65 20 73 69 7a 65 6f  try is the sizeo
15690 66 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 61 72  f of a single ar
156a0 72 61 79 20 65 6e 74 72 79 2e 20 20 69 6e 69 74  ray entry.  init
156b0 53 69 7a 65 20 69 73 20 74 68 65 20 0a 2a 2a 20  Size is the .** 
156c0 6e 75 6d 62 65 72 20 6f 66 20 61 72 72 61 79 20  number of array 
156d0 65 6e 74 72 69 65 73 20 61 6c 6c 6f 63 61 74 65  entries allocate
156e0 64 20 6f 6e 20 74 68 65 20 69 6e 69 74 69 61 6c  d on the initial
156f0 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a   allocation..*/.
15700 69 6e 74 20 73 71 6c 69 74 65 33 41 72 72 61 79  int sqlite3Array
15710 41 6c 6c 6f 63 61 74 65 28 76 6f 69 64 20 2a 2a  Allocate(void **
15720 70 70 41 72 72 61 79 2c 20 69 6e 74 20 73 7a 45  ppArray, int szE
15730 6e 74 72 79 2c 20 69 6e 74 20 69 6e 69 74 53 69  ntry, int initSi
15740 7a 65 29 7b 0a 20 20 63 68 61 72 20 2a 70 3b 0a  ze){.  char *p;.
15750 20 20 69 6e 74 20 2a 61 6e 20 3d 20 28 69 6e 74    int *an = (int
15760 2a 29 26 70 70 41 72 72 61 79 5b 31 5d 3b 0a 20  *)&ppArray[1];. 
15770 20 69 66 28 20 61 6e 5b 30 5d 3e 3d 61 6e 5b 31   if( an[0]>=an[1
15780 5d 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  ] ){.    void *p
15790 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77  New;.    int new
157a0 53 69 7a 65 3b 0a 20 20 20 20 6e 65 77 53 69 7a  Size;.    newSiz
157b0 65 20 3d 20 61 6e 5b 31 5d 2a 32 20 2b 20 69 6e  e = an[1]*2 + in
157c0 69 74 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77  itSize;.    pNew
157d0 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
157e0 28 2a 70 70 41 72 72 61 79 2c 20 6e 65 77 53 69  (*ppArray, newSi
157f0 7a 65 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20  ze*szEntry);.   
15800 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
15810 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
15820 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 5b 31 5d  .    }.    an[1]
15830 20 3d 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20   = newSize;.    
15840 2a 70 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b  *ppArray = pNew;
15850 0a 20 20 7d 0a 20 20 70 20 3d 20 2a 70 70 41 72  .  }.  p = *ppAr
15860 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  ray;.  memset(&p
15870 5b 61 6e 5b 30 5d 2a 73 7a 45 6e 74 72 79 5d 2c  [an[0]*szEntry],
15880 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20   0, szEntry);.  
15890 72 65 74 75 72 6e 20 61 6e 5b 30 5d 2b 2b 3b 0a  return an[0]++;.
158a0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
158b0 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
158c0 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73   the given IdLis
158d0 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
158e0 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65   IdList if.** ne
158f0 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ed be..**.** A n
15900 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74  ew IdList is ret
15910 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
15920 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
15930 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c  ..*/.IdList *sql
15940 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
15950 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
15960 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
15970 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
15980 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
15990 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  List = sqliteMal
159a0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69  loc( sizeof(IdLi
159b0 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
159c0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
159d0 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
159e0 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  Alloc = 0;.  }. 
159f0 20 69 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61   i = sqlite3Arra
15a00 79 41 6c 6c 6f 63 61 74 65 28 28 76 6f 69 64 2a  yAllocate((void*
15a10 2a 29 26 70 4c 69 73 74 2d 3e 61 2c 20 73 69 7a  *)&pList->a, siz
15a20 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
15a30 2c 20 35 29 3b 0a 20 20 69 66 28 20 69 3c 30 20  , 5);.  if( i<0 
15a40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  ){.    sqlite3Id
15a50 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
15a60 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
15a70 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b  .  }.  pList->a[
15a80 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
15a90 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
15aa0 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72  pToken);.  retur
15ab0 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
15ac0 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69  * Delete an IdLi
15ad0 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
15ae0 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
15af0 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  IdList *pList){.
15b00 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
15b10 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
15b20 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
15b30 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
15b40 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
15b50 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
15b60 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
15b70 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a  Free(pList->a);.
15b80 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
15b90 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
15ba0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
15bb0 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69  n pList of the i
15bc0 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20  dentifier named 
15bd0 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  zId.  Return -1.
15be0 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ** if not found.
15bf0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
15c00 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73  dListIndex(IdLis
15c10 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20  t *pList, const 
15c20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
15c30 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
15c40 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d  st==0 ) return -
15c50 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
15c60 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
15c70 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
15c80 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
15c90 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  a[i].zName, zNam
15ca0 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  e)==0 ) return i
15cb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
15cc0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  1;.}../*.** Appe
15cd0 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e  nd a new table n
15ce0 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ame to the given
15cf0 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74   SrcList.  Creat
15d00 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  e a new SrcList 
15d10 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20  if.** need be.  
15d20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63  A new entry is c
15d30 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72  reated in the Sr
15d40 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54  cList even if pT
15d50 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  oken is NULL..**
15d60 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73  .** A new SrcLis
15d70 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
15d80 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
15d90 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20  () fails..**.** 
15da0 49 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20  If pDatabase is 
15db0 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61  not null, it mea
15dc0 6e 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  ns that the tabl
15dd0 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61  e has an optiona
15de0 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61  l.** database na
15df0 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65  me prefix.  Like
15e00 20 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73   this:  "databas
15e10 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70  e.table".  The p
15e20 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e  Database.** poin
15e30 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ts to the table 
15e40 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61  name and the pTa
15e50 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ble points to th
15e60 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
15e70 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e  .** The SrcList.
15e80 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20  a[].zName field 
15e90 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
15ea0 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68  he table name wh
15eb0 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d  ich might.** com
15ec0 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69  e from pTable (i
15ed0 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e  f pDatabase is N
15ee0 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61  ULL) or from pDa
15ef0 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63  tabase.  .** Src
15f00 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61  List.a[].zDataba
15f10 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  se is filled wit
15f20 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  h the database n
15f30 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c  ame from pTable,
15f40 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c  .** or with NULL
15f50 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20   if no database 
15f60 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  is specified..**
15f70 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
15f80 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65  ds, if call like
15f90 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
15fa0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
15fb0 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29  istAppend(A,B,0)
15fc0 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69  ;.**.** Then B i
15fd0 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  s a table name a
15fe0 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
15ff0 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66  name is unspecif
16000 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a  ied.  If called.
16010 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ** like this:.**
16020 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
16030 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
16040 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54  (A,B,C);.**.** T
16050 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62  hen C is the tab
16060 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73  le name and B is
16070 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
16080 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  me..*/.SrcList *
16090 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
160a0 70 65 6e 64 28 53 72 63 4c 69 73 74 20 2a 70 4c  pend(SrcList *pL
160b0 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62  ist, Token *pTab
160c0 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61  le, Token *pData
160d0 62 61 73 65 29 7b 0a 20 20 73 74 72 75 63 74 20  base){.  struct 
160e0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
160f0 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  tem;.  if( pList
16100 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
16110 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
16120 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29   sizeof(SrcList)
16130 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
16140 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
16150 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
16160 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  oc = 1;.  }.  if
16170 28 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70  ( pList->nSrc>=p
16180 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  List->nAlloc ){.
16190 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65      SrcList *pNe
161a0 77 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  w;.    pList->nA
161b0 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70  lloc *= 2;.    p
161c0 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
161d0 6c 6f 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20  loc(pList,.     
161e0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
161f0 28 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73  (*pList) + (pLis
16200 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a  t->nAlloc-1)*siz
16210 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
16220 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77   );.    if( pNew
16230 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
16240 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
16250 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
16260 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
16270 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77      pList = pNew
16280 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20  ;.  }.  pItem = 
16290 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
162a0 3e 6e 53 72 63 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nSrc];.  memset
162b0 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f  (pItem, 0, sizeo
162c0 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
162d0 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
162e0 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a   && pDatabase->z
162f0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61  ==0 ){.    pData
16300 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  base = 0;.  }.  
16310 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26  if( pDatabase &&
16320 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54   pTable ){.    T
16330 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44  oken *pTemp = pD
16340 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61  atabase;.    pDa
16350 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b  tabase = pTable;
16360 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54  .    pTable = pT
16370 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  emp;.  }.  pItem
16380 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
16390 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
163a0 54 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d  Table);.  pItem-
163b0 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
163c0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
163d0 6e 28 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  n(pDatabase);.  
163e0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  pItem->iCursor =
163f0 20 2d 31 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 53   -1;.  pList->nS
16400 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70  rc++;.  return p
16410 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  List;.}../*.** A
16420 73 73 69 67 6e 20 63 75 72 73 6f 72 73 20 74 6f  ssign cursors to
16430 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
16440 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64   SrcList.*/.void
16450 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
16460 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72  ssignCursors(Par
16470 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
16480 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
16490 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53  nt i;.  struct S
164a0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
164b0 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69  em;.  assert(pLi
164c0 73 74 20 7c 7c 20 73 71 6c 69 74 65 33 54 68 72  st || sqlite3Thr
164d0 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28  eadDataReadOnly(
164e0 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  )->mallocFailed)
164f0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
16500 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
16510 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
16520 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
16530 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
16540 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75    if( pItem->iCu
16550 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b  rsor>=0 ) break;
16560 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43  .      pItem->iC
16570 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
16580 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nTab++;.      if
16590 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
165a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
165b0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
165c0 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
165d0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e  pItem->pSelect->
165e0 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSrc);.      }. 
165f0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
16600 2a 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74  * Add an alias t
16610 6f 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74  o the last ident
16620 69 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76  ifier on the giv
16630 65 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69  en identifier li
16640 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
16650 74 65 33 53 72 63 4c 69 73 74 41 64 64 41 6c 69  te3SrcListAddAli
16660 61 73 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  as(SrcList *pLis
16670 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
16680 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26  ){.  if( pList &
16690 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20  & pList->nSrc>0 
166a0 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  ){.    pList->a[
166b0 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 2e 7a  pList->nSrc-1].z
166c0 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e  Alias = sqlite3N
166d0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f  ameFromToken(pTo
166e0 6b 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ken);.  }.}../*.
166f0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
16700 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
16710 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
16720 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
16730 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
16740 73 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74  stDelete(SrcList
16750 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
16760 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  i;.  struct SrcL
16770 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
16780 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
16790 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
167a0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
167b0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  i=0; i<pList->nS
167c0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
167d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
167e0 65 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  e(pItem->zDataba
167f0 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  se);.    sqliteF
16800 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  ree(pItem->zName
16810 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
16820 65 28 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  e(pItem->zAlias)
16830 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
16840 65 74 65 54 61 62 6c 65 28 30 2c 20 70 49 74 65  eteTable(0, pIte
16850 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71  m->pTab);.    sq
16860 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
16870 65 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  e(pItem->pSelect
16880 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
16890 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e  prDelete(pItem->
168a0 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pOn);.    sqlite
168b0 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 49  3IdListDelete(pI
168c0 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
168d0 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
168e0 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
168f0 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  Begin a transact
16900 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
16910 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74  te3BeginTransact
16920 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
16930 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20  e, int type){.  
16940 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
16950 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b  dbe *v;.  int i;
16960 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
16970 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
16980 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
16990 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
169a0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
169b0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
169c0 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65  ite3ThreadDataRe
169d0 61 64 4f 6e 6c 79 28 29 2d 3e 6d 61 6c 6c 6f 63  adOnly()->malloc
169e0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
169f0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
16a00 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
16a10 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
16a20 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  ON, "BEGIN", 0, 
16a30 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
16a40 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
16a50 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
16a60 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !v ) return;. 
16a70 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45   if( type!=TK_DE
16a80 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f  FERRED ){.    fo
16a90 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
16aa0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
16ab0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
16ac0 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  , OP_Transaction
16ad0 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45  , i, (type==TK_E
16ae0 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20  XCLUSIVE)+1);.  
16af0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
16b00 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
16b10 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20  _AutoCommit, 0, 
16b20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  0);.}../*.** Com
16b30 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  mit a transactio
16b40 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
16b50 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69  3CommitTransacti
16b60 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
16b70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
16b80 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
16b90 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
16ba0 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
16bb0 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
16bc0 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
16bd0 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
16be0 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
16bf0 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e  ThreadDataReadOn
16c00 6c 79 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ly()->mallocFail
16c10 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
16c20 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
16c30 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
16c40 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
16c50 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20  "COMMIT", 0, 0) 
16c60 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d  ) return;..  v =
16c70 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
16c80 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
16c90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
16ca0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
16cb0 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29  utoCommit, 1, 0)
16cc0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
16cd0 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ollback a transa
16ce0 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
16cf0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61  lite3RollbackTra
16d00 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
16d10 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
16d20 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
16d30 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  v;..  if( pParse
16d40 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
16d50 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
16d60 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
16d70 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
16d80 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
16d90 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
16da0 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 6d 61 6c 6c  ReadOnly()->mall
16db0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
16dc0 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
16dd0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
16de0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
16df0 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  TION, "ROLLBACK"
16e00 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
16e10 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
16e20 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
16e30 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
16e40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16e50 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
16e60 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a  t, 1, 1);.  }.}.
16e70 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
16e80 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
16e90 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61  se is open and a
16ea0 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
16eb0 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
16ec0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
16ed0 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20 65 72  s.  Leave any er
16ee0 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20  ror messages in 
16ef0 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
16f00 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
16f10 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  int sqlite3OpenT
16f20 65 6d 70 44 61 74 61 62 61 73 65 28 50 61 72 73  empDatabase(Pars
16f30 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
16f40 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
16f50 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62  se->db;.  if( db
16f60 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20  ->aDb[1].pBt==0 
16f70 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  && !pParse->expl
16f80 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ain ){.    int r
16f90 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
16fa0 46 61 63 74 6f 72 79 28 64 62 2c 20 30 2c 20 30  Factory(db, 0, 0
16fb0 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62  , MAX_PAGES, &db
16fc0 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20  ->aDb[1].pBt);. 
16fd0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16fe0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
16ff0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
17000 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
17010 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
17020 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20  y database ".   
17030 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73       "file for s
17040 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79  toring temporary
17050 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20   tables");.     
17060 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63   pParse->rc = rc
17070 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
17080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17090 64 62 2d 3e 66 6c 61 67 73 20 26 20 21 64 62 2d  db->flags & !db-
170a0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
170b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
170c0 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
170d0 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 2c  (db->aDb[1].pBt,
170e0 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   1);.      if( r
170f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17100 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17110 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
17120 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61  "unable to get a
17130 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22   write lock on "
17140 0a 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20  .          "the 
17150 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
17160 73 65 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20  se file");.     
17170 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
17180 72 63 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  rc;.        retu
17190 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
171a0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
171b0 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
171c0 6d 61 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ma );.  }.  retu
171d0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
171e0 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
171f0 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69  e that will veri
17200 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
17210 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a  okie and start.*
17220 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  * a read-transac
17230 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d  tion for all nam
17240 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
17250 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  s..**.** It is i
17260 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c  mportant that al
17270 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73  l schema cookies
17280 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e 64   be verified and
17290 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61   all.** read tra
172a0 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61  nsactions be sta
172b0 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74  rted before anyt
172c0 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e  hing else happen
172d0 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45  s in.** the VDBE
172e0 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74   program.  But t
172f0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
17300 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
17310 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f  much other.** co
17320 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65  de has been gene
17330 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20  rated.  So here 
17340 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a  is what we do:.*
17350 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
17360 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
17370 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63   is called, we c
17380 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74  ode an OP_Goto t
17390 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70  hat.** will jump
173a0 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65   to a subroutine
173b0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
173c0 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65  he program.  The
173d0 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65  n we.** record e
173e0 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74 68  very database th
173f0 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63 68  at needs its sch
17400 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e 20  ema verified in 
17410 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63  the.** pParse->c
17420 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e  ookieMask field.
17430 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61    Later, after a
17440 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61  ll other code ha
17450 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61  s been.** genera
17460 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ted, the subrout
17470 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74 68  ine that does th
17480 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63  e cookie verific
17490 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74  ations and.** st
174a0 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  arts the transac
174b0 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f  tions will be co
174c0 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47  ded and the OP_G
174d0 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20  oto P2 value.** 
174e0 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20  will be made to 
174f0 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75  point to that su
17500 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67  broutine.  The g
17510 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  eneration of the
17520 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  .** cookie verif
17530 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69  ication subrouti
17540 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20  ne code happens 
17550 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  in sqlite3Finish
17560 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20  Coding()..**.** 
17570 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63 6f  If iDb<0 then co
17580 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f  de the OP_Goto o
17590 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74 20  nly - don't set 
175a0 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20 74  flag to verify t
175b0 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20  he.** schema on 
175c0 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20 20  any databases.  
175d0 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
175e0 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65   to position the
175f0 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c   OP_Goto.** earl
17600 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20 62  y in the code, b
17610 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69 66  efore we know if
17620 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74 61   any database ta
17630 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65  bles will be use
17640 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
17650 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
17660 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
17670 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
17680 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
17690 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73 6b  e *v;.  int mask
176a0 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
176b0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
176c0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
176d0 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f  turn;  /* This o
176e0 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74  nly happens if t
176f0 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f 72  here was a prior
17700 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20 3d   error */.  db =
17710 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
17720 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  f( pParse->cooki
17730 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  eGoto==0 ){.    
17740 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
17750 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  to = sqlite3Vdbe
17760 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
17770 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20  , 0, 0)+1;.  }. 
17780 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20   if( iDb>=0 ){. 
17790 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64     assert( iDb<d
177a0 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73  b->nDb );.    as
177b0 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44  sert( db->aDb[iD
177c0 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62  b].pBt!=0 || iDb
177d0 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
177e0 74 28 20 69 44 62 3c 33 32 20 29 3b 0a 20 20 20  t( iDb<32 );.   
177f0 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a   mask = 1<<iDb;.
17800 20 20 20 20 69 66 28 20 28 70 50 61 72 73 65 2d      if( (pParse-
17810 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61  >cookieMask & ma
17820 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
17830 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
17840 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
17850 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
17860 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d  Value[iDb] = db-
17870 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
17880 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
17890 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  ;.      if( !OMI
178a0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
178b0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
178c0 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74  lite3OpenTempDat
178d0 61 62 61 73 65 28 70 50 61 72 73 65 29 3b 0a 20  abase(pParse);. 
178e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
178f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
17900 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
17910 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64  t prepares for d
17920 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  oing an operatio
17930 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  n that.** might 
17940 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62  change the datab
17950 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
17960 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61  routine starts a
17970 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
17980 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61   if we are not a
17990 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a  lready within.**
179a0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
179b0 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   If we are alrea
179c0 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  dy within a tran
179d0 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20  saction, then a 
179e0 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73  checkpoint.** is
179f0 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53   set if the setS
17a00 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74  tatement paramet
17a10 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63  er is true.  A c
17a20 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
17a30 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f  .** be set for o
17a40 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d  perations that m
17a50 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74  ight fail (due t
17a60 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  o a constraint) 
17a70 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77  part of.** the w
17a80 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77  ay through and w
17a90 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74  hich will need t
17aa0 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74  o undo some writ
17ab0 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  es without havin
17ac0 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  g to.** rollback
17ad0 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
17ae0 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65  action.  For ope
17af0 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c  rations where al
17b00 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  l constraints.**
17b10 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20   can be checked 
17b20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
17b30 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74  es are made to t
17b40 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
17b50 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65  is never.** nece
17b60 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20  ssary to undo a 
17b70 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68  write and the ch
17b80 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  eckpoint should 
17b90 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a  not be set..**.*
17ba0 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  * Only database 
17bb0 69 44 62 20 61 6e 64 20 74 68 65 20 74 65 6d 70  iDb and the temp
17bc0 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61   database are ma
17bd0 64 65 20 77 72 69 74 61 62 6c 65 20 62 79 20 74  de writable by t
17be0 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20  his call..** If 
17bf0 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  iDb==0, then the
17c00 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70 20 64   main and temp d
17c10 61 74 61 62 61 73 65 73 20 61 72 65 20 6d 61 64  atabases are mad
17c20 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20 49 66  e writable.   If
17c30 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e 20  .** iDb==1 then 
17c40 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20 64 61  only the temp da
17c50 74 61 62 61 73 65 20 69 73 20 6d 61 64 65 20 77  tabase is made w
17c60 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69 44 62  ritable.  If iDb
17c70 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73  >1 then the.** s
17c80 70 65 63 69 66 69 65 64 20 61 75 78 69 6c 69 61  pecified auxilia
17c90 72 79 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ry database and 
17ca0 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
17cb0 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  e are made writa
17cc0 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
17cd0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
17ce0 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
17cf0 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74  Parse, int setSt
17d00 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62  atement, int iDb
17d10 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
17d20 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
17d30 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
17d40 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
17d50 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
17d60 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
17d70 62 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 77 72  b);.  pParse->wr
17d80 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44  iteMask |= 1<<iD
17d90 62 3b 0a 20 20 69 66 28 20 73 65 74 53 74 61 74  b;.  if( setStat
17da0 65 6d 65 6e 74 20 26 26 20 70 50 61 72 73 65 2d  ement && pParse-
17db0 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20  >nested==0 ){.  
17dc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17dd0 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74 65 6d 65  Op(v, OP_Stateme
17de0 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 7d  nt, iDb, 0);.  }
17df0 0a 20 20 69 66 28 20 28 4f 4d 49 54 5f 54 45 4d  .  if( (OMIT_TEM
17e00 50 44 42 20 7c 7c 20 69 44 62 21 3d 31 29 20 26  PDB || iDb!=1) &
17e10 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  & pParse->db->aD
17e20 62 5b 31 5d 2e 70 42 74 21 3d 30 20 29 7b 0a 20  b[1].pBt!=0 ){. 
17e30 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
17e40 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
17e50 61 72 73 65 2c 20 73 65 74 53 74 61 74 65 6d 65  arse, setStateme
17e60 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  nt, 1);.  }.}../
17e70 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
17e80 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73  e if pIndex uses
17e90 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
17ea0 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
17eb0 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
17ec0 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61  f it does and fa
17ed0 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e  lse if it does n
17ee0 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ot..*/.#ifndef S
17ef0 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
17f00 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  EX.static int co
17f10 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e  llationMatch(con
17f20 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20  st char *zColl, 
17f30 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a  Index *pIndex){.
17f40 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
17f50 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43  =0; i<pIndex->nC
17f60 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
17f70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
17f80 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
17f90 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 7a  i];.    if( z==z
17fa0 43 6f 6c 6c 20 7c 7c 20 28 7a 20 26 26 20 7a 43  Coll || (z && zC
17fb0 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  oll && 0==sqlite
17fc0 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c  3StrICmp(z, zCol
17fd0 6c 29 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  l)) ){.      ret
17fe0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
17ff0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
18000 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
18010 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
18020 65 73 20 6f 66 20 70 54 61 62 20 74 68 61 74 20  es of pTab that 
18030 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
18040 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
18050 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ..** If pColl==0
18060 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20   then recompute 
18070 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70  all indices of p
18080 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  Tab..*/.#ifndef 
18090 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
180a0 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEX.static void 
180b0 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72  reindexTable(Par
180c0 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
180d0 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f  e *pTab, char co
180e0 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49  nst *zColl){.  I
180f0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
18100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
18110 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
18120 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a  d with pTab */..
18130 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61    for(pIndex=pTa
18140 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  b->pIndex; pInde
18150 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78  x; pIndex=pIndex
18160 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
18170 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f  ( zColl==0 || co
18180 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f  llationMatch(zCo
18190 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20  ll, pIndex) ){. 
181a0 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
181b0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
181c0 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
181d0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
181e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
181f0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
18200 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
18210 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
18220 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
18230 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
18240 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
18250 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70  if../*.** Recomp
18260 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
18270 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  of all tables in
18280 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77   all databases w
18290 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69  here the.** indi
182a0 63 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  ces use the coll
182b0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
182c0 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d  Coll.  If pColl=
182d0 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
182e0 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73  e.** all indices
182f0 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a   everywhere..*/.
18300 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18310 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
18320 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44  ic void reindexD
18330 61 74 61 62 61 73 65 73 28 50 61 72 73 65 20 2a  atabases(Parse *
18340 70 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e  pParse, char con
18350 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62  st *zColl){.  Db
18360 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
18370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
18380 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a  ingle database *
18390 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
183a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183b0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
183c0 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
183d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
183e0 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
183f0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
18400 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61  nnection */.  Ha
18410 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20  shElem *k;      
18420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
18430 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61   looping over ta
18440 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20  bles in pDb */. 
18450 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
18460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18470 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  A table in the d
18480 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 66 6f  atabase */..  fo
18490 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d  r(iDb=0, pDb=db-
184a0 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  >aDb; iDb<db->nD
184b0 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29  b; iDb++, pDb++)
184c0 7b 0a 20 20 20 20 69 66 28 20 70 44 62 3d 3d 30  {.    if( pDb==0
184d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
184e0 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73   for(k=sqliteHas
184f0 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63  hFirst(&pDb->pSc
18500 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
18510 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68   k; k=sqliteHash
18520 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20  Next(k)){.      
18530 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73  pTab = (Table*)s
18540 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29  qliteHashData(k)
18550 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54  ;.      reindexT
18560 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
18570 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  b, zColl);.    }
18580 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
18590 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
185a0 64 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44  de for the REIND
185b0 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  EX command..**.*
185c0 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
185d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185e0 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31              -- 1
185f0 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
18600 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20  EX  <collation> 
18610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
18620 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   2.**        REI
18630 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65  NDEX  ?<database
18640 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20  >.?<tablename>  
18650 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 3.**        R
18660 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
18670 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e  se>.?<indexname>
18680 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72    -- 4.**.** For
18690 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69  m 1 causes all i
186a0 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74  ndices in all at
186b0 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
186c0 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a   to be rebuilt..
186d0 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c  ** Form 2 rebuil
186e0 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69  ds all indices i
186f0 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  n all databases 
18700 74 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d  that use the nam
18710 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20  ed.** collating 
18720 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73  function.  Forms
18730 20 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64   3 and 4 rebuild
18740 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
18750 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63   or all.** indic
18760 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
18770 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  th the named tab
18780 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  le..*/.#ifndef S
18790 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
187a0 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  EX.void sqlite3R
187b0 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  eindex(Parse *pP
187c0 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
187d0 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  me1, Token *pNam
187e0 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e2){.  CollSeq *
187f0 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
18800 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
18810 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72  sequence to be r
18820 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c  eindexed, or NUL
18830 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  L */.  char *z; 
18840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18850 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20     /* Name of a 
18860 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a  table or index *
18870 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
18880 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  zDb;            
18890 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
188a0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62  atabase */.  Tab
188b0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
188c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
188d0 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
188e0 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ase */.  Index *
188f0 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  pIndex;         
18900 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
18910 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
18920 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
18930 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
18940 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
18950 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
18960 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
18970 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
18980 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
18990 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
189a0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a  */.  Token *pObj
189b0 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
189c0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
189d0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
189e0 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a  o be reindexed *
189f0 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  /..  /* Read the
18a00 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
18a10 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
18a20 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
18a30 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
18a40 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
18a50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
18a60 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
18a70 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
18a80 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
18a90 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
18aa0 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e  n;.  }..  if( pN
18ab0 61 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65  ame1==0 || pName
18ac0 31 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72  1->z==0 ){.    r
18ad0 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
18ae0 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20  pParse, 0);.    
18af0 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20  return;.  }else 
18b00 69 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c  if( pName2==0 ||
18b10 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b   pName2->z==0 ){
18b20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
18b30 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 70 43  me1->z );.    pC
18b40 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
18b50 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
18b60 28 64 62 29 2c 20 28 63 68 61 72 2a 29 70 4e 61  (db), (char*)pNa
18b70 6d 65 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d 3e  me1->z, pName1->
18b80 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  n, 0);.    if( p
18b90 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Coll ){.      ch
18ba0 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 53  ar *z = sqlite3S
18bb0 74 72 4e 44 75 70 28 70 4e 61 6d 65 31 2d 3e 7a  trNDup(pName1->z
18bc0 2c 20 70 4e 61 6d 65 31 2d 3e 6e 29 3b 0a 20 20  , pName1->n);.  
18bd0 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20      if( z ){.   
18be0 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61       reindexData
18bf0 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a 29  bases(pParse, z)
18c00 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18c10 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 7d  Free(z);.      }
18c20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
18c30 20 20 20 7d 0a 20 20 7d 0a 20 20 69 44 62 20 3d     }.  }.  iDb =
18c40 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
18c50 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
18c60 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62  e1, pName2, &pOb
18c70 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44  jName);.  if( iD
18c80 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
18c90 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  z = sqlite3NameF
18ca0 72 6f 6d 54 6f 6b 65 6e 28 70 4f 62 6a 4e 61 6d  romToken(pObjNam
18cb0 65 29 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e  e);.  zDb = db->
18cc0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
18cd0 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
18ce0 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c  FindTable(db, z,
18cf0 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61   zDb);.  if( pTa
18d00 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78  b ){.    reindex
18d10 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
18d20 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  ab, 0);.    sqli
18d30 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 72  teFree(z);.    r
18d40 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e  eturn;.  }.  pIn
18d50 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
18d60 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44  dIndex(db, z, zD
18d70 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  b);.  sqliteFree
18d80 28 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  (z);.  if( pInde
18d90 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
18da0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
18db0 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
18dc0 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
18dd0 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
18de0 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b  se, pIndex, -1);
18df0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
18e00 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d  .  sqlite3ErrorM
18e10 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
18e20 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74  le to identify t
18e30 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20  he object to be 
18e40 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23  reindexed");.}.#
18e50 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
18e60 75 72 6e 20 61 20 64 79 6e 61 6d 69 63 6c 79 20  urn a dynamicly 
18e70 61 6c 6c 6f 63 61 74 65 64 20 4b 65 79 49 6e 66  allocated KeyInf
18e80 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
18e90 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20   can be used.** 
18ea0 77 69 74 68 20 4f 50 5f 4f 70 65 6e 52 65 61 64  with OP_OpenRead
18eb0 20 6f 72 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65   or OP_OpenWrite
18ec0 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 62   to access datab
18ed0 61 73 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a  ase index pIdx..
18ee0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
18ef0 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65 72 20 74  ful, a pointer t
18f00 6f 20 74 68 65 20 6e 65 77 20 73 74 72 75 63 74  o the new struct
18f10 75 72 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ure is returned.
18f20 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
18f30 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
18f40 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
18f50 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 46 72 65  alling sqliteFre
18f60 65 28 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72  e() on the retur
18f70 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e  ned .** pointer.
18f80 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
18f90 75 72 73 20 28 6f 75 74 20 6f 66 20 6d 65 6d 6f  urs (out of memo
18fa0 72 79 20 6f 72 20 6d 69 73 73 69 6e 67 20 63 6f  ry or missing co
18fb0 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20 73 65 71 75  llation .** sequ
18fc0 65 6e 63 65 29 2c 20 4e 55 4c 4c 20 69 73 20 72  ence), NULL is r
18fd0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
18fe0 73 74 61 74 65 20 6f 66 20 70 50 61 72 73 65 20  state of pParse 
18ff0 75 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65  updated to refle
19000 63 74 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e  ct.** the error.
19010 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c  .*/.KeyInfo *sql
19020 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
19030 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
19040 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
19050 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f  int i;.  int nCo
19060 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  l = pIdx->nColum
19070 6e 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 20  n;.  int nBytes 
19080 3d 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f  = sizeof(KeyInfo
19090 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a  ) + (nCol-1)*siz
190a0 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20  eof(CollSeq*) + 
190b0 6e 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  nCol;.  KeyInfo 
190c0 2a 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f  *pKey = (KeyInfo
190d0 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   *)sqliteMalloc(
190e0 6e 42 79 74 65 73 29 3b 0a 0a 20 20 69 66 28 20  nBytes);..  if( 
190f0 70 4b 65 79 20 29 7b 0a 20 20 20 20 70 4b 65 79  pKey ){.    pKey
19100 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
19110 75 38 20 2a 29 26 28 70 4b 65 79 2d 3e 61 43 6f  u8 *)&(pKey->aCo
19120 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20 61  ll[nCol]);.    a
19130 73 73 65 72 74 28 20 26 70 4b 65 79 2d 3e 61 53  ssert( &pKey->aS
19140 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 3d 3d  ortOrder[nCol]==
19150 26 28 28 28 75 38 20 2a 29 70 4b 65 79 29 5b 6e  &(((u8 *)pKey)[n
19160 42 79 74 65 73 5d 29 20 29 3b 0a 20 20 20 20 66  Bytes]) );.    f
19170 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
19180 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  i++){.      char
19190 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
191a0 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  azColl[i];.     
191b0 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 20 29   assert( zColl )
191c0 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43  ;.      pKey->aC
191d0 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  oll[i] = sqlite3
191e0 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
191f0 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29  arse, zColl, -1)
19200 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53  ;.      pKey->aS
19210 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49  ortOrder[i] = pI
19220 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  dx->aSortOrder[i
19230 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  ];.    }.    pKe
19240 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c  y->nField = nCol
19250 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
19260 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
19270 20 73 71 6c 69 74 65 46 72 65 65 28 70 4b 65 79   sqliteFree(pKey
19280 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 30 3b  );.    pKey = 0;
19290 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b  .  }.  return pK
192a0 65 79 3b 0a 7d 0a                                ey;.}.