/ Hex Artifact Content
Login

Artifact d959aa9c2ab9c79d3d872ce91ef719698658210c:


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 38 34 20 32 30 30 36 2f 30 32 2f 30 35  1.384 2006/02/05
02f0: 20 31 38 3a 35 35 3a 32 30 20 64 72 68 20 45 78   18:55:20 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 4d 61 6c 6c 6f 63  f( sqlite3Malloc
0d70: 46 61 69 6c 65 64 28 29 20 29 20 72 65 74 75 72  Failed() ) retur
0d80: 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
0d90: 3e 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e  >nested ) return
0da0: 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  ;.  if( !pParse-
0db0: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 69 66  >pVdbe ){.    if
0dc0: 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51  ( pParse->rc==SQ
0dd0: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 72 73  LITE_OK && pPars
0de0: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20  e->nErr ){.     
0df0: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
0e00: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
0e10: 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  }.    return;.  
0e20: 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79  }..  /* Begin by
0e30: 20 67 65 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65   generating some
0e40: 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64   termination cod
0e50: 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
0e60: 74 68 65 0a 20 20 2a 2a 20 76 64 62 65 20 70 72  the.  ** vdbe pr
0e70: 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20 20 64 62 20  ogram.  */.  db 
0e80: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
0e90: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
0ea0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
0eb0: 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
0ec0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
0ed0: 50 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 0a  P_Halt, 0, 0);..
0ee0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69      /* The cooki
0ef0: 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20  e mask contains 
0f00: 6f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  one bit for each
0f10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
0f20: 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74  pen..    ** (Bit
0f30: 20 30 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20   0 is for main, 
0f40: 62 69 74 20 31 20 69 73 20 66 6f 72 20 74 65 6d  bit 1 is for tem
0f50: 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  p, and so forth.
0f60: 29 20 20 42 69 74 73 20 61 72 65 0a 20 20 20 20  )  Bits are.    
0f70: 2a 2a 20 73 65 74 20 66 6f 72 20 65 61 63 68 20  ** set for each 
0f80: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
0f90: 20 75 73 65 64 2e 20 20 47 65 6e 65 72 61 74 65   used.  Generate
0fa0: 20 63 6f 64 65 20 74 6f 20 73 74 61 72 74 20 61   code to start a
0fb0: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
0fc0: 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73 65 64  ion on each used
0fd0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 6f   database and to
0fe0: 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
0ff0: 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a  ma cookie.    **
1000: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
1010: 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
1020: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63     if( pParse->c
1030: 6f 6f 6b 69 65 47 6f 74 6f 3e 30 20 29 7b 0a 20  ookieGoto>0 ){. 
1040: 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 0a 20       u32 mask;. 
1050: 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
1060: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
1070: 75 6d 70 48 65 72 65 28 76 2c 20 70 50 61 72 73  umpHere(v, pPars
1080: 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29  e->cookieGoto-1)
1090: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d  ;.      for(iDb=
10a0: 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64  0, mask=1; iDb<d
10b0: 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31  b->nDb; mask<<=1
10c0: 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20  , iDb++){.      
10d0: 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50    if( (mask & pP
10e0: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
10f0: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
1100: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1110: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1120: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62  Transaction, iDb
1130: 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65  , (mask & pParse
1140: 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29  ->writeMask)!=0)
1150: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1160: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1170: 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69  _VerifyCookie, i
1180: 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  Db, pParse->cook
1190: 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b 0a 20  ieValue[iDb]);. 
11a0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
11b0: 20 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20 63 6f   Once all the co
11c0: 6f 6b 69 65 73 20 68 61 76 65 20 62 65 65 6e 20  okies have been 
11d0: 76 65 72 69 66 69 65 64 20 61 6e 64 20 74 72 61  verified and tra
11e0: 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64  nsactions opened
11f0: 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74 61  , .      ** obta
1200: 69 6e 20 74 68 65 20 72 65 71 75 69 72 65 64 20  in the required 
1210: 74 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69  table-locks. Thi
1220: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c  s is a no-op unl
1230: 65 73 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ess the .      *
1240: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 66  * shared-cache f
1250: 65 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65  eature is enable
1260: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
1270: 20 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73    codeTableLocks
1280: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1290: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12a0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
12b0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
12c0: 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  to);.    }..#ifn
12d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12e0: 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 41 64 64  TRACE.    /* Add
12f0: 20 61 20 4e 6f 2d 6f 70 20 74 68 61 74 20 63 6f   a No-op that co
1300: 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6d 70 6c  ntains the compl
1310: 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
1320: 63 6f 6d 70 69 6c 65 64 20 53 51 4c 0a 20 20 20  compiled SQL.   
1330: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 61 73   ** statement as
1340: 20 69 74 73 20 50 33 20 61 72 67 75 6d 65 6e 74   its P3 argument
1350: 2e 20 20 54 68 69 73 20 64 6f 65 73 20 6e 6f 74  .  This does not
1360: 20 63 68 61 6e 67 65 20 74 68 65 20 66 75 6e 63   change the func
1370: 74 69 6f 6e 61 6c 69 74 79 0a 20 20 20 20 2a 2a  tionality.    **
1380: 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   of the program.
1390: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
13a0: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
13b0: 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65  implement sqlite
13c0: 33 5f 74 72 61 63 65 28 29 2e 0a 20 20 20 20 2a  3_trace()..    *
13d0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
13e0: 65 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c  eOp3(v, OP_Noop,
13f0: 20 30 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 7a   0, 0, pParse->z
1400: 53 71 6c 2c 20 70 50 61 72 73 65 2d 3e 7a 54 61  Sql, pParse->zTa
1410: 69 6c 2d 70 50 61 72 73 65 2d 3e 7a 53 71 6c 29  il-pParse->zSql)
1420: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
1430: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f  TE_OMIT_TRACE */
1440: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74 20  .  }...  /* Get 
1450: 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
1460: 20 72 65 61 64 79 20 66 6f 72 20 65 78 65 63 75   ready for execu
1470: 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tion.  */.  if( 
1480: 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72  v && pParse->nEr
1490: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45  r==0 ){.    FILE
14a0: 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d 3e 66   *trace = (db->f
14b0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
14c0: 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74  beTrace)!=0 ? st
14d0: 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20 73 71  dout : 0;.    sq
14e0: 6c 69 74 65 33 56 64 62 65 54 72 61 63 65 28 76  lite3VdbeTrace(v
14f0: 2c 20 74 72 61 63 65 29 3b 0a 20 20 20 20 73 71  , trace);.    sq
1500: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
1510: 64 79 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56  dy(v, pParse->nV
1520: 61 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ar, pParse->nMem
1530: 2b 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  +3,.            
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
1550: 72 73 65 2d 3e 6e 54 61 62 2b 33 2c 20 70 50 61  rse->nTab+3, pPa
1560: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a 20  rse->explain);. 
1570: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
1580: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
1590: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
15a0: 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  sSet = 0;.  }els
15b0: 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63  e if( pParse->rc
15c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15d0: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
15e0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
15f0: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  }.  pParse->nTab
1600: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
1610: 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72  nMem = 0;.  pPar
1620: 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20  se->nSet = 0;.  
1630: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
1640: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  ;.  pParse->cook
1650: 69 65 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50  ieMask = 0;.  pP
1660: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
1670: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
1680: 75 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 6e  un the parser an
1690: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  d code generator
16a0: 20 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20   recursively in 
16b0: 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74  order to generat
16c0: 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68  e.** code for th
16d0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
16e0: 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65  given onto the e
16f0: 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72 73 65  nd of the pParse
1700: 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72   context.** curr
1710: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
1720: 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20  truction.  When 
1730: 74 68 65 20 70 61 72 73 65 72 20 69 73 20 72 75  the parser is ru
1740: 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a  n recursively.**
1750: 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20 66   this way, the f
1760: 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20  inal OP_Halt is 
1770: 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64  not appended and
1780: 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a   other initializ
1790: 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e  ation.** and fin
17a0: 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20  alization steps 
17b0: 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61  are omitted beca
17c0: 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 68 61  use those are ha
17d0: 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a  ndling by the.**
17e0: 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65   outermost parse
17f0: 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65  r..**.** Not eve
1800: 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61  rything is nesta
1810: 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c  ble.  This facil
1820: 69 74 79 20 69 73 20 64 65 73 69 67 6e 65 64 20  ity is designed 
1830: 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53  to permit.** INS
1840: 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64  ERT, UPDATE, and
1850: 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f   DELETE operatio
1860: 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54  ns against SQLIT
1870: 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a  E_MASTER.  Use.*
1880: 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20 64 65  * care if you de
1890: 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75  cide to try to u
18a0: 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
18b0: 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
18c0: 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64  urposes..*/.void
18d0: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
18e0: 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rse(Parse *pPars
18f0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1900: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
1910: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
1920: 61 72 20 2a 7a 53 71 6c 3b 0a 23 20 64 65 66 69  ar *zSql;.# defi
1930: 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69 7a  ne SAVE_SZ  (siz
1940: 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66 66  eof(Parse) - off
1950: 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61 72  setof(Parse,nVar
1960: 29 29 0a 20 20 63 68 61 72 20 73 61 76 65 42 75  )).  char saveBu
1970: 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69  f[SAVE_SZ];..  i
1980: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1990: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
19a0: 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  rt( pParse->nest
19b0: 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73  ed<10 );  /* Nes
19c0: 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  ting should only
19d0: 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20 64   be of limited d
19e0: 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61  epth */.  va_sta
19f0: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
1a00: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
1a10: 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72 6d 61  3VMPrintf(zForma
1a20: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
1a30: 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  (ap);.  if( zSql
1a40: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1a50: 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  n;   /* A malloc
1a60: 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
1a70: 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73  d */.  }.  pPars
1a80: 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d  e->nested++;.  m
1a90: 65 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20 26  emcpy(saveBuf, &
1aa0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41  pParse->nVar, SA
1ab0: 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74  VE_SZ);.  memset
1ac0: 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  (&pParse->nVar, 
1ad0: 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73  0, SAVE_SZ);.  s
1ae0: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
1af0: 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 30 29  pParse, zSql, 0)
1b00: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
1b10: 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  Sql);.  memcpy(&
1b20: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73 61  pParse->nVar, sa
1b30: 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29 3b  veBuf, SAVE_SZ);
1b40: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  .  pParse->neste
1b50: 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  d--;.}../*.** Lo
1b60: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
1b70: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
1b80: 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61  t describes a pa
1b90: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
1ba0: 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e  e.** table given
1bb0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
1bc0: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74  t table and (opt
1bd0: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d  ionally) the nam
1be0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
1bf0: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
1c00: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
1c10: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
1c20: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
1c30: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
1c40: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
1c50: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
1c60: 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a  e table and the.
1c70: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  ** first matchin
1c80: 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72  g table is retur
1c90: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
1ca0: 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ng for duplicate
1cb0: 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20   table.** names 
1cc0: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
1cd0: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54  earch order is T
1ce0: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
1cf0: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a  MAIN, then any.*
1d00: 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  * auxiliary data
1d10: 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e  bases added usin
1d20: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
1d30: 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  mand..**.** See 
1d40: 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61  also sqlite3Loca
1d50: 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61  teTable()..*/.Ta
1d60: 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  ble *sqlite3Find
1d70: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
1d80: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1d90: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
1da0: 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *zDatabase){.  
1db0: 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20  Table *p = 0;.  
1dc0: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
1dd0: 20 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 66   zName!=0 );.  f
1de0: 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42  or(i=OMIT_TEMPDB
1df0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
1e00: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  ){.    int j = (
1e10: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
1e20: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
1e30: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
1e40: 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73      if( zDatabas
1e50: 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  e!=0 && sqlite3S
1e60: 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65  trICmp(zDatabase
1e70: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61  , db->aDb[j].zNa
1e80: 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  me) ) continue;.
1e90: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
1ea0: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62  ashFind(&db->aDb
1eb0: 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  [j].pSchema->tbl
1ec0: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  Hash, zName, str
1ed0: 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20  len(zName)+1);. 
1ee0: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
1ef0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1f00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
1f10: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
1f20: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
1f30: 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69  escribes a parti
1f40: 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a  cular database.*
1f50: 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  * table given th
1f60: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74  e name of that t
1f70: 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e  able and (option
1f80: 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f  ally) the name o
1f90: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
1fa0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
1fb0: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
1fc0: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
1fd0: 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61  d.  Also leave a
1fe0: 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  n.** error messa
1ff0: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
2000: 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rrMsg..**.** The
2010: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
2020: 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
2030: 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64   and sqlite3Find
2040: 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20  Table() is that 
2050: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
2060: 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20  leaves an error 
2070: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
2080: 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65  e->zErrMsg where
2090: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54  .** sqlite3FindT
20a0: 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e  able() does not.
20b0: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
20c0: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 50 61  e3LocateTable(Pa
20d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
20e0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
20f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61  const char *zDba
2100: 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  se){.  Table *p;
2110: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
2120: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
2130: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2140: 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
2150: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
2160: 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
2170: 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
2180: 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  ULL. */.  if( SQ
2190: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
21a0: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
21b0: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
21c0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73   0;.  }..  p = s
21d0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
21e0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d  pParse->db, zNam
21f0: 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69 66  e, zDbase);.  if
2200: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ( p==0 ){.    if
2210: 28 20 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20  ( zDbase ){.    
2220: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2230: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
2240: 63 68 20 74 61 62 6c 65 3a 20 25 73 2e 25 73 22  ch table: %s.%s"
2250: 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29  , zDbase, zName)
2260: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2270: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2280: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
2290: 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
22a0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
22b0: 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
22c0: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20  chema = 1;.  }. 
22d0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
22e0: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
22f0: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
2300: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
2310: 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c  s .** a particul
2320: 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74  ar index given t
2330: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
2340: 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65  index.** and the
2350: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
2360: 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61  abase that conta
2370: 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ins the index..*
2380: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
2390: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
23a0: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
23b0: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
23c0: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
23d0: 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  for the.** table
23e0: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d   and the first m
23f0: 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73  atching index is
2400: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
2410: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20  checking.** for 
2420: 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20  duplicate index 
2430: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
2440: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
2450: 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72  r is.** TEMP fir
2460: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
2470: 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72  hen any auxiliar
2480: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
2490: 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41  d.** using the A
24a0: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
24b0: 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
24c0: 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65  FindIndex(sqlite
24d0: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
24e0: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
24f0: 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e  char *zDb){.  In
2500: 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e  dex *p = 0;.  in
2510: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49  t i;.  for(i=OMI
2520: 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e  T_TEMPDB; i<db->
2530: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
2540: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
2550: 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72  ^1 : i;  /* Sear
2560: 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d  ch TEMP before M
2570: 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d  AIN */.    Schem
2580: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  a *pSchema = db-
2590: 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b  >aDb[j].pSchema;
25a0: 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26 20  .    if( zDb && 
25b0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
25c0: 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a  Db, db->aDb[j].z
25d0: 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Name) ) continue
25e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
25f0: 63 68 65 6d 61 20 7c 7c 20 28 6a 3d 3d 31 20 26  chema || (j==1 &
2600: 26 20 21 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  & !db->aDb[1].pB
2610: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53  t) );.    if( pS
2620: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70  chema ){.      p
2630: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
2640: 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  nd(&pSchema->idx
2650: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  Hash, zName, str
2660: 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20  len(zName)+1);. 
2670: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 20 29     }.    if( p )
2680: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2690: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
26a0: 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d   Reclaim the mem
26b0: 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20 69  ory used by an i
26c0: 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ndex.*/.static v
26d0: 6f 69 64 20 66 72 65 65 49 6e 64 65 78 28 49 6e  oid freeIndex(In
26e0: 64 65 78 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dex *p){.  sqlit
26f0: 65 46 72 65 65 28 70 2d 3e 7a 43 6f 6c 41 66 66  eFree(p->zColAff
2700: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
2710: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  p);.}../*.** Rem
2720: 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e  ove the given in
2730: 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64  dex from the ind
2740: 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61  ex hash table, a
2750: 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d  nd free.** its m
2760: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
2770: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ..**.** The inde
2780: 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  x is removed fro
2790: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  m the database h
27a0: 61 73 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a  ash tables but.*
27b0: 2a 20 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69  * it is not unli
27c0: 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61  nked from the Ta
27d0: 62 6c 65 20 74 68 61 74 20 69 74 20 69 6e 64 65  ble that it inde
27e0: 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e  xes..** Unlinkin
27f0: 67 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65  g from the Table
2800: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79   must be done by
2810: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
2820: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
2830: 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65   void sqliteDele
2840: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  teIndex(sqlite3 
2850: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
2860: 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 20    Index *pOld;. 
2870: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2880: 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 0a  me = p->zName;..
2890: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
28a0: 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70  HashInsert(&p->p
28b0: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
28c0: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 20   zName, strlen( 
28d0: 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20  zName)+1, 0);.  
28e0: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20  assert( pOld==0 
28f0: 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20  || pOld==p );.  
2900: 66 72 65 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a  freeIndex(p);.}.
2910: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69  ./*.** For the i
2920: 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78  ndex called zIdx
2930: 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f  Name which is fo
2940: 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  und in the datab
2950: 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69  ase iDb,.** unli
2960: 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20 66 72  ke that index fr
2970: 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68 65  om its Table the
2980: 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  n remove the ind
2990: 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69  ex from.** the i
29a0: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 20  ndex hash table 
29b0: 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d  and free all mem
29c0: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 61  ory structures a
29d0: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
29e0: 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a  h the index..*/.
29f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
2a00: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
2a10: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
2a20: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
2a30: 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20  r *zIdxName){.  
2a40: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
2a50: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61 73 68   int len;.  Hash
2a60: 20 2a 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61   *pHash = &db->a
2a70: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
2a80: 3e 69 64 78 48 61 73 68 3b 0a 0a 20 20 6c 65 6e  >idxHash;..  len
2a90: 20 3d 20 73 74 72 6c 65 6e 28 7a 49 64 78 4e 61   = strlen(zIdxNa
2aa0: 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  me);.  pIndex = 
2ab0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
2ac0: 74 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d  t(pHash, zIdxNam
2ad0: 65 2c 20 6c 65 6e 2b 31 2c 20 30 29 3b 0a 20 20  e, len+1, 0);.  
2ae0: 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
2af0: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54    if( pIndex->pT
2b00: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49  able->pIndex==pI
2b10: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49  ndex ){.      pI
2b20: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
2b30: 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70  ndex = pIndex->p
2b40: 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
2b50: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  .      Index *p;
2b60: 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 49 6e  .      for(p=pIn
2b70: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
2b80: 64 65 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65  dex; p && p->pNe
2b90: 78 74 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d  xt!=pIndex; p=p-
2ba0: 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 20 20  >pNext){}.      
2bb0: 69 66 28 20 70 20 26 26 20 70 2d 3e 70 4e 65 78  if( p && p->pNex
2bc0: 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  t==pIndex ){.   
2bd0: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
2be0: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
2bf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2c00: 20 66 72 65 65 49 6e 64 65 78 28 70 49 6e 64 65   freeIndex(pInde
2c10: 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c  x);.  }.  db->fl
2c20: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
2c30: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
2c40: 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20  /*.** Erase all 
2c50: 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69  schema informati
2c60: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d  on from the in-m
2c70: 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
2c80: 73 20 6f 66 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  s of.** a single
2c90: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
2ca0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2cb0: 65 64 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65  ed to reclaim me
2cc0: 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74  mory.** before t
2cd0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6c 6f 73  he database clos
2ce0: 65 73 2e 20 20 49 74 20 69 73 20 61 6c 73 6f 20  es.  It is also 
2cf0: 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 61 20  called during a 
2d00: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74  rollback.** if t
2d10: 68 65 72 65 20 77 65 72 65 20 73 63 68 65 6d 61  here were schema
2d20: 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20   changes during 
2d30: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2d40: 6f 72 20 69 66 20 61 0a 2a 2a 20 73 63 68 65 6d  or if a.** schem
2d50: 61 2d 63 6f 6f 6b 69 65 20 6d 69 73 6d 61 74 63  a-cookie mismatc
2d60: 68 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  h occurs..**.** 
2d70: 49 66 20 69 44 62 3c 3d 30 20 74 68 65 6e 20 72  If iDb<=0 then r
2d80: 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61  eset the interna
2d90: 6c 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20  l schema tables 
2da0: 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
2db0: 0a 2a 2a 20 66 69 6c 65 73 2e 20 20 49 66 20 69  .** files.  If i
2dc0: 44 62 3e 3d 32 20 74 68 65 6e 20 72 65 73 65 74  Db>=2 then reset
2dd0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63   the internal sc
2de0: 68 65 6d 61 20 66 6f 72 20 6f 6e 6c 79 20 74 68  hema for only th
2df0: 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 66 69 6c 65  e.** single file
2e00: 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 76   indicated..*/.v
2e10: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74  oid sqlite3Reset
2e20: 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 73  InternalSchema(s
2e30: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
2e40: 69 44 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  iDb){.  int i, j
2e50: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  ;..  assert( iDb
2e60: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
2e70: 44 62 20 29 3b 0a 20 20 66 6f 72 28 69 3d 69 44  Db );.  for(i=iD
2e80: 62 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  b; i<db->nDb; i+
2e90: 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  +){.    Db *pDb 
2ea0: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
2eb0: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68     if( pDb->pSch
2ec0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ema ){.      sql
2ed0: 69 74 65 33 53 63 68 65 6d 61 46 72 65 65 28 70  ite3SchemaFree(p
2ee0: 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Db->pSchema);.  
2ef0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e    }.    if( iDb>
2f00: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a  0 ) return;.  }.
2f10: 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30    assert( iDb==0
2f20: 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20   );.  db->flags 
2f30: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
2f40: 6e 43 68 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20  nChanges;..  /* 
2f50: 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  If one or more o
2f60: 66 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  f the auxiliary 
2f70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68  database files h
2f80: 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a  as been closed,.
2f90: 20 20 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65    ** then remove
2fa0: 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 61   them from the a
2fb0: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
2fc0: 65 20 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65  e list.  We take
2fd0: 20 74 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74   the.  ** opport
2fe0: 75 6e 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73  unity to do this
2ff0: 20 68 65 72 65 20 73 69 6e 63 65 20 77 65 20 68   here since we h
3000: 61 76 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64  ave just deleted
3010: 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a   all of the.  **
3020: 20 73 63 68 65 6d 61 20 68 61 73 68 20 74 61 62   schema hash tab
3030: 6c 65 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72  les and therefor
3040: 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  e do not have to
3050: 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65   make any change
3060: 73 0a 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66  s.  ** to any of
3070: 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20   those tables.. 
3080: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
3090: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
30a0: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
30b0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
30c0: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
30d0: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  Bt==0 ){.      i
30e0: 66 28 20 70 44 62 2d 3e 70 41 75 78 20 26 26 20  f( pDb->pAux && 
30f0: 70 44 62 2d 3e 78 46 72 65 65 41 75 78 20 29 20  pDb->xFreeAux ) 
3100: 70 44 62 2d 3e 78 46 72 65 65 41 75 78 28 70 44  pDb->xFreeAux(pD
3110: 62 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20  b->pAux);.      
3120: 70 44 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20  pDb->pAux = 0;. 
3130: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
3140: 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  =j=2; i<db->nDb;
3150: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
3160: 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d  t Db *pDb = &db-
3170: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
3180: 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a   pDb->pBt==0 ){.
3190: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
31a0: 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  (pDb->zName);.  
31b0: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d      pDb->zName =
31c0: 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   0;.      contin
31d0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
31e0: 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64  ( j<i ){.      d
31f0: 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e  b->aDb[j] = db->
3200: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  aDb[i];.    }.  
3210: 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d    j++;.  }.  mem
3220: 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c  set(&db->aDb[j],
3230: 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a   0, (db->nDb-j)*
3240: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a  sizeof(db->aDb[j
3250: 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  ]));.  db->nDb =
3260: 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44   j;.  if( db->nD
3270: 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21  b<=2 && db->aDb!
3280: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
3290: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d  {.    memcpy(db-
32a0: 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e  >aDbStatic, db->
32b0: 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62  aDb, 2*sizeof(db
32c0: 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20  ->aDb[0]));.    
32d0: 73 71 6c 69 74 65 46 72 65 65 28 64 62 2d 3e 61  sqliteFree(db->a
32e0: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
32f0: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
3300: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3310: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
3320: 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61  alled whenever a
3330: 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
3340: 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
3350: 0a 2a 2a 20 73 63 68 65 6d 61 20 63 68 61 6e 67  .** schema chang
3360: 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72  es during the tr
3370: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
3380: 77 65 20 68 61 76 65 20 74 6f 20 72 65 73 65 74  we have to reset
3390: 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c   the.** internal
33a0: 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64   hash tables and
33b0: 20 72 65 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f   reload them fro
33c0: 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  m disk..*/.void 
33d0: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 49  sqlite3RollbackI
33e0: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73  nternalChanges(s
33f0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
3400: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
3410: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
3420: 67 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ges ){.    sqlit
3430: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
3440: 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20  chema(db, 0);.  
3450: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
3460: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
3470: 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20  d when a commit 
3480: 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
3490: 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
34a0: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c  ernalChanges(sql
34b0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d  ite3 *db){.  db-
34c0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
34d0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
34e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
34f0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
3500: 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 6f 72   from a table or
3510: 20 76 69 65 77 2e 0a 2a 2f 0a 73 74 61 74 69 63   view..*/.static
3520: 20 76 6f 69 64 20 73 71 6c 69 74 65 52 65 73 65   void sqliteRese
3530: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62  tColumnNames(Tab
3540: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69  le *pTable){.  i
3550: 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  nt i;.  Column *
3560: 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  pCol;.  assert( 
3570: 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69  pTable!=0 );.  i
3580: 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c  f( (pCol = pTabl
3590: 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20  e->aCol)!=0 ){. 
35a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
35b0: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  able->nCol; i++,
35c0: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
35d0: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
35e0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  >zName);.      s
35f0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3600: 28 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20  (pCol->pDflt);. 
3610: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
3620: 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20  pCol->zType);.  
3630: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
3640: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20  Col->zColl);.   
3650: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
3660: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b  e(pTable->aCol);
3670: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 61  .  }.  pTable->a
3680: 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  Col = 0;.  pTabl
3690: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a  e->nCol = 0;.}..
36a0: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
36b0: 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72   memory data str
36c0: 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
36d0: 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
36e0: 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20  n.** Table.  No 
36f0: 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
3700: 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73   to disk by this
3710: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
3720: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
3730: 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61  t deletes the da
3740: 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  ta structure.  I
3750: 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e  t does not unlin
3760: 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64  k.** the table d
3770: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72  ata structure fr
3780: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
3790: 65 2e 20 20 4e 6f 72 20 64 6f 65 73 20 69 74 20  e.  Nor does it 
37a0: 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67  remove.** foreig
37b0: 6e 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 20  n keys from the 
37c0: 73 71 6c 69 74 65 2e 61 46 4b 65 79 20 68 61 73  sqlite.aFKey has
37d0: 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74  h table.  But it
37e0: 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a   does destroy.**
37f0: 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
3800: 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65  es of the indice
3810: 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65  s and foreign ke
3820: 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
3830: 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  th .** the table
3840: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20  ..**.** Indices 
3850: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
3860: 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 75 6e  the table are un
3870: 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20  linked from the 
3880: 22 64 62 22 0a 2a 2a 20 64 61 74 61 20 73 74 72  "db".** data str
3890: 75 63 74 75 72 65 20 69 66 20 64 62 21 3d 4e 55  ucture if db!=NU
38a0: 4c 4c 2e 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c  LL.  If db==NULL
38b0: 2c 20 69 6e 64 69 63 65 73 20 61 74 74 61 63 68  , indices attach
38c0: 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62  ed to.** the tab
38d0: 6c 65 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20  le are deleted, 
38e0: 62 75 74 20 69 74 20 69 73 20 61 73 73 75 6d 65  but it is assume
38f0: 64 20 74 68 65 79 20 68 61 76 65 20 61 6c 72 65  d they have alre
3900: 61 64 79 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69  ady been.** unli
3910: 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nked..*/.void sq
3920: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
3930: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
3940: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
3950: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a  Index *pIndex, *
3960: 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70  pNext;.  FKey *p
3970: 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79  FKey, *pNextFKey
3980: 3b 0a 0a 20 20 64 62 20 3d 20 30 3b 0a 0a 20 20  ;..  db = 0;..  
3990: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20  if( pTable==0 ) 
39a0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 6f  return;..  /* Do
39b0: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
39c0: 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20  table until the 
39d0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
39e0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f  reaches zero. */
39f0: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 2d  .  pTable->nRef-
3a00: 2d 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  -;.  if( pTable-
3a10: 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 72  >nRef>0 ){.    r
3a20: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
3a30: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65  ert( pTable->nRe
3a40: 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65  f==0 );..  /* De
3a50: 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  lete all indices
3a60: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3a70: 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f   this table.  */
3a80: 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20  .  for(pIndex = 
3a90: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
3aa0: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
3ab0: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
3ac0: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
3ad0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
3ae0: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  ndex->pSchema==p
3af0: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29  Table->pSchema )
3b00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65  ;.    sqliteDele
3b10: 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  teIndex(db, pInd
3b20: 65 78 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  ex);.  }..#ifnde
3b30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
3b40: 52 45 49 47 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44  REIGN_KEY.  /* D
3b50: 65 6c 65 74 65 20 61 6c 6c 20 66 6f 72 65 69 67  elete all foreig
3b60: 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65  n keys associate
3b70: 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c  d with this tabl
3b80: 65 2e 20 20 54 68 65 20 6b 65 79 73 0a 20 20 2a  e.  The keys.  *
3b90: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  * should have al
3ba0: 72 65 61 64 79 20 62 65 65 6e 20 75 6e 6c 69 6e  ready been unlin
3bb0: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ked from the db-
3bc0: 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c  >aFKey hash tabl
3bd0: 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46  e .  */.  for(pF
3be0: 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65  Key=pTable->pFKe
3bf0: 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d  y; pFKey; pFKey=
3c00: 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20 20  pNextFKey){.    
3c10: 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b 65  pNextFKey = pFKe
3c20: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20  y->pNextFrom;.  
3c30: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3c40: 33 48 61 73 68 46 69 6e 64 28 26 70 54 61 62 6c  3HashFind(&pTabl
3c50: 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65  e->pSchema->aFKe
3c60: 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
3c80: 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e  Key->zTo, strlen
3c90: 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21  (pFKey->zTo)+1)!
3ca0: 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73 71  =pFKey );.    sq
3cb0: 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b  liteFree(pFKey);
3cc0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
3cd0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62  * Delete the Tab
3ce0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73  le structure its
3cf0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  elf..  */.  sqli
3d00: 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  teResetColumnNam
3d10: 65 73 28 70 54 61 62 6c 65 29 3b 0a 20 20 73 71  es(pTable);.  sq
3d20: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
3d30: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  >zName);.  sqlit
3d40: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 43  eFree(pTable->zC
3d50: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
3d60: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54  3SelectDelete(pT
3d70: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  able->pSelect);.
3d80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3d90: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73 71 6c 69  MIT_CHECK.  sqli
3da0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 54  te3ExprDelete(pT
3db0: 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23  able->pCheck);.#
3dc0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 46 72  endif.  sqliteFr
3dd0: 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f  ee(pTable);.}../
3de0: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20  *.** Unlink the 
3df0: 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d  given table from
3e00: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73   the hash tables
3e10: 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20   and the delete 
3e20: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72  the.** table str
3e30: 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20  ucture with all 
3e40: 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20  its indices and 
3e50: 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f  foreign keys..*/
3e60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c  .void sqlite3Unl
3e70: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c  inkAndDeleteTabl
3e80: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  e(sqlite3 *db, i
3e90: 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68  nt iDb, const ch
3ea0: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20  ar *zTabName){. 
3eb0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 46 4b 65   Table *p;.  FKe
3ec0: 79 20 2a 70 46 31 2c 20 2a 70 46 32 3b 0a 20 20  y *pF1, *pF2;.  
3ed0: 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65  Db *pDb;..  asse
3ee0: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61  rt( db!=0 );.  a
3ef0: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
3f00: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
3f10: 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 4e 61    assert( zTabNa
3f20: 6d 65 20 26 26 20 7a 54 61 62 4e 61 6d 65 5b 30  me && zTabName[0
3f30: 5d 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62  ] );.  pDb = &db
3f40: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20  ->aDb[iDb];.  p 
3f50: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
3f60: 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  ert(&pDb->pSchem
3f70: 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62  a->tblHash, zTab
3f80: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 54 61  Name, strlen(zTa
3f90: 62 4e 61 6d 65 29 2b 31 2c 30 29 3b 0a 20 20 69  bName)+1,0);.  i
3fa0: 66 28 20 70 20 29 7b 0a 23 69 66 6e 64 65 66 20  f( p ){.#ifndef 
3fb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
3fc0: 49 47 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28  IGN_KEY.    for(
3fd0: 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46  pF1=p->pFKey; pF
3fe0: 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78  1; pF1=pF1->pNex
3ff0: 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e  tFrom){.      in
4000: 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70  t nTo = strlen(p
4010: 46 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20  F1->zTo) + 1;.  
4020: 20 20 20 20 70 46 32 20 3d 20 73 71 6c 69 74 65      pF2 = sqlite
4030: 33 48 61 73 68 46 69 6e 64 28 26 70 44 62 2d 3e  3HashFind(&pDb->
4040: 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20  pSchema->aFKey, 
4050: 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a  pF1->zTo, nTo);.
4060: 20 20 20 20 20 20 69 66 28 20 70 46 32 3d 3d 70        if( pF2==p
4070: 46 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  F1 ){.        sq
4080: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
4090: 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61  &pDb->pSchema->a
40a0: 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20  FKey, pF1->zTo, 
40b0: 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74 54  nTo, pF1->pNextT
40c0: 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  o);.      }else{
40d0: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
40e0: 70 46 32 20 26 26 20 70 46 32 2d 3e 70 4e 65 78  pF2 && pF2->pNex
40f0: 74 54 6f 21 3d 70 46 31 20 29 7b 20 70 46 32 3d  tTo!=pF1 ){ pF2=
4100: 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a  pF2->pNextTo; }.
4110: 20 20 20 20 20 20 20 20 69 66 28 20 70 46 32 20          if( pF2 
4120: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 32  ){.          pF2
4130: 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d  ->pNextTo = pF1-
4140: 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 20 20  >pNextTo;.      
4150: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4160: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  }.#endif.    sql
4170: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
4180: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 20 20 64 62  db, p);.  }.  db
4190: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
41a0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
41b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
41c0: 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20  a token, return 
41d0: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f  a string that co
41e0: 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65  nsists of the te
41f0: 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f  xt of that.** to
4200: 6b 65 6e 20 77 69 74 68 20 61 6e 79 20 71 75 6f  ken with any quo
4210: 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76 65 64 2e  tations removed.
4220: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
4230: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
4240: 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e  ing.** is obtain
4250: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ed from sqliteMa
4260: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
4270: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
4280: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
4290: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e  ion..**.** Token
42a0: 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74  s are often just
42b0: 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74   pointers into t
42c0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
42d0: 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61  text and so.** a
42e0: 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d  re not \000 term
42f0: 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e  inated and are n
4300: 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20  ot persistent.  
4310: 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  The returned str
4320: 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74  ing.** is \000 t
4330: 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73  erminated and is
4340: 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a   persistent..*/.
4350: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d  char *sqlite3Nam
4360: 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e  eFromToken(Token
4370: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72   *pName){.  char
4380: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70   *zName;.  if( p
4390: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  Name ){.    zNam
43a0: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
43b0: 70 28 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e  p((char*)pName->
43c0: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
43d0: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
43e0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  (zName);.  }else
43f0: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
4400: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
4410: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ame;.}../*.** Op
4420: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  en the sqlite_ma
4430: 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65  ster table store
4440: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75  d in database nu
4450: 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20  mber iDb for.** 
4460: 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62  writing. The tab
4470: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  le is opened usi
4480: 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  ng cursor 0..*/.
4490: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e  void sqlite3Open
44a0: 4d 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73  MasterTable(Pars
44b0: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *p, int iDb){.
44c0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
44d0: 74 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20  te3GetVdbe(p);. 
44e0: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
44f0: 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52  k(p, iDb, MASTER
4500: 5f 52 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41  _ROOT, 1, SCHEMA
4510: 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20  _TABLE(iDb));.  
4520: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4530: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
4540: 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  iDb, 0);.  sqlit
4550: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4560: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20  P_OpenWrite, 0, 
4570: 4d 41 53 54 45 52 5f 52 4f 4f 54 29 3b 0a 20 20  MASTER_ROOT);.  
4580: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4590: 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c  (v, OP_SetNumCol
45a0: 75 6d 6e 73 2c 20 30 2c 20 35 29 3b 20 2f 2a 20  umns, 0, 5); /* 
45b0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 68 61  sqlite_master ha
45c0: 73 20 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d  s 5 columns */.}
45d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65  ../*.** The toke
45e0: 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e  n *pName contain
45f0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
4600: 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72  database (either
4610: 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74   "main" or.** "t
4620: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
4630: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
4640: 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  db). This routin
4650: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
4660: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61   index of the na
4670: 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20  med database in 
4680: 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31  db->aDb[], or -1
4690: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62   if the named db
46a0: 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78   .** does not ex
46b0: 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ist..*/.int sqli
46c0: 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65  te3FindDb(sqlite
46d0: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
46e0: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ame){.  int i = 
46f0: 2d 31 3b 20 20 20 20 2f 2a 20 44 61 74 61 62 61  -1;    /* Databa
4700: 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  se number */.  i
4710: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  nt n;         /*
4720: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
4730: 63 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61 6d  cters in the nam
4740: 65 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20  e */.  Db *pDb; 
4750: 20 20 20 20 20 20 2f 2a 20 41 20 64 61 74 61 62        /* A datab
4760: 61 73 65 20 77 68 6f 73 65 20 6e 61 6d 65 20 73  ase whose name s
4770: 70 61 63 65 20 69 73 20 62 65 69 6e 67 20 73 65  pace is being se
4780: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 68 61 72  arched */.  char
4790: 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61   *zName;   /* Na
47a0: 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68  me we are search
47b0: 69 6e 67 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a 4e  ing for */..  zN
47c0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
47d0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
47e0: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  );.  if( zName )
47f0: 7b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e  {.    n = strlen
4800: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72  (zName);.    for
4810: 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20  (i=(db->nDb-1), 
4820: 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  pDb=&db->aDb[i];
4830: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d   i>=0; i--, pDb-
4840: 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 21  -){.      if( (!
4850: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69  OMIT_TEMPDB || i
4860: 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73 74 72 6c  !=1 ) && n==strl
4870: 65 6e 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26  en(pDb->zName) &
4880: 26 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d 3d  & .          0==
4890: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
48a0: 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  Db->zName, zName
48b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  ) ){.        bre
48c0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
48d0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
48e0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72  (zName);.  }.  r
48f0: 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54  eturn i;.}../* T
4900: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
4910: 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d 65   or trigger name
4920: 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
4930: 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74  is routine via t
4940: 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20  okens.** pName1 
4950: 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74  and pName2. If t
4960: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61  he table name wa
4970: 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  s fully qualifie
4980: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  d, for example:.
4990: 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42  **.** CREATE TAB
49a0: 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29  LE xxx.yyy (...)
49b0: 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e  ;.** .** Then pN
49c0: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
49d0: 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  xxx" and pName2 
49e0: 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74  "yyy". On the ot
49f0: 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74  her hand if.** t
4a00: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73  he table name is
4a10: 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69   not fully quali
4a20: 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a  fied, i.e.:.**.*
4a30: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79  * CREATE TABLE y
4a40: 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54  yy(...);.**.** T
4a50: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
4a60: 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70  t to "yyy" and p
4a70: 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a  Name2 is ""..**.
4a80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4a90: 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71 75  sets the *ppUnqu
4aa0: 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f  al pointer to po
4ab0: 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e  int at the token
4ac0: 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70   (pName1 or.** p
4ad0: 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72  Name2) that stor
4ae0: 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  es the unqualifi
4af0: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20  ed table name.  
4b00: 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  The index of the
4b10: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78 78  .** database "xx
4b20: 78 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  x" is returned..
4b30: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 77  */.int sqlite3Tw
4b40: 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61 72  oPartName(.  Par
4b50: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4b60: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
4b70: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
4b80: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
4b90: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
4ba0: 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69 6e   /* The "xxx" in
4bb0: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
4bc0: 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a  yy" or "xxx" */.
4bd0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
4be0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79 79        /* The "yy
4bf0: 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22  y" in the name "
4c00: 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f  xxx.yyy" */.  To
4c10: 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20  ken **pUnqual   
4c20: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75    /* Write the u
4c30: 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65 63  nqualified objec
4c40: 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29  t name here */.)
4c50: 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  {.  int iDb;    
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
4c80: 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20 2a  ing the object *
4c90: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
4ca0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
4cb0: 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70   if( pName2 && p
4cc0: 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20  Name2->n>0 ){.  
4cd0: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
4ce0: 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20  nit.busy );.    
4cf0: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
4d00: 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  2;.    iDb = sql
4d10: 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70  ite3FindDb(db, p
4d20: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20  Name1);.    if( 
4d30: 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73  iDb<0 ){.      s
4d40: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4d50: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
4d60: 64 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e  database %T", pN
4d70: 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70 50 61  ame1);.      pPa
4d80: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
4d90: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
4da0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
4db0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69   assert( db->ini
4dc0: 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e  t.iDb==0 || db->
4dd0: 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20  init.busy );.   
4de0: 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e   iDb = db->init.
4df0: 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61  iDb;.    *pUnqua
4e00: 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a  l = pName1;.  }.
4e10: 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a    return iDb;.}.
4e20: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4e30: 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 63  ine is used to c
4e40: 68 65 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d  heck if the UTF-
4e50: 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69  8 string zName i
4e60: 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71  s a legal.** unq
4e70: 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f  ualified name fo
4e80: 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f  r a new schema o
4e90: 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e  bject (table, in
4ea0: 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20  dex, view or.** 
4eb0: 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61  trigger). All na
4ec0: 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78  mes are legal ex
4ed0: 63 65 70 74 20 74 68 6f 73 65 20 74 68 61 74 20  cept those that 
4ee0: 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 73  begin with the s
4ef0: 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65  tring.** "sqlite
4f00: 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f  _" (in upper, lo
4f10: 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73  wer or mixed cas
4f20: 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e  e). This portion
4f30: 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63   of the namespac
4f40: 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64  e.** is reserved
4f50: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73   for internal us
4f60: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
4f70: 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
4f80: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
4f90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
4fa0: 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73  e){.  if( !pPars
4fb0: 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  e->db->init.busy
4fc0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74   && pParse->nest
4fd0: 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  ed==0 .         
4fe0: 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d   && (pParse->db-
4ff0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
5000: 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a  WriteSchema)==0.
5010: 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d            && 0==
5020: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
5030: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
5040: 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  , 7) ){.    sqli
5050: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5060: 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65  se, "object name
5070: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e   reserved for in
5080: 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c  ternal use: %s",
5090: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74   zName);.    ret
50a0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
50b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
50c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
50d0: 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75  ** Begin constru
50e0: 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  cting a new tabl
50f0: 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
5100: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
5110: 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  s is.** the firs
5120: 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74  t of several act
5130: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ion routines tha
5140: 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20  t get called in 
5150: 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61  response.** to a
5160: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
5170: 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72  atement.  In par
5180: 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f  ticular, this ro
5190: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a  utine is called.
51a0: 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20  ** after seeing 
51b0: 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20  tokens "CREATE" 
51c0: 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20  and "TABLE" and 
51d0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  the table name. 
51e0: 20 54 68 65 0a 2a 2a 20 70 53 74 61 72 74 20 74   The.** pStart t
51f0: 6f 6b 65 6e 20 69 73 20 74 68 65 20 43 52 45 41  oken is the CREA
5200: 54 45 20 61 6e 64 20 70 4e 61 6d 65 20 69 73 20  TE and pName is 
5210: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  the table name. 
5220: 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66   The isTemp.** f
5230: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
5240: 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  he table should 
5250: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
5260: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
5270: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74  ase.** file inst
5280: 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61  ead of in the ma
5290: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
52a0: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
52b0: 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20  lly the case.** 
52c0: 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20  when the "TEMP" 
52d0: 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b  or "TEMPORARY" k
52e0: 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e  eyword occurs in
52f0: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41   between.** CREA
5300: 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a  TE and TABLE..**
5310: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c  .** The new tabl
5320: 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74  e record is init
5330: 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20  ialized and put 
5340: 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  in pParse->pNewT
5350: 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65  able..** As more
5360: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
5370: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
5380: 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69  s parsed, additi
5390: 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72  onal action.** r
53a0: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20  outines will be 
53b0: 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f  called to add mo
53c0: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
53d0: 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a  o this record..*
53e0: 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
53f0: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
5400: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
5410: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
5420: 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  ) routine.** is 
5430: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65  called to comple
5440: 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  te the construct
5450: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ion of the new t
5460: 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a  able record..*/.
5470: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61 72  void sqlite3Star
5480: 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  tTable(.  Parse 
5490: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
54a0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
54b0: 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c    Token *pStart,
54c0: 20 20 20 2f 2a 20 54 68 65 20 22 43 52 45 41 54     /* The "CREAT
54d0: 45 22 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f  E" token */.  To
54e0: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f  ken *pName1,   /
54f0: 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20  * First part of 
5500: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
5510: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
5520: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
5530: 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61  ,   /* Second pa
5540: 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  rt of the name o
5550: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  f the table or v
5560: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
5570: 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  emp,      /* Tru
5580: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 54  e if this is a T
5590: 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  EMP table */.  i
55a0: 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 20  nt isView,      
55b0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
55c0: 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69  is a VIEW */.  i
55d0: 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20  nt noErr        
55e0: 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66  /* Do nothing if
55f0: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
5600: 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61  xists */.){.  Ta
5610: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63  ble *pTable;.  c
5620: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20  har *zName = 0; 
5630: 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  /* The name of t
5640: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a  he new table */.
5650: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
5660: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
5670: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62  be *v;.  int iDb
5680: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ;         /* Dat
5690: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20  abase number to 
56a0: 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65  create the table
56b0: 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a   in */.  Token *
56c0: 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71  pName;    /* Unq
56d0: 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
56e0: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72   the table to cr
56f0: 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  eate */..  /* Th
5700: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
5710: 6e 61 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69  name to create i
5720: 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
5730: 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b   routine via tok
5740: 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20  ens.  ** pName1 
5750: 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74  and pName2. If t
5760: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61  he table name wa
5770: 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  s fully qualifie
5780: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  d, for example:.
5790: 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45    **.  ** CREATE
57a0: 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28   TABLE xxx.yyy (
57b0: 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a  ...);.  ** .  **
57c0: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
57d0: 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64  set to "xxx" and
57e0: 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f   pName2 "yyy". O
57f0: 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
5800: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62   if.  ** the tab
5810: 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66  le name is not f
5820: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
5830: 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  i.e.:.  **.  ** 
5840: 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79  CREATE TABLE yyy
5850: 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  (...);.  **.  **
5860: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
5870: 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64  set to "yyy" and
5880: 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20   pName2 is "".. 
5890: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c   **.  ** The cal
58a0: 6c 20 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65  l below sets the
58b0: 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74   pName pointer t
58c0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74  o point at the t
58d0: 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a  oken (pName1 or.
58e0: 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61    ** pName2) tha
58f0: 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71  t stores the unq
5900: 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e  ualified table n
5910: 61 6d 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c  ame. The variabl
5920: 65 20 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65  e iDb is.  ** se
5930: 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
5940: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
5950: 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72  hat the table or
5960: 20 76 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20   view is to be. 
5970: 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a   ** created in..
5980: 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c    */.  iDb = sql
5990: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
59a0: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
59b0: 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
59c0: 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72  .  if( iDb<0 ) r
59d0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d  eturn;.  if( !OM
59e0: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54  IT_TEMPDB && isT
59f0: 65 6d 70 20 26 26 20 69 44 62 3e 31 20 29 7b 0a  emp && iDb>1 ){.
5a00: 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69      /* If creati
5a10: 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c  ng a temp table,
5a20: 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f   the name may no
5a30: 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 20 2a  t be qualified *
5a40: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  /.    sqlite3Err
5a50: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
5a60: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e  emporary table n
5a70: 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75  ame must be unqu
5a80: 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 72  alified");.    r
5a90: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
5aa0: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
5ab0: 20 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20   isTemp ) iDb = 
5ac0: 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e  1;..  pParse->sN
5ad0: 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d  ameToken = *pNam
5ae0: 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  e;.  zName = sql
5af0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
5b00: 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  n(pName);.  if( 
5b10: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
5b20: 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  n;.  if( SQLITE_
5b30: 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
5b40: 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
5b50: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
5b60: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
5b70: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69  e_error;.  }.  i
5b80: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  f( db->init.iDb=
5b90: 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b  =1 ) isTemp = 1;
5ba0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5bb0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
5bc0: 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  ON.  assert( (is
5bd0: 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d  Temp & 1)==isTem
5be0: 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74  p );.  {.    int
5bf0: 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20   code;.    char 
5c00: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
5c10: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db].zName;.    i
5c20: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
5c30: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
5c40: 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
5c50: 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c  A_TABLE(isTemp),
5c60: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
5c70: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
5c80: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
5c90: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
5ca0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
5cb0: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
5cc0: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  mp ){.        co
5cd0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
5ce0: 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  TE_TEMP_VIEW;.  
5cf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5d00: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
5d10: 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20  _CREATE_VIEW;.  
5d20: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
5d30: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
5d40: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
5d50: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
5d60: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
5d70: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  E_TEMP_TABLE;.  
5d80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5d90: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
5da0: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20  _CREATE_TABLE;. 
5db0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5dc0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
5dd0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
5de0: 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  de, zName, 0, zD
5df0: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
5e00: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
5e10: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  or;.    }.  }.#e
5e20: 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ndif..  /* Make 
5e30: 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62  sure the new tab
5e40: 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74  le name does not
5e50: 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e   collide with an
5e60: 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69   existing.  ** i
5e70: 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61  ndex or table na
5e80: 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  me in the same d
5e90: 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65 20  atabase.  Issue 
5ea0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
5eb0: 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73   if.  ** it does
5ec0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  ..  */.  if( SQL
5ed0: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
5ee0: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
5ef0: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65  ) ){.    goto be
5f00: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
5f10: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20  .  }.  pTable = 
5f20: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
5f30: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e  (db, zName, db->
5f40: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b  aDb[iDb].zName);
5f50: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b  .  if( pTable ){
5f60: 0a 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20  .    if( !noErr 
5f70: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5f80: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5f90: 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61   "table %T alrea
5fa0: 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d  dy exists", pNam
5fb0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  e);.    }.    go
5fc0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
5fd0: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rror;.  }.  if( 
5fe0: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
5ff0: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d  (db, zName, 0)!=
6000: 30 20 26 26 20 28 69 44 62 3d 3d 30 20 7c 7c 20  0 && (iDb==0 || 
6010: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20  !db->init.busy) 
6020: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
6030: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6040: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
6050: 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20   an index named 
6060: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
6070: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6080: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
6090: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61  Table = sqliteMa
60a0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62  lloc( sizeof(Tab
60b0: 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
60c0: 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50  ble==0 ){.    pP
60d0: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
60e0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61  E_NOMEM;.    pPa
60f0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
6100: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6110: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
6120: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
6130: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
6140: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  nCol = 0;.  pTab
6150: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->aCol = 0;.  
6160: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
6170: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49  -1;.  pTable->pI
6180: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61 62  ndex = 0;.  pTab
6190: 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62  le->pSchema = db
61a0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
61b0: 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52  ma;.  pTable->nR
61c0: 65 66 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50  ef = 1;.  if( pP
61d0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
61e0: 29 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54  ) sqlite3DeleteT
61f0: 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d  able(db, pParse-
6200: 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70  >pNewTable);.  p
6210: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
6220: 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a   = pTable;..  /*
6230: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
6240: 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71  magic sqlite_seq
6250: 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64  uence table used
6260: 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   by autoincremen
6270: 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63  t,.  ** then rec
6280: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
6290: 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74   this table in t
62a0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
62b0: 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
62c0: 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63  so that INSERT c
62d0: 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c  an find the tabl
62e0: 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23  e easily..  */.#
62f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6300: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
6310: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
6320: 6e 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70  nested && strcmp
6330: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
6340: 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b  sequence")==0 ){
6350: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63  .    pTable->pSc
6360: 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20  hema->pSeqTab = 
6370: 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  pTable;.  }.#end
6380: 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67  if..  /* Begin g
6390: 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f  enerating the co
63a0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73  de that will ins
63b0: 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65  ert the table re
63c0: 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74  cord into.  ** t
63d0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
63e0: 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e   table.  Note in
63f0: 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74   particular that
6400: 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61   we must go ahea
6410: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63  d.  ** and alloc
6420: 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ate the record n
6430: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
6440: 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20  ble entry now.  
6450: 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20  Before any.  ** 
6460: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
6470: 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61  NIQUE keywords a
6480: 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73  re parsed.  Thos
6490: 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20  e keywords will 
64a0: 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63  cause.  ** indic
64b0: 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  es to be created
64c0: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72   and the table r
64d0: 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20  ecord must come 
64e0: 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a  before the .  **
64f0: 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65   indices.  Hence
6500: 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  , the record num
6510: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
6520: 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  e must be alloca
6530: 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20  ted.  ** now..  
6540: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
6550: 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20  it.busy && (v = 
6560: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
6570: 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20  Parse))!=0 ){.  
6580: 20 20 69 6e 74 20 6c 62 6c 3b 0a 20 20 20 20 69    int lbl;.    i
6590: 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20  nt fileFormat;. 
65a0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
65b0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
65c0: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a  arse, 0, iDb);..
65d0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
65e0: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e  le format and en
65f0: 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61  coding in the da
6600: 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20  tabase have not 
6610: 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a  been set, .    *
6620: 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a  * set them now..
6630: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
6640: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6650: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44  P_ReadCookie, iD
6660: 62 2c 20 31 29 3b 20 20 20 2f 2a 20 66 69 6c 65  b, 1);   /* file
6670: 5f 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20 6c  _format */.    l
6680: 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  bl = sqlite3Vdbe
6690: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
66a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
66b0: 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20  Op(v, OP_If, 0, 
66c0: 6c 62 6c 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f  lbl);.    fileFo
66d0: 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67  rmat = (db->flag
66e0: 73 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63  s & SQLITE_Legac
66f0: 79 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20  yFileFmt)!=0 ?. 
6700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6710: 20 31 20 3a 20 53 51 4c 49 54 45 5f 44 45 46 41   1 : SQLITE_DEFA
6720: 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b  ULT_FILE_FORMAT;
6730: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6740: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
6750: 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74 2c  ger, fileFormat,
6760: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
6770: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6780: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
6790: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
67a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
67b0: 6e 74 65 67 65 72 2c 20 45 4e 43 28 64 62 29 2c  nteger, ENC(db),
67c0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
67d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
67e0: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
67f0: 34 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  4);.    sqlite3V
6800: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
6810: 76 2c 20 6c 62 6c 29 3b 0a 0a 20 20 20 20 2f 2a  v, lbl);..    /*
6820: 20 54 68 69 73 20 6a 75 73 74 20 63 72 65 61 74   This just creat
6830: 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65  es a place-holde
6840: 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  r record in the 
6850: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
6860: 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ble..    ** The 
6870: 72 65 63 6f 72 64 20 63 72 65 61 74 65 64 20 64  record created d
6880: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
6890: 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20 49  anything yet.  I
68a0: 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63  t will be replac
68b0: 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  ed.    ** by the
68c0: 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20 63   real entry in c
68d0: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 61 74  ode generated at
68e0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
68f0: 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
6900: 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20  * The rowid for 
6910: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73  the new entry is
6920: 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 74 6f 70   left on the top
6930: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   of the stack.. 
6940: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
6950: 76 61 6c 75 65 20 69 73 20 6e 65 65 64 65 64 20  value is needed 
6960: 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  by the code that
6970: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
6980: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e   will.    ** gen
6990: 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69  erate..    */.#i
69a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
69b0: 54 5f 56 49 45 57 0a 20 20 20 20 69 66 28 20 69  T_VIEW.    if( i
69c0: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 73  sView ){.      s
69d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
69e0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
69f0: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  , 0);.    }else.
6a00: 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20  #endif.    {.   
6a10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6a20: 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  dOp(v, OP_Create
6a30: 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 29 3b 0a  Table, iDb, 0);.
6a40: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6a50: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
6a60: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
6a70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6a80: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  dOp(v, OP_NewRow
6a90: 69 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  id, 0, 0);.    s
6aa0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6ab0: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
6ac0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6ad0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
6ae0: 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  l, 0, 0);.    sq
6af0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6b00: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20  , OP_Insert, 0, 
6b10: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
6b20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
6b30: 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
6b40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6b50: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c  p(v, OP_Pull, 1,
6b60: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e   0);.  }..  /* N
6b70: 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72  ormal (non-error
6b80: 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72  ) return. */.  r
6b90: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  eturn;..  /* If 
6ba0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
6bb0: 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f   we jump here */
6bc0: 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72  .begin_table_err
6bd0: 6f 72 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65  or:.  sqliteFree
6be0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  (zName);.  retur
6bf0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  n;.}../*.** This
6c00: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74   macro is used t
6c10: 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74  o compare two st
6c20: 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d  rings in a case-
6c30: 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e  insensitive mann
6c40: 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69  er..** It is sli
6c50: 67 68 74 6c 79 20 66 61 73 74 65 72 20 74 68 61  ghtly faster tha
6c60: 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  n calling sqlite
6c70: 33 53 74 72 49 43 6d 70 28 29 20 64 69 72 65 63  3StrICmp() direc
6c80: 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64  tly, but.** prod
6c90: 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65  uces larger code
6ca0: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
6cb0: 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e   This macro is n
6cc0: 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  ot compatible wi
6cd0: 74 68 20 74 68 65 20 73 74 72 63 6d 70 28 29 20  th the strcmp() 
6ce0: 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65  family. It.** re
6cf0: 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 74 68  turns true if th
6d00: 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72  e two strings ar
6d10: 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69  e equal, otherwi
6d20: 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65  se false..*/.#de
6d30: 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20  fine STRICMP(x, 
6d40: 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70  y) (\.sqlite3Upp
6d50: 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69  erToLower[*(unsi
6d60: 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d  gned char *)(x)]
6d70: 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70  ==   \.sqlite3Up
6d80: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73  perToLower[*(uns
6d90: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29  igned char *)(y)
6da0: 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74  ]     \.&& sqlit
6db0: 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c  e3StrICmp((x)+1,
6dc0: 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a  (y)+1)==0 )../*.
6dd0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c  ** Add a new col
6de0: 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65  umn to the table
6df0: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
6e00: 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a   constructed..**
6e10: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
6e20: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
6e30: 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  e once for each 
6e40: 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  column declarati
6e50: 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  on.** in a CREAT
6e60: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
6e70: 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  t.  sqlite3Start
6e80: 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c  Table() gets cal
6e90: 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20  led.** first to 
6ea0: 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67  get things going
6eb0: 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75  .  Then this rou
6ec0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
6ed0: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d  or each.** colum
6ee0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
6ef0: 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73  e3AddColumn(Pars
6f00: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
6f10: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c   *pName){.  Tabl
6f20: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
6f30: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75   char *z;.  Colu
6f40: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20  mn *pCol;.  if( 
6f50: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
6f60: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
6f70: 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  urn;.  z = sqlit
6f80: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
6f90: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d  pName);.  if( z=
6fa0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
6fb0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
6fc0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
6fd0: 20 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61   STRICMP(z, p->a
6fe0: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b  Col[i].zName) ){
6ff0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
7000: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7010: 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e  duplicate column
7020: 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a   name: %s", z);.
7030: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
7040: 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (z);.      retur
7050: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  n;.    }.  }.  i
7060: 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78  f( (p->nCol & 0x
7070: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c  7)==0 ){.    Col
7080: 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61  umn *aNew;.    a
7090: 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
70a0: 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70  loc( p->aCol, (p
70b0: 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66  ->nCol+8)*sizeof
70c0: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
70d0: 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
70e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
70f0: 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  ee(z);.      ret
7100: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
7110: 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20  ->aCol = aNew;. 
7120: 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e   }.  pCol = &p->
7130: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20  aCol[p->nCol];. 
7140: 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c   memset(pCol, 0,
7150: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b   sizeof(p->aCol[
7160: 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e  0]));.  pCol->zN
7170: 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20  ame = z;. .  /* 
7180: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74  If there is no t
7190: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63  ype specified, c
71a0: 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20  olumns have the 
71b0: 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79  default affinity
71c0: 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66  .  ** 'NONE'. If
71d0: 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70 65   there is a type
71e0: 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e   specified, then
71f0: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
7200: 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a  nType() will.  *
7210: 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74  * be called next
7220: 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66   to set pCol->af
7230: 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79  finity correctly
7240: 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61  ..  */.  pCol->a
7250: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
7260: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e  _AFF_NONE;.  p->
7270: 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nCol++;.}../*.**
7280: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
7290: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
72a0: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
72b0: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
72c0: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
72d0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
72e0: 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20  .  A "NOT NULL" 
72f0: 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a  constraint has.*
7300: 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61  * been seen on a
7310: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72   column.  This r
7320: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
7330: 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a  notNull flag on.
7340: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75  ** the column cu
7350: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
7360: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
7370: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f  oid sqlite3AddNo
7380: 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61  tNull(Parse *pPa
7390: 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72  rse, int onError
73a0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
73b0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70   int i;.  if( (p
73c0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
73d0: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
73e0: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
73f0: 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29  -1;.  if( i>=0 )
7400: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e   p->aCol[i].notN
7410: 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d  ull = onError;.}
7420: 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65  ../*.** Scan the
7430: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d   column type nam
7440: 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20  e zType (length 
7450: 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72  nType) and retur
7460: 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61  n the.** associa
7470: 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70  ted affinity typ
7480: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
7490: 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73  utine does a cas
74a0: 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65  e-independent se
74b0: 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f  arch of zType fo
74c0: 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72  r the .** substr
74d0: 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ings in the foll
74e0: 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20  owing table. If 
74f0: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
7500: 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e  rings is.** foun
7510: 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  d, the correspon
7520: 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73  ding affinity is
7530: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54   returned. If zT
7540: 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ype contains.** 
7550: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66  more than one of
7560: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c   the substrings,
7570: 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20   entries toward 
7580: 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74  the top of .** t
7590: 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72  he table take pr
75a0: 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d  iority. For exam
75b0: 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73  ple, if zType is
75c0: 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20   'BLOBINT', .** 
75d0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
75e0: 45 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ER is returned..
75f0: 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20  **.** Substring 
7600: 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a      | Affinity.*
7610: 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
7620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7630: 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20  --.** 'INT'     
7640: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
7650: 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41  _INTEGER.** 'CHA
7660: 52 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  R'        | SQLI
7670: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
7680: 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53  CLOB'        | S
7690: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
76a0: 2a 20 27 54 45 58 54 27 20 20 20 20 20 20 20 20  * 'TEXT'        
76b0: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
76c0: 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20  T.** 'BLOB'     
76d0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
76e0: 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20  NONE.** 'REAL'  
76f0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7700: 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41  FF_REAL.** 'FLOA
7710: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7720: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44  E_AFF_REAL.** 'D
7730: 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  OUB'        | SQ
7740: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
7750: 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74  .** If none of t
7760: 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e  he substrings in
7770: 20 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65   the above table
7780: 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53   are found,.** S
7790: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
77a0: 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  C is returned..*
77b0: 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66  /.char sqlite3Af
77c0: 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74  finityType(const
77d0: 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a   Token *pType){.
77e0: 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63    u32 h = 0;.  c
77f0: 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45  har aff = SQLITE
7800: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
7810: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
7820: 68 61 72 20 2a 7a 49 6e 20 3d 20 70 54 79 70 65  har *zIn = pType
7830: 2d 3e 7a 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  ->z;.  const uns
7840: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45 6e 64  igned char *zEnd
7850: 20 3d 20 26 70 54 79 70 65 2d 3e 7a 5b 70 54 79   = &pType->z[pTy
7860: 70 65 2d 3e 6e 5d 3b 0a 0a 20 20 77 68 69 6c 65  pe->n];..  while
7870: 28 20 7a 49 6e 21 3d 7a 45 6e 64 20 29 7b 0a 20  ( zIn!=zEnd ){. 
7880: 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20     h = (h<<8) + 
7890: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
78a0: 77 65 72 5b 2a 7a 49 6e 5d 3b 0a 20 20 20 20 7a  wer[*zIn];.    z
78b0: 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d  In++;.    if( h=
78c0: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27  =(('c'<<24)+('h'
78d0: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
78e0: 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  r') ){          
78f0: 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20     /* CHAR */.  
7900: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
7910: 5f 41 46 46 5f 54 45 58 54 3b 20 0a 20 20 20 20  _AFF_TEXT; .    
7920: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
7930: 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  c'<<24)+('l'<<16
7940: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
7950: 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42  ){       /* CLOB
7960: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
7970: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
7980: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
7990: 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65  ==(('t'<<24)+('e
79a0: 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b  '<<16)+('x'<<8)+
79b0: 27 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a  't') ){       /*
79c0: 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61   TEXT */.      a
79d0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
79e0: 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20  TEXT;.    }else 
79f0: 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34  if( h==(('b'<<24
7a00: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
7a10: 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20  <<8)+'b')       
7a20: 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20     /* BLOB */.  
7a30: 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53        && (aff==S
7a40: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
7a50: 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  C || aff==SQLITE
7a60: 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20  _AFF_REAL) ){.  
7a70: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
7a80: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64  _AFF_NONE;.#ifnd
7a90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
7aa0: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
7ab0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
7ac0: 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c  ('r'<<24)+('e'<<
7ad0: 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27  16)+('a'<<8)+'l'
7ae0: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45  )          /* RE
7af0: 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  AL */.        &&
7b00: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
7b10: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
7b20: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
7b30: 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c  FF_REAL;.    }el
7b40: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c  se if( h==(('f'<
7b50: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
7b60: 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20  'o'<<8)+'a')    
7b70: 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f        /* FLOA */
7b80: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
7b90: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
7ba0: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
7bb0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
7bc0: 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  AL;.    }else if
7bd0: 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b  ( h==(('d'<<24)+
7be0: 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c  ('o'<<16)+('u'<<
7bf0: 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20  8)+'b')         
7c00: 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20   /* DOUB */.    
7c10: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
7c20: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
7c30: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
7c40: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23  LITE_AFF_REAL;.#
7c50: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20  endif.    }else 
7c60: 69 66 28 20 28 68 26 30 78 30 30 46 46 46 46 46  if( (h&0x00FFFFF
7c70: 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28  F)==(('i'<<16)+(
7c80: 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20  'n'<<8)+'t') ){ 
7c90: 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20     /* INT */.   
7ca0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
7cb0: 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  AFF_INTEGER;.   
7cc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7cd0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 66    }..  return af
7ce0: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  f;.}../*.** This
7cf0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
7d00: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
7d10: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
7d20: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
7d30: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
7d40: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  E statement.  Th
7d50: 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69  e pFirst token i
7d60: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74  s the first.** t
7d70: 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75  oken in the sequ
7d80: 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74  ence of tokens t
7d90: 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65  hat describe the
7da0: 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20   type of the.** 
7db0: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
7dc0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
7dd0: 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20  ion.   pLast is 
7de0: 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a  the last token.*
7df0: 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63  * in the sequenc
7e00: 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66  e.  Use this inf
7e10: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73  ormation to cons
7e20: 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a  truct a string.*
7e30: 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  * that contains 
7e40: 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20  the typename of 
7e50: 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73  the column and s
7e60: 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67  tore that string
7e70: 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f  .** in zType..*/
7e80: 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64   .void sqlite3Ad
7e90: 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73  dColumnType(Pars
7ea0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
7eb0: 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c   *pType){.  Tabl
7ec0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
7ed0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a   Column *pCol;..
7ee0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
7ef0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
7f00: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
7f10: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66   p->nCol-1;.  if
7f20: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  ( i<0 ) return;.
7f30: 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f    pCol = &p->aCo
7f40: 6c 5b 69 5d 3b 0a 20 20 73 71 6c 69 74 65 46 72  l[i];.  sqliteFr
7f50: 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b  ee(pCol->zType);
7f60: 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d  .  pCol->zType =
7f70: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
7f80: 54 6f 6b 65 6e 28 70 54 79 70 65 29 3b 0a 20 20  Token(pType);.  
7f90: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
7fa0: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
7fb0: 54 79 70 65 28 70 54 79 70 65 29 3b 0a 7d 0a 0a  Type(pType);.}..
7fc0: 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  /*.** The expres
7fd0: 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61  sion is the defa
7fe0: 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
7ff0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
8000: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  added column.** 
8010: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  of the table cur
8020: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
8030: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
8040: 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65   Default value e
8050: 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20  xpressions must 
8060: 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61  be constant.  Ra
8070: 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ise an exception
8080: 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e   if this.** is n
8090: 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a  ot the case..**.
80a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
80b0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
80c0: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
80d0: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
80e0: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
80f0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
8100: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
8110: 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c  te3AddDefaultVal
8120: 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
8130: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
8140: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f    Table *p;.  Co
8150: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66  lumn *pCol;.  if
8160: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
8170: 4e 65 77 54 61 62 6c 65 29 21 3d 30 20 29 7b 0a  NewTable)!=0 ){.
8180: 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e      pCol = &(p->
8190: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29  aCol[p->nCol-1])
81a0: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
81b0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
81c0: 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70 72  OrFunction(pExpr
81d0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
81e0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
81f0: 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75  e, "default valu
8200: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d  e of column [%s]
8210: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
8220: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ",.          pCo
8230: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  l->zName);.    }
8240: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
8250: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 43  te3ExprDelete(pC
8260: 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20  ol->pDflt);.    
8270: 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20    pCol->pDflt = 
8280: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
8290: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
82a0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
82b0: 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 7d 0a 0a  lete(pExpr);.}..
82c0: 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20  /*.** Designate 
82d0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
82e0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20  for the table.  
82f0: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
8300: 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  of names .** of 
8310: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72  columns that for
8320: 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  m the primary ke
8330: 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20  y.  If pList is 
8340: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a  NULL, then the.*
8350: 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  * most recently 
8360: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20  added column of 
8370: 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65  the table is the
8380: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a   primary key..**
8390: 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20  .** A table can 
83a0: 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65  have at most one
83b0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
83c0: 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
83d0: 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69  ady has.** a pri
83e0: 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68  mary key (and th
83f0: 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
8400: 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68   primary key) th
8410: 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20  en create an.** 
8420: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
8430: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
8440: 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63  is on a single c
8450: 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61  olumn whose data
8460: 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c  type is INTEGER,
8470: 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  .** then we will
8480: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74   try to use that
8490: 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72   column as the r
84a0: 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54  owid.  Set the T
84b0: 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69  able.iPKey.** fi
84c0: 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65  eld of the table
84d0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
84e0: 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e  ion to be the in
84f0: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  dex of the.** IN
8500: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
8510: 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65  Y column.  Table
8520: 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f  .iPKey is set to
8530: 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a   -1 if there is.
8540: 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52  ** no INTEGER PR
8550: 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a  IMARY KEY..**.**
8560: 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e   If the key is n
8570: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
8580: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
8590: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a  create a unique.
85a0: 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65  ** index for the
85b0: 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20   key.  No index 
85c0: 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49  is created for I
85d0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
85e0: 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  EYs..*/.void sql
85f0: 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65  ite3AddPrimaryKe
8600: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
8610: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
8620: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
8630: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
8640: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c   /* List of fiel
8650: 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e  d names to be in
8660: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
8670: 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
8680: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
8690: 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e  a uniqueness con
86a0: 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61  flict */.  int a
86b0: 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20  utoInc,      /* 
86c0: 54 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f  True if the AUTO
86d0: 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72  INCREMENT keywor
86e0: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
86f0: 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20    int sortOrder 
8700: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f      /* SQLITE_SO
8710: 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53  _ASC or SQLITE_S
8720: 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54  O_DESC */.){.  T
8730: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
8740: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
8750: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
8760: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
8770: 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61  -1, i;.  if( pTa
8780: 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 69 6d  b==0 ) goto prim
8790: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20  ary_key_exit;.  
87a0: 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69  if( pTab->hasPri
87b0: 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  mKey ){.    sqli
87c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
87d0: 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c  se, .      "tabl
87e0: 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72  e \"%s\" has mor
87f0: 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61  e than one prima
8800: 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a  ry key", pTab->z
8810: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
8820: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
8830: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61  ;.  }.  pTab->ha
8840: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
8850: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
8860: 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
8870: 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70  >nCol - 1;.    p
8880: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
8890: 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  isPrimKey = 1;. 
88a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
88b0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
88c0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
88d0: 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
88e0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
88f0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ol++){.        i
8900: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
8910: 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
8920: 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
8930: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  iCol].zName)==0 
8940: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
8950: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
8960: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8970: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iCol<pTab->nCol 
8980: 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ){.        pTab-
8990: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72  >aCol[iCol].isPr
89a0: 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20  imKey = 1;.     
89b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
89c0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20   pList->nExpr>1 
89d0: 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d  ) iCol = -1;.  }
89e0: 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26  .  if( iCol>=0 &
89f0: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
8a00: 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  l ){.    zType =
8a10: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
8a20: 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69  ].zType;.  }.  i
8a30: 66 28 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69  f( zType && sqli
8a40: 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65  te3StrICmp(zType
8a50: 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a  , "INTEGER")==0.
8a60: 20 20 20 20 20 20 20 20 26 26 20 73 6f 72 74 4f          && sortO
8a70: 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  rder==SQLITE_SO_
8a80: 41 53 43 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  ASC ){.    pTab-
8a90: 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20  >iPKey = iCol;. 
8aa0: 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66     pTab->keyConf
8ab0: 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20   = onError;.    
8ac0: 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20 3d 20  pTab->autoInc = 
8ad0: 61 75 74 6f 49 6e 63 3b 0a 20 20 7d 65 6c 73 65  autoInc;.  }else
8ae0: 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a   if( autoInc ){.
8af0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8b00: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
8b10: 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  T.    sqlite3Err
8b20: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41  orMsg(pParse, "A
8b30: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20  UTOINCREMENT is 
8b40: 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20  only allowed on 
8b50: 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54  an ".       "INT
8b60: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8b70: 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  ");.#endif.  }el
8b80: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  se{.    sqlite3C
8b90: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
8ba0: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73  e, 0, 0, 0, pLis
8bb0: 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30  t, onError, 0, 0
8bc0: 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 29 3b  , sortOrder, 0);
8bd0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a  .    pList = 0;.
8be0: 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79    }..primary_key
8bf0: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
8c00: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
8c10: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b  List);.  return;
8c20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
8c30: 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  new CHECK constr
8c40: 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c  aint to the tabl
8c50: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
8c60: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
8c70: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
8c80: 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e  ddCheckConstrain
8c90: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
8ca0: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
8cb0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
8cc0: 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20  xpr *pCheckExpr 
8cd0: 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78   /* The check ex
8ce0: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23  pression */.){.#
8cf0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8d00: 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65  IT_CHECK.  Table
8d10: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
8d20: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
8d30: 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 2f 2a  ( pTab ){.    /*
8d40: 20 54 68 65 20 43 48 45 43 4b 20 65 78 70 72 65   The CHECK expre
8d50: 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 64 75  ssion must be du
8d60: 70 6c 69 63 61 74 65 64 20 73 6f 20 74 68 61 74  plicated so that
8d70: 20 74 6f 6b 65 6e 73 20 72 65 66 65 72 0a 20 20   tokens refer.  
8d80: 20 20 2a 2a 20 74 6f 20 6d 61 6c 6c 6f 63 65 64    ** to malloced
8d90: 20 73 70 61 63 65 20 61 6e 64 20 6e 6f 74 20 74   space and not t
8da0: 68 65 20 28 65 70 68 65 6d 65 72 61 6c 29 20 74  he (ephemeral) t
8db0: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
8dc0: 45 20 54 41 42 4c 45 0a 20 20 20 20 2a 2a 20 73  E TABLE.    ** s
8dd0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
8de0: 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73  pTab->pCheck = s
8df0: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 54  qlite3ExprAnd(pT
8e00: 61 62 2d 3e 70 43 68 65 63 6b 2c 20 73 71 6c 69  ab->pCheck, sqli
8e10: 74 65 33 45 78 70 72 44 75 70 28 70 43 68 65 63  te3ExprDup(pChec
8e20: 6b 45 78 70 72 29 29 3b 0a 20 20 7d 0a 23 65 6e  kExpr));.  }.#en
8e30: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78 70  dif.  sqlite3Exp
8e40: 72 44 65 6c 65 74 65 28 70 43 68 65 63 6b 45 78  rDelete(pCheckEx
8e50: 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  pr);.}../*.** Se
8e60: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  t the collation 
8e70: 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  function of the 
8e80: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
8e90: 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d  rsed table colum
8ea0: 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c  n.** to the Coll
8eb0: 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  Seq given..*/.vo
8ec0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
8ed0: 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a  lateType(Parse *
8ee0: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
8ef0: 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e  ar *zType, int n
8f00: 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Type){.  Table *
8f10: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  p;.  int i;..  i
8f20: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
8f30: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
8f40: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
8f50: 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20 69 66 28 20  >nCol-1;..  if( 
8f60: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
8f70: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 54 79  lSeq(pParse, zTy
8f80: 70 65 2c 20 6e 54 79 70 65 29 20 29 7b 0a 20 20  pe, nType) ){.  
8f90: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
8fa0: 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43     p->aCol[i].zC
8fb0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  oll = sqliteStrN
8fc0: 44 75 70 28 7a 54 79 70 65 2c 20 6e 54 79 70 65  Dup(zType, nType
8fd0: 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  );.  .    /* If 
8fe0: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65  the column is de
8ff0: 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65  clared as "<name
9000: 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f  > PRIMARY KEY CO
9010: 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20  LLATE <type>",. 
9020: 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e     ** then an in
9030: 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65  dex may have bee
9040: 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69  n created on thi
9050: 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20  s column before 
9060: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61  the.    ** colla
9070: 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64  tion type was ad
9080: 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69  ded. Correct thi
9090: 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63  s if it is the c
90a0: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
90b0: 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64  for(pIdx=p->pInd
90c0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
90d0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
90e0: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
90f0: 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20  >nColumn==1 );. 
9100: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
9110: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b  iColumn[0]==i ){
9120: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
9130: 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43  zColl[0] = p->aC
9140: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[i].zColl;.   
9150: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
9160: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
9170: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
9180: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
9190: 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73  ence for databas
91a0: 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a  e native text.**
91b0: 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69   encoding identi
91c0: 66 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69  fied by the stri
91d0: 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68  ng zName, length
91e0: 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   nName..**.** If
91f0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
9200: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
9210: 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
9220: 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c  le, or not avail
9230: 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64  able.** in the d
9240: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65  atabase native e
9250: 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c  ncoding, the col
9260: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
9270: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20  s invoked to.** 
9280: 72 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74  request it. If t
9290: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
92a0: 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75  tory does not su
92b0: 70 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75  pply such a sequ
92c0: 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65  ence,.** and the
92d0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61   sequence is ava
92e0: 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65  ilable in anothe
92f0: 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c  r text encoding,
9300: 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a   then that is.**
9310: 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
9320: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76  d..**.** If no v
9330: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72  ersions of the r
9340: 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
9350: 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65  ons sequence are
9360: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a   available, or.*
9370: 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20  * another error 
9380: 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
9390: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20  returned and an 
93a0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72  error message wr
93b0: 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50  itten into.** pP
93c0: 61 72 73 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  arse..*/.CollSeq
93d0: 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43   *sqlite3LocateC
93e0: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
93f0: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
9400: 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61   *zName, int nNa
9410: 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  me){.  sqlite3 *
9420: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9430: 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28  .  u8 enc = ENC(
9440: 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75  db);.  u8 initbu
9450: 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75  sy = db->init.bu
9460: 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  sy;.  CollSeq *p
9470: 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d  Coll;..  pColl =
9480: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
9490: 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61  Seq(db, enc, zNa
94a0: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 69 6e 69 74 62  me, nName, initb
94b0: 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69  usy);.  if( !ini
94c0: 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c  tbusy && (!pColl
94d0: 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70   || !pColl->xCmp
94e0: 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  ) ){.    pColl =
94f0: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
9500: 65 71 28 64 62 2c 20 70 43 6f 6c 6c 2c 20 7a 4e  eq(db, pColl, zN
9510: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
9520: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
9530: 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30       if( nName<0
9540: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4e 61 6d   ){.        nNam
9550: 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
9560: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9570: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9580: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
9590: 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  h collation sequ
95a0: 65 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e 61  ence: %.*s", nNa
95b0: 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  me, zName);.    
95c0: 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20    pColl = 0;.   
95d0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
95e0: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pColl;.}.../*.*
95f0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
9600: 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d  that will increm
9610: 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  ent the schema c
9620: 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ookie..**.** The
9630: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69   schema cookie i
9640: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
9650: 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68  ine when the sch
9660: 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64  ema for the.** d
9670: 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
9680: 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68    After each sch
9690: 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20  ema change, the 
96a0: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20  cookie value.** 
96b0: 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61  changes.  When a
96c0: 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72   process first r
96d0: 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20  eads the schema 
96e0: 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a  it records the.*
96f0: 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65  * cookie.  There
9700: 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20  after, whenever 
9710: 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73  it goes to acces
9720: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a  s the database,.
9730: 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65  ** it checks the
9740: 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20   cookie to make 
9750: 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20  sure the schema 
9760: 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a  has not changed.
9770: 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ** since it was 
9780: 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  last read..**.**
9790: 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f   This plan is no
97a0: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c  t completely bul
97b0: 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69  let-proof.  It i
97c0: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a  s possible for.*
97d0: 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20  * the schema to 
97e0: 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20  change multiple 
97f0: 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68  times and for th
9800: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a  e cookie to be.*
9810: 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72  * set back to pr
9820: 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20  ior value.  But 
9830: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61  schema changes a
9840: 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a  re infrequent.**
9850: 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69   and the probabi
9860: 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20  lity of hitting 
9870: 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20  the same cookie 
9880: 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a  value is only.**
9890: 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33   1 chance in 2^3
98a0: 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66  2.  So we're saf
98b0: 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69  e enough..*/.voi
98c0: 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43  d sqlite3ChangeC
98d0: 6f 6f 6b 69 65 28 73 71 6c 69 74 65 33 20 2a 64  ookie(sqlite3 *d
98e0: 62 2c 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  b, Vdbe *v, int 
98f0: 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  iDb){.  sqlite3V
9900: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
9910: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b  nteger, db->aDb[
9920: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63  iDb].pSchema->sc
9930: 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 30  hema_cookie+1, 0
9940: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
9950: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43  AddOp(v, OP_SetC
9960: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30 29 3b 0a  ookie, iDb, 0);.
9970: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65  }../*.** Measure
9980: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
9990: 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65 64  haracters needed
99a0: 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67   to output the g
99b0: 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69  iven.** identifi
99c0: 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  er.  The number 
99d0: 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65  returned include
99e0: 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65  s any quotes use
99f0: 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f  d.** but does no
9a00: 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75  t include the nu
9a10: 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a  ll terminator..*
9a20: 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74  *.** The estimat
9a30: 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76  e is conservativ
9a40: 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65 20  e.  It might be 
9a50: 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61 74  larger that what
9a60: 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65   is.** really ne
9a70: 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
9a80: 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28  int identLength(
9a90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
9aa0: 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e    int n;.  for(n
9ab0: 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b  =0; *z; n++, z++
9ac0: 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27  ){.    if( *z=='
9ad0: 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d  "' ){ n++; }.  }
9ae0: 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b  .  return n + 2;
9af0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
9b00: 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e  an identifier on
9b10: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
9b20: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20  e given string. 
9b30: 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68   Add.** quote ch
9b40: 61 72 61 63 74 65 72 73 20 61 73 20 6e 65 65 64  aracters as need
9b50: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
9b60: 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72  id identPut(char
9b70: 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20   *z, int *pIdx, 
9b80: 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65  char *zSignedIde
9b90: 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  nt){.  unsigned 
9ba0: 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28  char *zIdent = (
9bb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
9bc0: 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69  SignedIdent;.  i
9bd0: 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f  nt i, j, needQuo
9be0: 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b  te;.  i = *pIdx;
9bf0: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
9c00: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
9c10: 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49   if( !isalnum(zI
9c20: 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65  dent[j]) && zIde
9c30: 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65  nt[j]!='_' ) bre
9c40: 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75  ak;.  }.  needQu
9c50: 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d  ote =  zIdent[j]
9c60: 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28 7a  !=0 || isdigit(z
9c70: 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20  Ident[0]).      
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
9c90: 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64  qlite3KeywordCod
9ca0: 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b  e(zIdent, j)!=TK
9cb0: 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51  _ID;.  if( needQ
9cc0: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
9cd0: 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  '"';.  for(j=0; 
9ce0: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
9cf0: 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49  .    z[i++] = zI
9d00: 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  dent[j];.    if(
9d10: 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20   zIdent[j]=='"' 
9d20: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
9d30: 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75    }.  if( needQu
9d40: 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  ote ) z[i++] = '
9d50: 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a  "';.  z[i] = 0;.
9d60: 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a    *pIdx = i;.}..
9d70: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
9d80: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
9d90: 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69  atement appropri
9da0: 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ate for the give
9db0: 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d  n.** table.  Mem
9dc0: 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ory to hold the 
9dd0: 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61 74  text of the stat
9de0: 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65  ement is obtaine
9df0: 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  d.** from sqlite
9e00: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
9e10: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
9e20: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
9e30: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  on..*/.static ch
9e40: 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53  ar *createTableS
9e50: 74 6d 74 28 54 61 62 6c 65 20 2a 70 2c 20 69 6e  tmt(Table *p, in
9e60: 74 20 69 73 54 65 6d 70 29 7b 0a 20 20 69 6e 74  t isTemp){.  int
9e70: 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72   i, k, n;.  char
9e80: 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20   *zStmt;.  char 
9e90: 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a  *zSep, *zSep2, *
9ea0: 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75  zEnd, *z;.  Colu
9eb0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20  mn *pCol;.  n = 
9ec0: 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20  0;.  for(pCol = 
9ed0: 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c  p->aCol, i=0; i<
9ee0: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  p->nCol; i++, pC
9ef0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ol++){.    n += 
9f00: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c  identLength(pCol
9f10: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7a 20  ->zName);.    z 
9f20: 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20  = pCol->zType;. 
9f30: 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20     if( z ){.    
9f40: 20 20 6e 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a    n += (strlen(z
9f50: 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  ) + 1);.    }.  
9f60: 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65  }.  n += identLe
9f70: 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  ngth(p->zName);.
9f80: 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 0a 20 20    if( n<50 ){.  
9f90: 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20    zSep = "";.   
9fa0: 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20   zSep2 = ",";.  
9fb0: 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20    zEnd = ")";.  
9fc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20  }else{.    zSep 
9fd0: 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53  = "\n  ";.    zS
9fe0: 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20  ep2 = ",\n  ";. 
9ff0: 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b     zEnd = "\n)";
a000: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b  .  }.  n += 35 +
a010: 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53   6*p->nCol;.  zS
a020: 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  tmt = sqliteMall
a030: 6f 63 52 61 77 28 20 6e 20 29 3b 0a 20 20 69 66  ocRaw( n );.  if
a040: 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74  ( zStmt==0 ) ret
a050: 75 72 6e 20 30 3b 0a 20 20 73 74 72 63 70 79 28  urn 0;.  strcpy(
a060: 7a 53 74 6d 74 2c 20 21 4f 4d 49 54 5f 54 45 4d  zStmt, !OMIT_TEM
a070: 50 44 42 26 26 69 73 54 65 6d 70 20 3f 20 22 43  PDB&&isTemp ? "C
a080: 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45  REATE TEMP TABLE
a090: 20 22 3a 22 43 52 45 41 54 45 20 54 41 42 4c 45   ":"CREATE TABLE
a0a0: 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65   ");.  k = strle
a0b0: 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e  n(zStmt);.  iden
a0c0: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
a0d0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74  p->zName);.  zSt
a0e0: 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20  mt[k++] = '(';. 
a0f0: 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f   for(pCol=p->aCo
a100: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
a110: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
a120: 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74  .    strcpy(&zSt
a130: 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20  mt[k], zSep);.  
a140: 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a    k += strlen(&z
a150: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
a160: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
a170: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
a180: 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  &k, pCol->zName)
a190: 3b 0a 20 20 20 20 69 66 28 20 28 7a 20 3d 20 70  ;.    if( (z = p
a1a0: 43 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29  Col->zType)!=0 )
a1b0: 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b  {.      zStmt[k+
a1c0: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
a1d0: 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  strcpy(&zStmt[k]
a1e0: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 6b 20 2b 3d  , z);.      k +=
a1f0: 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20   strlen(z);.    
a200: 7d 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 26  }.  }.  strcpy(&
a210: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b  zStmt[k], zEnd);
a220: 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b  .  return zStmt;
a230: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
a240: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
a250: 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66   to report the f
a260: 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65  inal ")" that te
a270: 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52  rminates.** a CR
a280: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
a290: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
a2a0: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
a2b0: 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f  that other actio
a2c0: 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20  n routines have 
a2d0: 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a  been building.**
a2e0: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
a2f0: 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74   internal hash t
a300: 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20  ables, assuming 
a310: 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a  no errors have.*
a320: 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a  * occurred..**.*
a330: 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  * An entry for t
a340: 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65  he table is made
a350: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74   in the master t
a360: 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e  able on disk, un
a370: 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20  less.** this is 
a380: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
a390: 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75  e or db->init.bu
a3a0: 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d  sy==1.  When db-
a3b0: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a  >init.busy==1.**
a3c0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
a3d0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c   reading the sql
a3e0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
a3f0: 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74   because we just
a400: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f  .** connected to
a410: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72   the database or
a420: 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c   because the sql
a430: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
a440: 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79   has.** recently
a450: 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68 65   changed, so the
a460: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20   entry for this 
a470: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78  table already ex
a480: 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73  ists in.** the s
a490: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
a4a0: 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77  le.  We do not w
a4b0: 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74  ant to create it
a4c0: 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66   again..**.** If
a4d0: 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67   the pSelect arg
a4e0: 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  ument is not NUL
a4f0: 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  L, it means that
a500: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
a510: 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63   was called to c
a520: 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65  reate a table ge
a530: 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a  nerated from a .
a540: 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  ** "CREATE TABLE
a550: 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e   ... AS SELECT .
a560: 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  .." statement.  
a570: 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  The column names
a580: 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74   of.** the new t
a590: 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20  able will match 
a5a0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
a5b0: 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f  f the SELECT..*/
a5c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64  .void sqlite3End
a5d0: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
a5e0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
a5f0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
a600: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43  t */.  Token *pC
a610: 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ons,           /
a620: 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20  * The ',' token 
a630: 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 63  after the last c
a640: 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20  olumn defn. */. 
a650: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20   Token *pEnd,   
a660: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a670: 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b 65 6e 20  final ')' token 
a680: 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41  in the CREATE TA
a690: 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  BLE */.  Select 
a6a0: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20  *pSelect        
a6b0: 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20   /* Select from 
a6c0: 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53  a "CREATE ... AS
a6d0: 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20   SELECT" */.){. 
a6e0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c   Table *p;.  sql
a6f0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
a700: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
a710: 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d  ;..  if( (pEnd==
a720: 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29  0 && pSelect==0)
a730: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
a740: 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f   || sqlite3Mallo
a750: 63 46 61 69 6c 65 64 28 29 20 29 20 7b 0a 20 20  cFailed() ) {.  
a760: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
a770: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
a780: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
a790: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  0 ) return;..  a
a7a0: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
a7b0: 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63  .busy || !pSelec
a7c0: 74 20 29 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71  t );..  iDb = sq
a7d0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
a7e0: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
a7f0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66  ->pSchema);..#if
a800: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a810: 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f  _CHECK.  /* Reso
a820: 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c  lve names in all
a830: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
a840: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20  t expressions.. 
a850: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68   */.  if( p->pCh
a860: 65 63 6b 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  eck ){.    SrcLi
a870: 73 74 20 73 53 72 63 3b 20 20 20 20 20 20 20 20  st sSrc;        
a880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61             /* Fa
a890: 6b 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70  ke SrcList for p
a8a0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
a8b0: 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74   */.    NameCont
a8c0: 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20  ext sNC;        
a8d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
a8e0: 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72  context for pPar
a8f0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f  se->pNewTable */
a900: 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  ..    memset(&sN
a910: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
a920: 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ));.    memset(&
a930: 73 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sSrc, 0, sizeof(
a940: 73 53 72 63 29 29 3b 0a 20 20 20 20 73 53 72 63  sSrc));.    sSrc
a950: 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 73  .nSrc = 1;.    s
a960: 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d  Src.a[0].zName =
a970: 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73   p->zName;.    s
a980: 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20  Src.a[0].pTab = 
a990: 70 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d  p;.    sSrc.a[0]
a9a0: 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  .iCursor = -1;. 
a9b0: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
a9c0: 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e  pParse;.    sNC.
a9d0: 70 53 72 63 4c 69 73 74 20 3d 20 26 73 53 72 63  pSrcList = &sSrc
a9e0: 3b 0a 20 20 20 20 73 4e 43 2e 69 73 43 68 65 63  ;.    sNC.isChec
a9f0: 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 73  k = 1;.    if( s
aa00: 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
aa10: 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
aa20: 70 43 68 65 63 6b 29 20 29 7b 0a 20 20 20 20 20  pCheck) ){.     
aa30: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
aa40: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
aa50: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
aa60: 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f  T_CHECK) */..  /
aa70: 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
aa80: 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d  t.busy is 1 it m
aa90: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
aaa0: 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20  ing the SQL off 
aab0: 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65  the.  ** "sqlite
aac0: 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c  _master" or "sql
aad0: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22  ite_temp_master"
aae0: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
aaf0: 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e  sk..  ** So do n
ab00: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
ab10: 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74  disk again.  Ext
ab20: 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61  ract the root pa
ab30: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66  ge number.  ** f
ab40: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  or the table fro
ab50: 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e  m the db->init.n
ab60: 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28  ewTnum field.  (
ab70: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  The page number.
ab80: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65    ** should have
ab90: 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20   been put there 
aba0: 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65  by the sqliteOpe
abb0: 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20  nCb routine.).  
abc0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
abd0: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d  t.busy ){.    p-
abe0: 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
abf0: 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20  .newTnum;.  }.. 
ac00: 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69   /* If not initi
ac10: 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72  alizing, then cr
ac20: 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f  eate a record fo
ac30: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a  r the new table.
ac40: 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49    ** in the SQLI
ac50: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
ac60: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
ac70: 20 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d    The record num
ac80: 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ber.  ** for the
ac90: 20 6e 65 77 20 74 61 62 6c 65 20 65 6e 74 72 79   new table entry
aca0: 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
acb0: 62 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  be on the stack.
acc0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
acd0: 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52  is is a TEMPORAR
ace0: 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74  Y table, write t
acf0: 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  he entry into th
ad00: 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
ad10: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
ad20: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
ad30: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
ad40: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
ad50: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69  it.busy ){.    i
ad60: 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt n;.    Vdbe *
ad70: 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  v;.    char *zTy
ad80: 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22  pe;    /* "view"
ad90: 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20   or "table" */. 
ada0: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b     char *zType2;
adb0: 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20     /* "VIEW" or 
adc0: 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63  "TABLE" */.    c
add0: 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f  har *zStmt;    /
ade0: 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52  * Text of the CR
adf0: 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52  EATE TABLE or CR
ae00: 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d  EATE VIEW statem
ae10: 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20  ent */..    v = 
ae20: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
ae30: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
ae40: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  v==0 ) return;..
ae50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ae60: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
ae70: 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  , 0, 0);..    /*
ae80: 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74   Create the root
ae90: 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65 77  page for the new
aea0: 20 74 61 62 6c 65 20 61 6e 64 20 70 75 73 68 20   table and push 
aeb0: 69 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  it onto the stac
aec0: 6b 2e 0a 20 20 20 20 2a 2a 20 41 20 76 69 65 77  k..    ** A view
aed0: 20 68 61 73 20 6e 6f 20 72 6f 6f 74 70 61 67 65   has no rootpage
aee0: 2c 20 73 6f 20 6a 75 73 74 20 70 75 73 68 20 61  , so just push a
aef0: 20 7a 65 72 6f 20 6f 6e 74 6f 20 74 68 65 20 73   zero onto the s
af00: 74 61 63 6b 20 66 6f 72 0a 20 20 20 20 2a 2a 20  tack for.    ** 
af10: 76 69 65 77 73 2e 20 20 49 6e 69 74 69 61 6c 69  views.  Initiali
af20: 7a 65 20 7a 54 79 70 65 20 61 74 20 74 68 65 20  ze zType at the 
af30: 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 2a  same time..    *
af40: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65  /.    if( p->pSe
af50: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lect==0 ){.     
af60: 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61   /* A regular ta
af70: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  ble */.      zTy
af80: 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20  pe = "table";.  
af90: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41      zType2 = "TA
afa0: 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51  BLE";.#ifndef SQ
afb0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
afc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
afd0: 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20  /* A view */.   
afe0: 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77     zType = "view
aff0: 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20  ";.      zType2 
b000: 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66  = "VIEW";.#endif
b010: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
b020: 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41  f this is a CREA
b030: 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53  TE TABLE xx AS S
b040: 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75  ELECT ..., execu
b050: 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  te the SELECT.  
b060: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
b070: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e  o populate the n
b080: 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f  ew table. The ro
b090: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66  ot-page number f
b0a0: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65  or the.    ** ne
b0b0: 77 20 74 61 62 6c 65 20 69 73 20 6f 6e 20 74 68  w table is on th
b0c0: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 76 64 62  e top of the vdb
b0d0: 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a  e stack..    **.
b0e0: 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20      ** Once the 
b0f0: 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20  SELECT has been 
b100: 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33  coded by sqlite3
b110: 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20  Select(), it is 
b120: 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74  in a.    ** suit
b130: 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75  able state to qu
b140: 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ery for the colu
b150: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70  mn names and typ
b160: 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20  es to be used.  
b170: 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20    ** by the new 
b180: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  table..    **.  
b190: 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61    ** A shared-ca
b1a0: 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69  che write-lock i
b1b0: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
b1c0: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e  o write to the n
b1d0: 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a  ew table,.    **
b1e0: 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63   as a schema-loc
b1f0: 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  k must have alre
b200: 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ady been obtaine
b210: 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20  d to create it. 
b220: 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73  Since.    ** a s
b230: 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75  chema-lock exclu
b240: 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61  des all other da
b250: 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68  tabase users, th
b260: 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75  e write-lock wou
b270: 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64  ld.    ** be red
b280: 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  undant..    */. 
b290: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
b2a0: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
b2b0: 53 65 6c 54 61 62 3b 0a 20 20 20 20 20 20 73 71  SelTab;.      sq
b2c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b2d0: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
b2e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b2f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
b300: 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a  teger, iDb, 0);.
b310: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b320: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
b330: 6e 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20  nWrite, 1, 0);. 
b340: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
b350: 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  b = 2;.      sql
b360: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
b370: 65 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f  e, pSelect, SRT_
b380: 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20  Table, 1, 0, 0, 
b390: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
b3a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b3b0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29   OP_Close, 1, 0)
b3c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
b3d0: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
b3e0: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d         pSelTab =
b3f0: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
b400: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
b410: 2c 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  , 0, pSelect);. 
b420: 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54         if( pSelT
b430: 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ab==0 ) return;.
b440: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b450: 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  p->aCol==0 );.  
b460: 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20        p->nCol = 
b470: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
b480: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d         p->aCol =
b490: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a   pSelTab->aCol;.
b4a0: 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d          pSelTab-
b4b0: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
b4c0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
b4d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
b4e0: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
b4f0: 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  (0, pSelTab);.  
b500: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
b510: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
b520: 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
b530: 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74   the CREATE stat
b540: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28  ement */.    if(
b550: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
b560: 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65    zStmt = create
b570: 54 61 62 6c 65 53 74 6d 74 28 70 2c 20 70 2d 3e  TableStmt(p, p->
b580: 70 53 63 68 65 6d 61 3d 3d 70 50 61 72 73 65 2d  pSchema==pParse-
b590: 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  >db->aDb[1].pSch
b5a0: 65 6d 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ema);.    }else{
b5b0: 0a 20 20 20 20 20 20 6e 20 3d 20 70 45 6e 64 2d  .      n = pEnd-
b5c0: 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61  >z - pParse->sNa
b5d0: 6d 65 54 6f 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20  meToken.z + 1;. 
b5e0: 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c       zStmt = sql
b5f0: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 43 52 45  ite3MPrintf("CRE
b600: 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54  ATE %s %.*s", zT
b610: 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d  ype2, n, pParse-
b620: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a  >sNameToken.z);.
b630: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20      }..    /* A 
b640: 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63  slot for the rec
b650: 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ord has already 
b660: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69  been allocated i
b670: 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51  n the .    ** SQ
b680: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
b690: 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64  e.  We just need
b6a0: 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20   to update that 
b6b0: 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20  slot with all.  
b6c0: 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61    ** the informa
b6d0: 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65  tion we've colle
b6e0: 63 74 65 64 2e 20 20 54 68 65 20 72 6f 77 69 64  cted.  The rowid
b6f0: 20 66 6f 72 20 74 68 65 20 70 72 65 61 6c 6c 6f   for the preallo
b700: 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 73 6c 6f  cated.    ** slo
b710: 74 20 69 73 20 74 68 65 20 32 6e 64 20 69 74 65  t is the 2nd ite
b720: 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  m on the stack. 
b730: 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   The top of the 
b740: 73 74 61 63 6b 20 69 73 20 74 68 65 0a 20 20 20  stack is the.   
b750: 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 66 6f   ** root page fo
b760: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  r the new table 
b770: 28 6f 72 20 61 20 30 20 69 66 20 74 68 69 73 20  (or a 0 if this 
b780: 69 73 20 61 20 76 69 65 77 29 2e 0a 20 20 20 20  is a view)..    
b790: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
b7a0: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
b7b0: 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20  ,.      "UPDATE 
b7c0: 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20  %Q.%s ".        
b7d0: 20 22 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c   "SET type='%s',
b7e0: 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61   name=%Q, tbl_na
b7f0: 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d  me=%Q, rootpage=
b800: 23 30 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20  #0, sql=%Q ".   
b810: 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64      "WHERE rowid
b820: 3d 23 31 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e  =#1",.      db->
b830: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
b840: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
b850: 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a  ),.      zType,.
b860: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
b870: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
b880: 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20        zStmt.    
b890: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
b8a0: 65 28 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71  e(zStmt);.    sq
b8b0: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
b8c0: 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 0a  e(db, v, iDb);..
b8d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b8e0: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
b8f0: 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  T.    /* Check t
b900: 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65 64  o see if we need
b910: 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71   to create an sq
b920: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
b930: 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b  ble for.    ** k
b940: 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20  eeping track of 
b950: 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65  autoincrement ke
b960: 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ys..    */.    i
b970: 66 28 20 70 2d 3e 61 75 74 6f 49 6e 63 20 29 7b  f( p->autoInc ){
b980: 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d  .      Db *pDb =
b990: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
b9a0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
b9b0: 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d  Schema->pSeqTab=
b9c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
b9d0: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
b9e0: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
b9f0: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
ba00: 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
ba10: 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a  nce(name,seq)",.
ba20: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a            pDb->z
ba30: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  Name.        );.
ba40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
ba50: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70  ndif..    /* Rep
ba60: 61 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20  arse everything 
ba70: 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e  to update our in
ba80: 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75  ternal data stru
ba90: 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71  ctures */.    sq
baa0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
bab0: 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20  OP_ParseSchema, 
bac0: 69 44 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  iDb, 0,.        
bad0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
bae0: 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70  tbl_name='%q'",p
baf0: 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e  ->zName), P3_DYN
bb00: 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  AMIC);.  }...  /
bb10: 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20  * Add the table 
bb20: 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  to the in-memory
bb30: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
bb40: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
bb50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
bb60: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61  init.busy && pPa
bb70: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
bb80: 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b      Table *pOld;
bb90: 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  .    FKey *pFKey
bba0: 3b 20 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  ; .    Schema *p
bbb0: 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68  Schema = p->pSch
bbc0: 65 6d 61 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20  ema;.    pOld = 
bbd0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
bbe0: 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  t(&pSchema->tblH
bbf0: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73  ash, p->zName, s
bc00: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
bc10: 31 2c 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  1,p);.    if( pO
bc20: 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ld ){.      asse
bc30: 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20  rt( p==pOld );  
bc40: 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
bc50: 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64  ave failed insid
bc60: 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a  e HashInsert() *
bc70: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  /.      return;.
bc80: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
bc90: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
bca0: 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28 70 46  N_KEY.    for(pF
bcb0: 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46  Key=p->pFKey; pF
bcc0: 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79  Key; pFKey=pFKey
bcd0: 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20  ->pNextFrom){.  
bce0: 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74      int nTo = st
bcf0: 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29  rlen(pFKey->zTo)
bd00: 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65   + 1;.      pFKe
bd10: 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c  y->pNextTo = sql
bd20: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53  ite3HashFind(&pS
bd30: 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46  chema->aFKey, pF
bd40: 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a  Key->zTo, nTo);.
bd50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73        sqlite3Has
bd60: 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61  hInsert(&pSchema
bd70: 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e  ->aFKey, pFKey->
bd80: 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29  zTo, nTo, pFKey)
bd90: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
bda0: 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
bdb0: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
bdc0: 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20  ->nTable++;.    
bdd0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
bde0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
bdf0: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
be00: 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42  TE_OMIT_ALTERTAB
be10: 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70  LE.    if( !p->p
be20: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
be30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
be40: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
be50: 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  *)pParse->sNameT
be60: 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e  oken.z;.      in
be70: 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61  t nName;.      a
be80: 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74 20  ssert( !pSelect 
be90: 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64  && pCons && pEnd
bea0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43   );.      if( pC
beb0: 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  ons->z==0 ){.   
bec0: 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e       pCons = pEn
bed0: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
bee0: 20 6e 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20   nName = (const 
bef0: 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20  char *)pCons->z 
bf00: 2d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70  - zName;.      p
bf10: 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d  ->addColOffset =
bf20: 20 31 33 20 2b 20 73 71 6c 69 74 65 33 75 74 66   13 + sqlite3utf
bf30: 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20  8CharLen(zName, 
bf40: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65  nName);.    }.#e
bf50: 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  ndif.  }.}..#ifn
bf60: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bf70: 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  VIEW./*.** The p
bf80: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
bf90: 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65   routine in orde
bfa0: 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  r to create a ne
bfb0: 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73  w VIEW.*/.void s
bfc0: 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77  qlite3CreateView
bfd0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
bfe0: 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e,     /* The pa
bff0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
c000: 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e  .  Token *pBegin
c010: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
c020: 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
c030: 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d  egins the statem
c040: 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
c050: 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54  pName1,     /* T
c060: 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
c070: 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
c080: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f  the view */.  To
c090: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
c0a0: 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68   /* The token th
c0b0: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  at holds the nam
c0c0: 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f  e of the view */
c0d0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
c0e0: 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43  ct,   /* A SELEC
c0f0: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
c100: 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
c110: 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69   new view */.  i
c120: 6e 74 20 69 73 54 65 6d 70 20 20 20 20 20 20 20  nt isTemp       
c130: 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20    /* TRUE for a 
c140: 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a  TEMPORARY view *
c150: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
c160: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73  .  int n;.  cons
c170: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
c180: 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64  *z;.  Token sEnd
c190: 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  ;.  DbFixer sFix
c1a0: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  ;.  Token *pName
c1b0: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
c1c0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  if( pParse->nVar
c1d0: 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
c1e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
c1f0: 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20 61 72  , "parameters ar
c200: 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e  e not allowed in
c210: 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20 73 71   views");.    sq
c220: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
c230: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  e(pSelect);.    
c240: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
c250: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
c260: 70 50 61 72 73 65 2c 20 70 42 65 67 69 6e 2c 20  pParse, pBegin, 
c270: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
c280: 69 73 54 65 6d 70 2c 20 31 2c 20 30 29 3b 0a 20  isTemp, 1, 0);. 
c290: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
c2a0: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
c2b0: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
c2c0: 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
c2d0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
c2e0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
c2f0: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
c300: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
c310: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
c320: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
c330: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
c340: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
c350: 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  e->db, p->pSchem
c360: 61 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  a);.  if( sqlite
c370: 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20  3FixInit(&sFix, 
c380: 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69  pParse, iDb, "vi
c390: 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20  ew", pName).    
c3a0: 26 26 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c  && sqlite3FixSel
c3b0: 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65  ect(&sFix, pSele
c3c0: 63 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  ct).  ){.    sql
c3d0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
c3e0: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72  (pSelect);.    r
c3f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
c400: 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   Make a copy of 
c410: 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43  the entire SELEC
c420: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
c430: 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
c440: 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c  w..  ** This wil
c450: 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20  l force all the 
c460: 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c  Expr.token.z val
c470: 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ues to be dynami
c480: 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  cally.  ** alloc
c490: 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e  ated rather than
c4a0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e   point to the in
c4b0: 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69  put string - whi
c4c0: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  ch means that.  
c4d0: 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72  ** they will per
c4e0: 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63  sist after the c
c4f0: 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65  urrent sqlite3_e
c500: 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72  xec() call retur
c510: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53  ns..  */.  p->pS
c520: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
c530: 65 6c 65 63 74 44 75 70 28 70 53 65 6c 65 63 74  electDup(pSelect
c540: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
c550: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
c560: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
c570: 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
c580: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
c590: 7d 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  }.  if( !pParse-
c5a0: 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  >db->init.busy )
c5b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 69 65  {.    sqlite3Vie
c5c0: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
c5d0: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a  pParse, p);.  }.
c5e0: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
c5f0: 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41   end of the CREA
c600: 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
c610: 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f  t.  Make sEnd po
c620: 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  int to.  ** the 
c630: 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64  end..  */.  sEnd
c640: 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74   = pParse->sLast
c650: 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e  Token;.  if( sEn
c660: 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e  d.z[0]!=0 && sEn
c670: 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20  d.z[0]!=';' ){. 
c680: 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e     sEnd.z += sEn
c690: 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e  d.n;.  }.  sEnd.
c6a0: 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 73 45 6e  n = 0;.  n = sEn
c6b0: 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b  d.z - pBegin->z;
c6c0: 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e  .  z = (const un
c6d0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 65  signed char*)pBe
c6e0: 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28  gin->z;.  while(
c6f0: 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d   n>0 && (z[n-1]=
c700: 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28  =';' || isspace(
c710: 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b  z[n-1])) ){ n--;
c720: 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a   }.  sEnd.z = &z
c730: 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20  [n-1];.  sEnd.n 
c740: 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73  = 1;..  /* Use s
c750: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
c760: 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77   to add the view
c770: 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   to the SQLITE_M
c780: 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20  ASTER table */. 
c790: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
c7a0: 28 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e  (pParse, 0, &sEn
c7b0: 64 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b  d, 0);.  return;
c7c0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
c7d0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
c7e0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c7f0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
c800: 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
c810: 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72  ture pTable is r
c820: 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46  eally a VIEW.  F
c830: 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73  ill in the names
c840: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   of.** the colum
c850: 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69  ns of the view i
c860: 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72  n the pTable str
c870: 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20  ucture.  Return 
c880: 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
c890: 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20   errors.  If an 
c8a0: 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65  error is seen le
c8b0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
c8c0: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
c8d0: 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
c8e0: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
c8f0: 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20  lumnNames(Parse 
c900: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
c910: 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65  pTable){.  Table
c920: 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20   *pSelTab;   /* 
c930: 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f  A fake table fro
c940: 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74  m which we get t
c950: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
c960: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b  .  Select *pSel;
c970: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
c980: 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20  the SELECT that 
c990: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
c9a0: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72  iew */.  int nEr
c9b0: 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  r = 0;     /* Nu
c9c0: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65  mber of errors e
c9d0: 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20  ncountered */.  
c9e0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
c9f0: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79    /* Temporarily
ca00: 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65   holds the numbe
ca10: 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73  r of cursors ass
ca20: 69 67 6e 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  igned */..  asse
ca30: 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 20  rt( pTable );.. 
ca40: 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e   /* A positive n
ca50: 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f  Col means the co
ca60: 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20  lumns names for 
ca70: 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20  this view are.  
ca80: 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e  ** already known
ca90: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
caa0: 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65  ble->nCol>0 ) re
cab0: 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20  turn 0;..  /* A 
cac0: 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73  negative nCol is
cad0: 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65   a special marke
cae0: 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77  r meaning that w
caf0: 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
cb00: 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63    ** trying to c
cb10: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d  ompute the colum
cb20: 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20  n names.  If we 
cb30: 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  enter this routi
cb40: 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e  ne with.  ** a n
cb50: 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74  egative nCol, it
cb60: 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f   means two or mo
cb70: 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20  re views form a 
cb80: 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a  loop, like this:
cb90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43  .  **.  **     C
cba0: 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41  REATE VIEW one A
cbb0: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
cbc0: 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52  two;.  **     CR
cbd0: 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53  EATE VIEW two AS
cbe0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f   SELECT * FROM o
cbf0: 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ne;.  **.  ** Ac
cc00: 74 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72 72  tually, this err
cc10: 6f 72 20 69 73 20 63 61 75 67 68 74 20 70 72 65  or is caught pre
cc20: 76 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20 74  viously and so t
cc30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
cc40: 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c  t.  ** should al
cc50: 77 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74 20  ways fail.  But 
cc60: 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69 74  we will leave it
cc70: 20 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20 74   in place just t
cc80: 6f 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a  o be safe..  */.
cc90: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
cca0: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ol<0 ){.    sqli
ccb0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
ccc0: 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20  se, "view %s is 
ccd0: 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e  circularly defin
cce0: 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  ed", pTable->zNa
ccf0: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
cd00: 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  1;.  }.  assert(
cd10: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30   pTable->nCol>=0
cd20: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20   );..  /* If we 
cd30: 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
cd40: 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74   means we need t
cd50: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61  o compute the ta
cd60: 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20  ble names..  ** 
cd70: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61  Note that the ca
cd80: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73  ll to sqlite3Res
cd90: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
cda0: 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79   will expand any
cdb0: 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e  .  ** "*" elemen
cdc0: 74 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ts in the result
cdd0: 73 20 73 65 74 20 6f 66 20 74 68 65 20 76 69 65  s set of the vie
cde0: 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67  w and will assig
cdf0: 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74  n cursors.  ** t
ce00: 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f  o the elements o
ce10: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
ce20: 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f  e.  But we do no
ce30: 74 20 77 61 6e 74 20 74 68 65 73 65 20 63 68 61  t want these cha
ce40: 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  nges.  ** to be 
ce50: 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74  permanent.  So t
ce60: 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69  he computation i
ce70: 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79  s done on a copy
ce80: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20   of the SELECT. 
ce90: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68   ** statement th
cea0: 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
ceb0: 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  iew..  */.  asse
cec0: 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  rt( pTable->pSel
ced0: 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20  ect );.  pSel = 
cee0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
cef0: 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74  (pTable->pSelect
cf00: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b  );.  if( pSel ){
cf10: 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d  .    n = pParse-
cf20: 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74  >nTab;.    sqlit
cf30: 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
cf40: 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
cf50: 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20  Sel->pSrc);.    
cf60: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d  pTable->nCol = -
cf70: 31 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d  1;.    pSelTab =
cf80: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
cf90: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
cfa0: 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  , 0, pSel);.    
cfb0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e  pParse->nTab = n
cfc0: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 54 61  ;.    if( pSelTa
cfd0: 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  b ){.      asser
cfe0: 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d  t( pTable->aCol=
cff0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  =0 );.      pTab
d000: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54  le->nCol = pSelT
d010: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
d020: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70  pTable->aCol = p
d030: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
d040: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
d050: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65  l = 0;.      pSe
d060: 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
d070: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
d080: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c  eteTable(0, pSel
d090: 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Tab);.      pTab
d0a0: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6c 61  le->pSchema->fla
d0b0: 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74  gs |= DB_Unreset
d0c0: 56 69 65 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65  Views;.    }else
d0d0: 7b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  {.      pTable->
d0e0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
d0f0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nErr++;.    }.  
d100: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
d110: 65 6c 65 74 65 28 70 53 65 6c 29 3b 0a 20 20 7d  elete(pSel);.  }
d120: 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72   else {.    nErr
d130: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
d140: 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69   nErr;  .}.#endi
d150: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
d160: 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65  _VIEW */..#ifnde
d170: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
d180: 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  EW./*.** Clear t
d190: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
d1a0: 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20  from every VIEW 
d1b0: 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e  in database idx.
d1c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d1d0: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
d1e0: 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
d1f0: 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68  int idx){.  Hash
d200: 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21  Elem *i;.  if( !
d210: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
d220: 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
d230: 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e  tViews) ) return
d240: 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
d250: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
d260: 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d  Db[idx].pSchema-
d270: 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73  >tblHash); i;i=s
d280: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
d290: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
d2a0: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
d2b0: 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
d2c0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
d2d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 52 65 73  .      sqliteRes
d2e0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54  etColumnNames(pT
d2f0: 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ab);.    }.  }. 
d300: 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79   DbClearProperty
d310: 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
d320: 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65  esetViews);.}.#e
d330: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c  lse.# define sql
d340: 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
d350: 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  A,B).#endif /* S
d360: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
d370: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
d380: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
d390: 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f  d by the VDBE to
d3a0: 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65   adjust the inte
d3b0: 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75  rnal schema.** u
d3c0: 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68  sed by SQLite wh
d3d0: 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  en the btree lay
d3e0: 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65  er moves a table
d3f0: 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a   root page. The.
d400: 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20  ** root-page of 
d410: 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
d420: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
d430: 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f   has changed fro
d440: 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54  m iFrom.** to iT
d450: 6f 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  o..*/.#ifndef SQ
d460: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
d470: 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65  CUUM.void sqlite
d480: 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 44  3RootPageMoved(D
d490: 62 20 2a 70 44 62 2c 20 69 6e 74 20 69 46 72 6f  b *pDb, int iFro
d4a0: 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48  m, int iTo){.  H
d4b0: 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
d4c0: 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a    Hash *pHash;..
d4d0: 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
d4e0: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
d4f0: 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
d500: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
d510: 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
d520: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
d530: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54  t(pElem)){.    T
d540: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
d550: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
d560: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  m);.    if( pTab
d570: 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
d580: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75  .      pTab->tnu
d590: 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 20 20 72  m = iTo;.      r
d5a0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
d5b0: 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d  .  pHash = &pDb-
d5c0: 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
d5d0: 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  h;.  for(pElem=s
d5e0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
d5f0: 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
d600: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
d610: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
d620: 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71  Index *pIdx = sq
d630: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
d640: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  em);.    if( pId
d650: 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  x->tnum==iFrom )
d660: 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e  {.      pIdx->tn
d670: 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 20 20  um = iTo;.      
d680: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
d690: 7d 0a 20 20 61 73 73 65 72 74 28 30 29 3b 0a 7d  }.  assert(0);.}
d6a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
d6b0: 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61  rite code to era
d6c0: 73 65 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  se the table wit
d6d0: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
d6e0: 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  le from database
d6f0: 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72   iDb..** Also wr
d700: 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69  ite code to modi
d710: 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  fy the sqlite_ma
d720: 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69  ster table and i
d730: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
d740: 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65  * if a root-page
d750: 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   of another tabl
d760: 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
d770: 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68  e btree-layer wh
d780: 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20  ilst.** erasing 
d790: 69 54 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e  iTable (this can
d7a0: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
d7b0: 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
d7c0: 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69  base)..*/ .stati
d7d0: 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f  c void destroyRo
d7e0: 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a 70 50  otPage(Parse *pP
d7f0: 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65  arse, int iTable
d800: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
d810: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
d820: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
d830: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d840: 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  Op(v, OP_Destroy
d850: 2c 20 69 54 61 62 6c 65 2c 20 69 44 62 29 3b 0a  , iTable, iDb);.
d860: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d870: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
d880: 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 70   /* OP_Destroy p
d890: 75 73 68 65 73 20 61 6e 20 69 6e 74 65 67 65 72  ushes an integer
d8a0: 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e   onto the stack.
d8b0: 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72   If this integer
d8c0: 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  .  ** is non-zer
d8d0: 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  o, then it is th
d8e0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
d8f0: 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f  er of a table mo
d900: 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61  ved to.  ** loca
d910: 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65  tion iTable. The
d920: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
d930: 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c  modifies the sql
d940: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
d950: 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74   to.  ** reflect
d960: 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   this..  **.  **
d970: 20 54 68 65 20 22 23 30 22 20 69 6e 20 74 68 65   The "#0" in the
d980: 20 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61   SQL is a specia
d990: 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  l constant that 
d9a0: 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76  means whatever v
d9b0: 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 6f 6e 20  alue.  ** is on 
d9c0: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
d9d0: 74 61 63 6b 2e 20 20 53 65 65 20 73 71 6c 69 74  tack.  See sqlit
d9e0: 65 33 52 65 67 69 73 74 65 72 45 78 70 72 28 29  e3RegisterExpr()
d9f0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
da00: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
da10: 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54  se, .     "UPDAT
da20: 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74  E %Q.%s SET root
da30: 70 61 67 65 3d 25 64 20 57 48 45 52 45 20 23 30  page=%d WHERE #0
da40: 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 30   AND rootpage=#0
da50: 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ",.     pParse->
da60: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
da70: 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
da80: 28 69 44 62 29 2c 20 69 54 61 62 6c 65 29 3b 0a  (iDb), iTable);.
da90: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
daa0: 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65 20  Write VDBE code 
dab0: 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20 70  to erase table p
dac0: 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f  Tab and all asso
dad0: 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f  ciated indices o
dae0: 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20  n disk..** Code 
daf0: 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73 71  to update the sq
db00: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
db10: 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  es and internal 
db20: 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f  schema definitio
db30: 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20  ns.** in case a 
db40: 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67  root-page belong
db50: 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74  ing to another t
db60: 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79  able is moved by
db70: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
db80: 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65  .** is also adde
db90: 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  d (this can happ
dba0: 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
dbb0: 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
dbc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
dbd0: 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61   destroyTable(Pa
dbe0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
dbf0: 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65  le *pTab){.#ifde
dc00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
dc10: 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78  TOVACUUM.  Index
dc20: 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 44   *pIdx;.  int iD
dc30: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
dc40: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
dc50: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
dc60: 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f  ma);.  destroyRo
dc70: 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
dc80: 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Tab->tnum, iDb);
dc90: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
dca0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
dcb0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
dcc0: 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  ){.    destroyRo
dcd0: 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
dce0: 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Idx->tnum, iDb);
dcf0: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  .  }.#else.  /* 
dd00: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
dd10: 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75  may be auto-vacu
dd20: 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20 53  um capable (if S
dd30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
dd40: 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f  ACUUM.  ** is no
dd50: 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e  t defined), then
dd60: 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
dd70: 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74   to call OP_Dest
dd80: 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  roy on the.  ** 
dd90: 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
dda0: 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72  root-pages in or
ddb0: 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69  der, starting wi
ddc0: 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c  th the numerical
ddd0: 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74  ly .  ** largest
dde0: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
ddf0: 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  r. This guarante
de00: 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20  es that none of 
de10: 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20  the root-pages. 
de20: 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f   ** to be destro
de30: 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64  yed is relocated
de40: 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f   by an earlier O
de50: 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20  P_Destroy. i.e. 
de60: 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c  if the.  ** foll
de70: 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64  owing were coded
de80: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44  :.  **.  ** OP_D
de90: 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20  estroy 4 0.  ** 
dea0: 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74  ....  ** OP_Dest
deb0: 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a  roy 5 0.  **.  *
dec0: 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20  * and root page 
ded0: 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65  5 happened to be
dee0: 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
def0: 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  t-page number in
df00: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
df10: 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61  se, then root pa
df20: 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f  ge 5 would be mo
df30: 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62 79  ved to page 4 by
df40: 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44   the .  ** "OP_D
df50: 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f  estroy 4 0" opco
df60: 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75 65  de. The subseque
df70: 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35  nt "OP_Destroy 5
df80: 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20   0" would hit.  
df90: 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70  ** a free-list p
dfa0: 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  age..  */.  int 
dfb0: 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75  iTab = pTab->tnu
dfc0: 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f  m;.  int iDestro
dfd0: 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c  yed = 0;..  whil
dfe0: 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65  e( 1 ){.    Inde
dff0: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74  x *pIdx;.    int
e000: 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a   iLargest = 0;..
e010: 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f 79      if( iDestroy
e020: 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44  ed==0 || iTab<iD
e030: 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20  estroyed ){.    
e040: 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61    iLargest = iTa
e050: 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  b;.    }.    for
e060: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
e070: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
e080: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
e090: 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49     int iIdx = pI
e0a0: 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  dx->tnum;.      
e0b0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53  assert( pIdx->pS
e0c0: 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
e0d0: 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66  hema );.      if
e0e0: 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30  ( (iDestroyed==0
e0f0: 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72   || (iIdx<iDestr
e100: 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e 69  oyed)) && iIdx>i
e110: 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20  Largest ){.     
e120: 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49     iLargest = iI
e130: 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dx;.      }.    
e140: 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67 65  }.    if( iLarge
e150: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
e160: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65  eturn;.    }else
e170: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20  {.      int iDb 
e180: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
e190: 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
e1a0: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
e1b0: 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79  );.      destroy
e1c0: 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
e1d0: 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b   iLargest, iDb);
e1e0: 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f 79 65  .      iDestroye
e1f0: 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20  d = iLargest;.  
e200: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d    }.  }.#endif.}
e210: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
e220: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
e230: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
e240: 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74   a DROP TABLE st
e250: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d  atement..** pNam
e260: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
e270: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
e280: 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69   dropped..*/.voi
e290: 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62  d sqlite3DropTab
e2a0: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
e2b0: 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
e2c0: 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e  , int isView, in
e2d0: 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c  t noErr){.  Tabl
e2e0: 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20  e *pTab;.  Vdbe 
e2f0: 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
e300: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
e310: 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66    int iDb;..  if
e320: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
e330: 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  | sqlite3MallocF
e340: 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 67  ailed() ){.    g
e350: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
e360: 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ble;.  }.  asser
e370: 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
e380: 31 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  1 );.  pTab = sq
e390: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
e3a0: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e  (pParse, pName->
e3b0: 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d  a[0].zName, pNam
e3c0: 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
e3d0: 65 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  e);..  if( pTab=
e3e0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f  =0 ){.    if( no
e3f0: 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Err ){.      sql
e400: 69 74 65 33 45 72 72 6f 72 43 6c 65 61 72 28 70  ite3ErrorClear(p
e410: 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
e420: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
e430: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44  _table;.  }.  iD
e440: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
e450: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
e460: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61  b->pSchema);.  a
e470: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
e480: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
e490: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e4a0: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
e4b0: 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
e4c0: 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  de;.    const ch
e4d0: 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
e4e0: 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20  A_TABLE(iDb);.  
e4f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
e500: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
e510: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
e520: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
e530: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
e540: 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c  DELETE, zTab, 0,
e550: 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f   zDb)){.      go
e560: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
e570: 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  le;.    }.    if
e580: 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20  ( isView ){.    
e590: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
e5a0: 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a  DB && iDb==1 ){.
e5b0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
e5c0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
e5d0: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  VIEW;.      }els
e5e0: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
e5f0: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49  = SQLITE_DROP_VI
e600: 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EW;.      }.    
e610: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
e620: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
e630: 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
e640: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
e650: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
e660: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e670: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
e680: 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b  LITE_DROP_TABLE;
e690: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e6a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
e6b0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
e6c0: 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  code, pTab->zNam
e6d0: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
e6e0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
e6f0: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
e700: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
e710: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
e720: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
e730: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20  pTab->zName, 0, 
e740: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
e750: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
e760: 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  le;.    }.  }.#e
e770: 6e 64 69 66 0a 20 20 69 66 28 20 70 54 61 62 2d  ndif.  if( pTab-
e780: 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 70 54 61  >readOnly || pTa
e790: 62 3d 3d 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  b==db->aDb[iDb].
e7a0: 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62  pSchema->pSeqTab
e7b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
e7c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
e7d0: 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f  "table %s may no
e7e0: 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70  t be dropped", p
e7f0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
e800: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
e810: 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e  table;.  }..#ifn
e820: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e830: 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65  VIEW.  /* Ensure
e840: 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e   DROP TABLE is n
e850: 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65  ot used on a vie
e860: 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57  w, and DROP VIEW
e870: 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a   is not used.  *
e880: 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20  * on a table..  
e890: 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77 20  */.  if( isView 
e8a0: 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
e8b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
e8c0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
e8d0: 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42  e, "use DROP TAB
e8e0: 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62  LE to delete tab
e8f0: 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  le %s", pTab->zN
e900: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
e910: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
e920: 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65    }.  if( !isVie
e930: 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
e940: 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
e950: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
e960: 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57  , "use DROP VIEW
e970: 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20   to delete view 
e980: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
e990: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
e9a0: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
e9b0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
e9c0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
e9d0: 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
e9e0: 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
e9f0: 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69  table.  ** on di
ea00: 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  sk..  */.  v = s
ea10: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
ea20: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
ea30: 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a 70  {.    Trigger *p
ea40: 54 72 69 67 67 65 72 3b 0a 20 20 20 20 44 62 20  Trigger;.    Db 
ea50: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
ea60: 69 44 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb];.    sqlite
ea70: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
ea80: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
ea90: 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72  iDb);..    /* Dr
eaa0: 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20  op all triggers 
eab0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
eac0: 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
ead0: 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20  dropped. Code.  
eae0: 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65    ** is generate
eaf0: 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72  d to remove entr
eb00: 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  ies from sqlite_
eb10: 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20  master and/or.  
eb20: 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70    ** sqlite_temp
eb30: 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75 69  _master if requi
eb40: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
eb50: 70 54 72 69 67 67 65 72 20 3d 20 70 54 61 62 2d  pTrigger = pTab-
eb60: 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 77  >pTrigger;.    w
eb70: 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29  hile( pTrigger )
eb80: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
eb90: 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
eba0: 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
ebb0: 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 70   || .          p
ebc0: 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
ebd0: 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ==db->aDb[1].pSc
ebe0: 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 73 71  hema );.      sq
ebf0: 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72  lite3DropTrigger
ec00: 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69  Ptr(pParse, pTri
ec10: 67 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  gger, 1);.      
ec20: 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67  pTrigger = pTrig
ec30: 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ger->pNext;.    
ec40: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
ec50: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
ec60: 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f  MENT.    /* Remo
ec70: 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f  ve any entries o
ec80: 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  f the sqlite_seq
ec90: 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f  uence table asso
eca0: 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 20 20  ciated with.    
ecb0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
ecc0: 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73  ng dropped. This
ecd0: 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   is done before 
ece0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f  the table is dro
ecf0: 70 70 65 64 0a 20 20 20 20 2a 2a 20 61 74 20 74  pped.    ** at t
ed00: 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20  he btree level, 
ed10: 69 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69  in case the sqli
ed20: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
ed30: 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  e needs to.    *
ed40: 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75  * move as a resu
ed50: 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28  lt of the drop (
ed60: 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75  can happen in au
ed70: 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e  to-vacuum mode).
ed80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
ed90: 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20 29 7b  pTab->autoInc ){
eda0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65  .      sqlite3Ne
edb0: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
edc0: 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54  ,.        "DELET
edd0: 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69 74 65  E FROM %s.sqlite
ede0: 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45 20  _sequence WHERE 
edf0: 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20  name=%Q",.      
ee00: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54    pDb->zName, pT
ee10: 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  ab->zName.      
ee20: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
ee30: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  .    /* Drop all
ee40: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
ee50: 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65  able and index e
ee60: 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65  ntries that refe
ee70: 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  r to the.    ** 
ee80: 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72  table. The progr
ee90: 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68  am name loops th
eea0: 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72  rough the master
eeb0: 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74   table and delet
eec0: 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20  es.    ** every 
eed0: 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73 20  row that refers 
eee0: 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68  to a table of th
eef0: 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  e same name as t
ef00: 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 20  he one being.   
ef10: 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69   ** dropped. Tri
ef20: 67 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65  ggers are handle
ef30: 64 20 73 65 70 65 72 61 74 65 6c 79 20 62 65 63  d seperately bec
ef40: 61 75 73 65 20 61 20 74 72 69 67 67 65 72 20 63  ause a trigger c
ef50: 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65  an be.    ** cre
ef60: 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70  ated in the temp
ef70: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 72   database that r
ef80: 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
ef90: 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20 20   in another.    
efa0: 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  ** database..   
efb0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
efc0: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
efd0: 65 2c 20 0a 20 20 20 20 20 20 20 20 22 44 45 4c  e, .        "DEL
efe0: 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
eff0: 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  HERE tbl_name=%Q
f000: 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67   and type!='trig
f010: 67 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20 70  ger'",.        p
f020: 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db->zName, SCHEM
f030: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54  A_TABLE(iDb), pT
f040: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
f050: 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20  if( !isView ){. 
f060: 20 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c       destroyTabl
f070: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  e(pParse, pTab);
f080: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
f090: 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
f0a0: 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74  entry from SQLit
f0b0: 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  e's internal sch
f0c0: 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20  ema and modify. 
f0d0: 20 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61     ** the schema
f0e0: 20 63 6f 6f 6b 69 65 2e 0a 20 20 20 20 2a 2f 0a   cookie..    */.
f0f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
f100: 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62  p3(v, OP_DropTab
f110: 6c 65 2c 20 69 44 62 2c 20 30 2c 20 70 54 61 62  le, iDb, 0, pTab
f120: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
f130: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
f140: 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29  okie(db, v, iDb)
f150: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69  ;.  }.  sqliteVi
f160: 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69  ewResetAll(db, i
f170: 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  Db);..exit_drop_
f180: 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33  table:.  sqlite3
f190: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e  SrcListDelete(pN
f1a0: 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ame);.}../*.** T
f1b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
f1c0: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
f1d0: 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65  a new foreign ke
f1e0: 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a  y on the table.*
f1f0: 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
f200: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
f210: 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d   pFromCol determ
f220: 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d  ines which colum
f230: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ns.** in the cur
f240: 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74  rent table point
f250: 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20   to the foreign 
f260: 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f  key.  If pFromCo
f270: 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e  l==0 then.** con
f280: 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20  nect the key to 
f290: 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
f2a0: 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69  inserted.  pTo i
f2b0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a  s the name of.**
f2c0: 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72   the table refer
f2d0: 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20  red to.  pToCol 
f2e0: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62  is a list of tab
f2f0: 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  les in the other
f300: 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68  .** pTo table th
f310: 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  at the foreign k
f320: 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66  ey points to.  f
f330: 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c  lags contains al
f340: 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
f350: 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c   about the confl
f360: 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
f370: 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66  lgorithms specif
f380: 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  ied.** in the ON
f390: 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41   DELETE, ON UPDA
f3a0: 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54  TE and ON INSERT
f3b0: 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
f3c0: 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72  An FKey structur
f3d0: 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  e is created and
f3e0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
f3f0: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  ble currently.**
f400: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
f410: 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73  ion in the pPars
f420: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65  e->pNewTable fie
f430: 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46 4b 65  ld.  The new FKe
f440: 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b  y.** is not link
f450: 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65  ed into db->aFKe
f460: 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  y at this point 
f470: 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  - that does not 
f480: 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20  happen.** until 
f490: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
f4a0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  )..**.** The for
f4b0: 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20  eign key is set 
f4c0: 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72  for IMMEDIATE pr
f4d0: 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62  ocessing.  A sub
f4e0: 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20  sequent call.** 
f4f0: 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46  to sqlite3DeferF
f500: 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68  oreignKey() migh
f510: 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f  t change this to
f520: 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f   DEFERRED..*/.vo
f530: 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
f540: 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61  ForeignKey(.  Pa
f550: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
f560: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
f570: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
f580: 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20  ist *pFromCol,  
f590: 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
f5a0: 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f  is table that po
f5b0: 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62  int to other tab
f5c0: 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
f5d0: 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  To,          /* 
f5e0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65  Name of the othe
f5f0: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  r table */.  Exp
f600: 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20  rList *pToCol,  
f610: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
f620: 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
f630: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
f640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
f650: 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
f660: 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a   algorithms. */.
f670: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
f680: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
f690: 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
f6a0: 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70   = 0;.  Table *p
f6b0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
f6c0: 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74  able;.  int nByt
f6d0: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
f6e0: 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a  t nCol;.  char *
f6f0: 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  z;..  assert( pT
f700: 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  o!=0 );.  if( p=
f710: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
f720: 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  rr ) goto fk_end
f730: 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
f740: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
f750: 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  Col = p->nCol-1;
f760: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  .    if( iCol<0 
f770: 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
f780: 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26     if( pToCol &&
f790: 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d   pToCol->nExpr!=
f7a0: 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
f7b0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
f7c0: 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20  e, "foreign key 
f7d0: 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20  on %s".         
f7e0: 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e  " should referen
f7f0: 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75  ce only one colu
f800: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c  mn of table %T",
f810: 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  .         p->aCo
f820: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70  l[iCol].zName, p
f830: 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  To);.      goto 
f840: 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  fk_end;.    }.  
f850: 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65    nCol = 1;.  }e
f860: 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26  lse if( pToCol &
f870: 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21  & pToCol->nExpr!
f880: 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72  =pFromCol->nExpr
f890: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
f8a0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
f8b0: 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20          "number 
f8c0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f  of columns in fo
f8d0: 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e  reign key does n
f8e0: 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d  ot match the num
f8f0: 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20  ber of ".       
f900: 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65   "columns in the
f910: 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
f920: 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  e");.    goto fk
f930: 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _end;.  }else{. 
f940: 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43     nCol = pFromC
f950: 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20  ol->nExpr;.  }. 
f960: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
f970: 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73  *pFKey) + nCol*s
f980: 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f  izeof(pFKey->aCo
f990: 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b  l[0]) + pTo->n +
f9a0: 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c   1;.  if( pToCol
f9b0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
f9c0: 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72   i<pToCol->nExpr
f9d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42  ; i++){.      nB
f9e0: 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54  yte += strlen(pT
f9f0: 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
fa00: 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) + 1;.    }.  }
fa10: 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74  .  pFKey = sqlit
fa20: 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29  eMalloc( nByte )
fa30: 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30  ;.  if( pFKey==0
fa40: 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
fa50: 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d    pFKey->pFrom =
fa60: 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65   p;.  pFKey->pNe
fa70: 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65  xtFrom = p->pFKe
fa80: 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29  y;.  z = (char*)
fa90: 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b  &pFKey[1];.  pFK
faa0: 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75  ey->aCol = (stru
fab0: 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20  ct sColMap*)z;. 
fac0: 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72   z += sizeof(str
fad0: 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f  uct sColMap)*nCo
fae0: 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20  l;.  pFKey->zTo 
faf0: 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c  = z;.  memcpy(z,
fb00: 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29   pTo->z, pTo->n)
fb10: 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20  ;.  z[pTo->n] = 
fb20: 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e  0;.  z += pTo->n
fb30: 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65  +1;.  pFKey->pNe
fb40: 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65  xtTo = 0;.  pFKe
fb50: 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a  y->nCol = nCol;.
fb60: 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
fb70: 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e  0 ){.    pFKey->
fb80: 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[0].iFrom = 
fb90: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c  p->nCol-1;.  }el
fba0: 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  se{.    for(i=0;
fbb0: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
fbc0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
fbd0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
fbe0: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
fbf0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
fc00: 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a  trICmp(p->aCol[j
fc10: 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f  ].zName, pFromCo
fc20: 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  l->a[i].zName)==
fc30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
fc40: 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46  FKey->aCol[i].iF
fc50: 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  rom = j;.       
fc60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
fc70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
fc80: 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c    if( j>=p->nCol
fc90: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
fca0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
fcb0: 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
fcc0: 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c  unknown column \
fcd0: 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e  "%s\" in foreign
fce0: 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22   key definition"
fcf0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  , .          pFr
fd00: 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
fd10: 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
fd20: 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d   fk_end;.      }
fd30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
fd40: 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
fd50: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
fd60: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
fd70: 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f  n = strlen(pToCo
fd80: 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
fd90: 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
fda0: 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20  l[i].zCol = z;. 
fdb0: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70       memcpy(z, p
fdc0: 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
fdd0: 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e  e, n);.      z[n
fde0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b  ] = 0;.      z +
fdf0: 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  = n+1;.    }.  }
fe00: 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
fe10: 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65  rred = 0;.  pFKe
fe20: 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20  y->deleteConf = 
fe30: 66 6c 61 67 73 20 26 20 30 78 66 66 3b 0a 20 20  flags & 0xff;.  
fe40: 70 46 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e  pFKey->updateCon
fe50: 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 38 20  f = (flags >> 8 
fe60: 29 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65  ) & 0xff;.  pFKe
fe70: 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20  y->insertConf = 
fe80: 28 66 6c 61 67 73 20 3e 3e 20 31 36 20 29 20 26  (flags >> 16 ) &
fe90: 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e   0xff;..  /* Lin
fea0: 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  k the foreign ke
feb0: 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61  y to the table a
fec0: 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e  s the last step.
fed0: 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79  .  */.  p->pFKey
fee0: 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65   = pFKey;.  pFKe
fef0: 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a  y = 0;..fk_end:.
ff00: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b    sqliteFree(pFK
ff10: 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21  ey);.#endif /* !
ff20: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
ff30: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29  MIT_FOREIGN_KEY)
ff40: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
ff50: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 46 72 6f  rListDelete(pFro
ff60: 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  mCol);.  sqlite3
ff70: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
ff80: 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ToCol);.}../*.**
ff90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
ffa0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
ffb0: 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
ffc0: 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59  ATE or INITIALLY
ffd0: 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61   DEFERRED.** cla
ffe0: 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70  use is seen as p
fff0: 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e  art of a foreign
10000 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e   key definition.
10010 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64    The isDeferred
10020 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
10030 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   1 for INITIALLY
10040 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20   DEFERRED and 0 
10050 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d  for INITIALLY IM
10060 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20  MEDIATE..** The 
10070 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20  behavior of the 
10080 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72  most recently cr
10090 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  eated foreign ke
100a0 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a  y is adjusted.**
100b0 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f   accordingly..*/
100c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
100d0 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72  erForeignKey(Par
100e0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
100f0 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66  isDeferred){.#if
10100 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10110 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54  _FOREIGN_KEY.  T
10120 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b  able *pTab;.  FK
10130 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28  ey *pFKey;.  if(
10140 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   (pTab = pParse-
10150 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c  >pNewTable)==0 |
10160 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d  | (pFKey = pTab-
10170 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74  >pFKey)==0 ) ret
10180 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73  urn;.  pFKey->is
10190 44 65 66 65 72 72 65 64 20 3d 20 69 73 44 65 66  Deferred = isDef
101a0 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a  erred;.#endif.}.
101b0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
101c0 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
101d0 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20  rase and refill 
101e0 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68  index *pIdx.  Th
101f0 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  is is.** used to
10200 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
10210 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 65  wly created inde
10220 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74  x or to recomput
10230 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  e the.** content
10240 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20   of an index in 
10250 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45  response to a RE
10260 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  INDEX command..*
10270 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50  *.** if memRootP
10280 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74  age is not negat
10290 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ive, it means th
102a0 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  at the index is 
102b0 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64  newly.** created
102c0 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 63 65  .  The memory ce
102d0 6c 6c 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ll specified by 
102e0 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74  memRootPage cont
102f0 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  ains the.** root
10300 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
10310 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d  the index.  If m
10320 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65  emRootPage is ne
10330 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20  gative, then.** 
10340 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
10350 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73  y exists and mus
10360 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66  t be cleared bef
10370 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c  ore being refill
10380 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f  ed and.** the ro
10390 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
103a0 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74  f the index is t
103b0 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78  aken from pIndex
103c0 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  ->tnum..*/.stati
103d0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  c void sqlite3Re
103e0 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20  fillIndex(Parse 
103f0 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
10400 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52  pIndex, int memR
10410 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c  ootPage){.  Tabl
10420 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
10430 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68  ->pTable;  /* Th
10440 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
10450 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
10460 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
10470 6e 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 42  nTab;       /* B
10480 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
10490 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69   for pTab */.  i
104a0 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65  nt iIdx = pParse
104b0 2d 3e 6e 54 61 62 2b 31 3b 20 20 20 20 20 2f 2a  ->nTab+1;     /*
104c0 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
104d0 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f  ed for pIndex */
104e0 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20  .  int addr1;   
104f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10500 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
10510 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20  top of loop */. 
10520 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20   int tnum;      
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10540 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
10550 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20  index */.  Vdbe 
10560 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
10570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
10580 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
10590 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
105a0 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  hine */.  KeyInf
105b0 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20  o *pKey;        
105c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49           /* KeyI
105d0 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f  nfo for index */
105e0 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
105f0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
10600 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49  x(pParse->db, pI
10610 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  ndex->pSchema);.
10620 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10630 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
10640 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ON.  if( sqlite3
10650 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
10660 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  , SQLITE_REINDEX
10670 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
10680 20 30 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65   0,.      pParse
10690 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
106a0 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65  Name ) ){.    re
106b0 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
106c0 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61  ..  /* Require a
106d0 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
106e0 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66  he table to perf
106f0 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69  orm this operati
10700 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54  on */.  sqlite3T
10710 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
10720 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
10730 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 1, pTab->zName
10740 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  );..  v = sqlite
10750 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
10760 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
10770 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d  eturn;.  if( mem
10780 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20  RootPage>=0 ){. 
10790 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
107a0 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
107b0 64 2c 20 6d 65 6d 52 6f 6f 74 50 61 67 65 2c 20  d, memRootPage, 
107c0 30 29 3b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 30  0);.    tnum = 0
107d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
107e0 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e  num = pIndex->tn
107f0 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  um;.    sqlite3V
10800 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
10810 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29  lear, tnum, iDb)
10820 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
10830 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
10840 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b  nteger, iDb, 0);
10850 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  .  pKey = sqlite
10860 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
10870 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20  arse, pIndex);. 
10880 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
10890 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
108a0 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20 28 63 68   iIdx, tnum, (ch
108b0 61 72 20 2a 29 70 4b 65 79 2c 20 50 33 5f 4b 45  ar *)pKey, P3_KE
108c0 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
108d0 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
108e0 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c  le(pParse, iTab,
108f0 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
10900 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72  penRead);.  addr
10910 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
10920 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
10930 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 73  d, iTab, 0);.  s
10940 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
10950 64 65 78 4b 65 79 28 76 2c 20 70 49 6e 64 65 78  dexKey(v, pIndex
10960 2c 20 69 54 61 62 29 3b 0a 20 20 69 66 28 20 70  , iTab);.  if( p
10970 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
10980 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 69  OE_None ){.    i
10990 6e 74 20 63 75 72 61 64 64 72 20 3d 20 73 71 6c  nt curaddr = sql
109a0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
109b0 64 64 72 28 76 29 3b 0a 20 20 20 20 69 6e 74 20  ddr(v);.    int 
109c0 61 64 64 72 32 20 3d 20 63 75 72 61 64 64 72 2b  addr2 = curaddr+
109d0 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  4;.    sqlite3Vd
109e0 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 63 75  beChangeP2(v, cu
109f0 72 61 64 64 72 2d 31 2c 20 61 64 64 72 32 29 3b  raddr-1, addr2);
10a00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10a10 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69  AddOp(v, OP_Rowi
10a20 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20  d, iTab, 0);.   
10a30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10a40 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
10a50 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
10a60 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10a70 50 5f 49 73 55 6e 69 71 75 65 2c 20 69 49 64 78  P_IsUnique, iIdx
10a80 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 73 71  , addr2);.    sq
10a90 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
10aa0 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
10ab0 43 4f 4e 53 54 52 41 49 4e 54 2c 20 4f 45 5f 41  CONSTRAINT, OE_A
10ac0 62 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20  bort,.          
10ad0 20 20 20 20 20 20 20 20 20 20 22 69 6e 64 65 78            "index
10ae0 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e  ed columns are n
10af0 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33 5f 53  ot unique", P3_S
10b00 54 41 54 49 43 29 3b 0a 20 20 20 20 61 73 73 65  TATIC);.    asse
10b10 72 74 28 20 61 64 64 72 32 3d 3d 73 71 6c 69 74  rt( addr2==sqlit
10b20 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
10b30 72 28 76 29 20 29 3b 0a 20 20 7d 0a 20 20 73 71  r(v) );.  }.  sq
10b40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10b50 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
10b60 69 49 64 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69  iIdx, 0);.  sqli
10b70 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10b80 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
10b90 64 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74  ddr1+1);.  sqlit
10ba0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
10bb0 2c 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69  , addr1);.  sqli
10bc0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10bd0 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 2c 20  OP_Close, iTab, 
10be0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
10bf0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
10c00 73 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 7d 0a  se, iIdx, 0);.}.
10c10 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
10c20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e  new index for an
10c30 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61   SQL table.  pNa
10c40 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68  me1.pName2 is th
10c50 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
10c60 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c  dex .** and pTbl
10c70 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65  List is the name
10c80 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68   of the table th
10c90 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
10ca0 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20  xed.  Both will 
10cb0 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20  .** be NULL for 
10cc0 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
10cd0 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
10ce0 73 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74  s created to sat
10cf0 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45  isfy a.** UNIQUE
10d00 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66   constraint.  If
10d10 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64   pTable and pInd
10d20 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65  ex are NULL, use
10d30 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
10d40 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62  le.** as the tab
10d50 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
10d60 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
10d70 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20  able is a table 
10d80 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65  that is.** curre
10d90 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
10da0 72 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41  ructed by a CREA
10db0 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
10dc0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  nt..**.** pList 
10dd0 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c  is a list of col
10de0 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
10df0 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20  ed.  pList will 
10e00 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a  be NULL if this.
10e10 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20  ** is a primary 
10e20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f  key or unique-co
10e30 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
10e40 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75  most recent colu
10e50 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74  mn added.** to t
10e60 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
10e70 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
10e80 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64  ction.  .*/.void
10e90 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
10ea0 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
10eb0 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c  arse,     /* All
10ec0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
10ed0 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f  ut this parse */
10ee0 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
10ef0 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ,     /* First p
10f00 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
10f10 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
10f20 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
10f30 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64  2,     /* Second
10f40 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
10f50 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
10f60 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
10f70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c  TblName, /* Tabl
10f80 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20  e to index. Use 
10f90 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
10fa0 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72  e if 0 */.  Expr
10fb0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
10fc0 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  * A list of colu
10fd0 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
10fe0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
10ff0 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f  or,       /* OE_
11000 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65  Abort, OE_Ignore
11010 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72  , OE_Replace, or
11020 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f   OE_None */.  To
11030 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20  ken *pStart,    
11040 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
11050 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
11060 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
11070 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
11080 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20  oken *pEnd,     
11090 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61    /* The ")" tha
110a0 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45  t closes the CRE
110b0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
110c0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
110d0 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53  tOrder,     /* S
110e0 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69  ort order of pri
110f0 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c  mary key when pL
11100 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69  ist==NULL */.  i
11110 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20 20  nt ifNotExist   
11120 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20    /* Omit error 
11130 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  if index already
11140 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
11150 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
11160 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
11170 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
11180 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
11190 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64   0;   /* The ind
111a0 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ex to be created
111b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
111c0 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61  e = 0;     /* Na
111d0 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
111e0 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
111f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11200 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
11210 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20  s in zName */.  
11220 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65  int i, j;.  Toke
11230 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20  n nullId;       
11240 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66   /* Fake token f
11250 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c  or an empty ID l
11260 69 73 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72  ist */.  DbFixer
11270 20 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a   sFix;        /*
11280 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64   For assigning d
11290 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f  atabase names to
112a0 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   pTable */.  int
112b0 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20   sortOrderMask; 
112c0 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20    /* 1 to honor 
112d0 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20  DESC in index.  
112e0 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a  0 to ignore. */.
112f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11300 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62  pParse->db;.  Db
11310 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
11320 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66     /* The specif
11330 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  ic table contain
11340 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64 20  ing the indexed 
11350 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
11360 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
11370 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
11380 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
11390 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
113a0 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
113b0 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55  ame = 0;    /* U
113c0 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
113d0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
113e0 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75  create */.  stru
113f0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
11400 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20   *pListItem; /* 
11410 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
11420 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
11430 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 45 78 74  nCol;.  int nExt
11440 72 61 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ra = 0;.  char *
11450 7a 45 78 74 72 61 3b 0a 0a 20 20 69 66 28 20 70  zExtra;..  if( p
11460 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
11470 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
11480 65 64 28 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ed() ){.    goto
11490 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
114a0 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ex;.  }..  /*.  
114b0 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c  ** Find the tabl
114c0 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
114d0 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e  indexed.  Return
114e0 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f   early if not fo
114f0 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  und..  */.  if( 
11500 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a  pTblName!=0 ){..
11510 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74      /* Use the t
11520 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61  wo-part index na
11530 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  me to determine 
11540 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
11550 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66    ** to search f
11560 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46  or the table. 'F
11570 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ix' the table na
11580 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20  me to this db.  
11590 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b    ** before look
115a0 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c 65  ing up the table
115b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
115c0 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70  ert( pName1 && p
115d0 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62  Name2 );.    iDb
115e0 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
115f0 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
11600 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
11610 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69  Name);.    if( i
11620 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74  Db<0 ) goto exit
11630 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
11640 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11650 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f  MIT_TEMPDB.    /
11660 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e  * If the index n
11670 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66  ame was unqualif
11680 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68  ied, check if th
11690 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  e the table.    
116a0 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62  ** is a temp tab
116b0 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74  le. If so, set t
116c0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31  he database to 1
116d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 61  ..    */.    pTa
116e0 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  b = sqlite3SrcLi
116f0 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  stLookup(pParse,
11700 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20   pTblName);.    
11710 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e  if( pName2 && pN
11720 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54  ame2->n==0 && pT
11730 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68  ab && pTab->pSch
11740 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e  ema==db->aDb[1].
11750 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
11760 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7d 0a   iDb = 1;.    }.
11770 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20  #endif..    if( 
11780 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
11790 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
117a0 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d  b, "index", pNam
117b0 65 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71  e) &&.        sq
117c0 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
117d0 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29  &sFix, pTblName)
117e0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
117f0 20 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72   Because the par
11800 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70  ser constructs p
11810 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73  TblName from a s
11820 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72  ingle identifier
11830 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  ,.      ** sqlit
11840 65 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e  e3FixSrcList can
11850 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a   never fail. */.
11860 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
11870 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20  .    }.    pTab 
11880 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
11890 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 62  able(pParse, pTb
118a0 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  lName->a[0].zNam
118b0 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c  e, .        pTbl
118c0 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
118d0 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21  base);.    if( !
118e0 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74  pTab ) goto exit
118f0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
11900 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
11910 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3d  Db[iDb].pSchema=
11920 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
11930 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
11940 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
11950 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50  );.    pTab = pP
11960 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
11970 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29  .    if( !pTab )
11980 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
11990 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62  e_index;.    iDb
119a0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
119b0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
119c0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a  ->pSchema);.  }.
119d0 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
119e0 5b 69 44 62 5d 3b 0a 0a 20 20 69 66 28 20 70 54  [iDb];..  if( pT
119f0 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  ab==0 || pParse-
11a00 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69  >nErr ) goto exi
11a10 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11a20 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64    if( pTab->read
11a30 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  Only ){.    sqli
11a40 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
11a50 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
11a60 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
11a70 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
11a80 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
11a90 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
11aa0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11ab0 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20  OMIT_VIEW.  if( 
11ac0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
11ad0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
11ae0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
11af0 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  ews may not be i
11b00 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f  ndexed");.    go
11b10 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
11b20 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ndex;.  }.#endif
11b30 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
11b40 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
11b50 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75   index.  Make su
11b60 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  re there is not 
11b70 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a  already another.
11b80 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
11b90 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ble with the sam
11ba0 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20  e name.  .  **. 
11bb0 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20   ** Exception:  
11bc0 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  If we are readin
11bd0 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70  g the names of p
11be0 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73  ermanent indices
11bf0 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73   from the.  ** s
11c00 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
11c10 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65  le (because some
11c20 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
11c30 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d  hanged the schem
11c40 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20  a) and.  ** one 
11c50 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  of the index nam
11c60 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68  es collides with
11c70 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74   the name of a t
11c80 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
11c90 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68  r.  ** index, th
11ca0 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  en we will conti
11cb0 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74  nue to process t
11cc0 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  his index..  **.
11cd0 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30    ** If pName==0
11ce0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
11cf0 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69  e are.  ** deali
11d00 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72  ng with a primar
11d10 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20  y key or UNIQUE 
11d20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20  constraint.  We 
11d30 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f  have to invent o
11d40 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65  ur.  ** own name
11d50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  ..  */.  if( pNa
11d60 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
11d70 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
11d80 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
11d90 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
11da0 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
11db0 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
11dc0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
11dd0 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e  ndex;.    if( zN
11de0 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
11df0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
11e00 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
11e10 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
11e20 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
11e30 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
11e40 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
11e50 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
11e60 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
11e70 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
11e80 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
11e90 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
11ea0 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f  a(pParse) ) goto
11eb0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
11ec0 65 78 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ex;.      if( sq
11ed0 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
11ee0 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a  b, zName, pDb->z
11ef0 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
11f00 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78      if( !ifNotEx
11f10 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
11f20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11f30 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
11f40 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %s already exist
11f50 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
11f60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f      }.        go
11f70 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
11f80 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
11f90 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
11fa0 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
11fb0 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20  me, 0)!=0 ){.   
11fc0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
11fd0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
11fe0 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
11ff0 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22   table named %s"
12000 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
12010 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
12020 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
12030 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
12040 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33  .    char zBuf[3
12050 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  0];.    int n;. 
12060 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b     Index *pLoop;
12070 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
12080 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31  Tab->pIndex, n=1
12090 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
120a0 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b  Loop->pNext, n++
120b0 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28  ){}.    sprintf(
120c0 7a 42 75 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20  zBuf,"_%d",n);. 
120d0 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20     zName = 0;.  
120e0 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
120f0 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ng(&zName, "sqli
12100 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20  te_autoindex_", 
12110 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75  pTab->zName, zBu
12120 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  f, (char*)0);.  
12130 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
12140 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
12150 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
12160 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74  /* Check for aut
12170 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72  horization to cr
12180 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20  eate an index.. 
12190 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
121a0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
121b0 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f  ATION.  {.    co
121c0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
121d0 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  pDb->zName;.    
121e0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
121f0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
12200 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
12210 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30  MA_TABLE(iDb), 0
12220 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
12230 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12240 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
12250 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45    i = SQLITE_CRE
12260 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  ATE_INDEX;.    i
12270 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
12280 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20  && iDb==1 ) i = 
12290 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
122a0 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
122b0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
122c0 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e  ck(pParse, i, zN
122d0 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
122e0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
122f0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12300 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
12310 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
12320 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d  f pList==0, it m
12330 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e  eans this routin
12340 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  e was called to 
12350 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20  make a primary. 
12360 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74   ** key out of t
12370 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61  he last column a
12380 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
12390 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
123a0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72  tion..  ** So cr
123b0 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74  eate a fake list
123c0 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69   to simulate thi
123d0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  s..  */.  if( pL
123e0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75  ist==0 ){.    nu
123f0 6c 6c 49 64 2e 7a 20 3d 20 28 75 38 2a 29 70 54  llId.z = (u8*)pT
12400 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
12410 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col-1].zName;.  
12420 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72    nullId.n = str
12430 6c 65 6e 28 28 63 68 61 72 2a 29 6e 75 6c 6c 49  len((char*)nullI
12440 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  d.z);.    pList 
12450 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
12460 74 41 70 70 65 6e 64 28 30 2c 20 30 2c 20 26 6e  tAppend(0, 0, &n
12470 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20  ullId);.    if( 
12480 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
12490 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
124a0 78 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  x;.    pList->a[
124b0 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73  0].sortOrder = s
124c0 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
124d0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
124e0 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ow many bytes of
124f0 20 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69   space are requi
12500 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70  red to store exp
12510 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65  licitly.  ** spe
12520 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  cified collation
12530 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e   sequence names.
12540 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
12550 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
12560 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
12570 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  *pExpr = pList->
12580 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
12590 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20  if( pExpr ){.   
125a0 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20     nExtra += (1 
125b0 2b 20 73 74 72 6c 65 6e 28 70 45 78 70 72 2d 3e  + strlen(pExpr->
125c0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  pColl->zName));.
125d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
125e0 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  ** Allocate t
125f0 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  he index structu
12600 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d  re. .  */.  nNam
12610 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
12620 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c 69 73  );.  nCol = pLis
12630 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64  t->nExpr;.  pInd
12640 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ex = sqliteMallo
12650 63 28 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  c( .      sizeof
12660 28 49 6e 64 65 78 29 20 2b 20 20 20 20 20 20 20  (Index) +       
12670 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
12680 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20  structure  */.  
12690 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a      sizeof(int)*
126a0 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20  nCol +          
126b0 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75   /* Index.aiColu
126c0 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69  mn   */.      si
126d0 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 43 6f 6c 2b  zeof(int)*(nCol+
126e0 31 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 49 6e  1) +       /* In
126f0 64 65 78 2e 61 69 52 6f 77 45 73 74 20 20 20 2a  dex.aiRowEst   *
12700 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 63  /.      sizeof(c
12710 68 61 72 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20  har *)*nCol +   
12720 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a       /* Index.az
12730 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20  Coll     */.    
12740 20 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f    sizeof(u8)*nCo
12750 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f  l +            /
12760 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64  * Index.aSortOrd
12770 65 72 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 61 6d  er */.      nNam
12780 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20  e + 1 +         
12790 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
127a0 78 2e 7a 4e 61 6d 65 20 20 20 20 20 20 2a 2f 0a  x.zName      */.
127b0 20 20 20 20 20 20 6e 45 78 74 72 61 20 20 20 20        nExtra    
127c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127d0 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20     /* Collation 
127e0 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 20 2a  sequence names *
127f0 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  /.  );.  if( sql
12800 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64  ite3MallocFailed
12810 28 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  () ) 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 75 6e 73  >aiRowEst = (uns
12870 69 67 6e 65 64 20 2a 29 28 26 70 49 6e 64 65 78  igned *)(&pIndex
12880 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d  ->aiColumn[nCol]
12890 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43  );.  pIndex->azC
128a0 6f 6c 6c 20 3d 20 28 63 68 61 72 20 2a 2a 29 28  oll = (char **)(
128b0 26 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73  &pIndex->aiRowEs
128c0 74 5b 6e 43 6f 6c 2b 31 5d 29 3b 0a 20 20 70 49  t[nCol+1]);.  pI
128d0 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
128e0 20 3d 20 28 75 38 20 2a 29 28 26 70 49 6e 64 65   = (u8 *)(&pInde
128f0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29  x->azColl[nCol])
12900 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ;.  pIndex->zNam
12910 65 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49  e = (char *)(&pI
12920 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
12930 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74 72  [nCol]);.  zExtr
12940 61 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49  a = (char *)(&pI
12950 6e 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d  ndex->zName[nNam
12960 65 2b 31 5d 29 3b 0a 20 20 73 74 72 63 70 79 28  e+1]);.  strcpy(
12970 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  pIndex->zName, z
12980 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d  Name);.  pIndex-
12990 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a  >pTable = pTab;.
129a0 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d    pIndex->nColum
129b0 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
129c0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ;.  pIndex->onEr
129d0 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20  ror = onError;. 
129e0 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
129f0 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20  ex = pName==0;. 
12a00 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
12a10 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
12a20 70 53 63 68 65 6d 61 3b 0a 0a 20 20 2f 2a 20 43  pSchema;..  /* C
12a30 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
12a40 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44  e should honor D
12a50 45 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20  ESC requests on 
12a60 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20  index columns.  
12a70 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53  */.  if( pDb->pS
12a80 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
12a90 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72  at>=4 ){.    sor
12aa0 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b  tOrderMask = -1;
12ab0 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43     /* Honor DESC
12ac0 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
12ad0 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d   sortOrderMask =
12ae0 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65   0;    /* Ignore
12af0 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20   DESC */.  }..  
12b00 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65  /* Scan the name
12b10 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s of the columns
12b20 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
12b30 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a   be indexed and.
12b40 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f    ** load the co
12b50 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74  lumn indices int
12b60 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75  o the Index stru
12b70 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61  cture.  Report a
12b80 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20  n error.  ** if 
12b90 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f  any column is no
12ba0 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
12bb0 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74  for(i=0, pListIt
12bc0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
12bd0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
12be0 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a  , pListItem++){.
12bf0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12c00 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74  zColName = pList
12c10 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Item->zName;.   
12c20 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c   Column *pTabCol
12c30 3b 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65 73  ;.    int reques
12c40 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  tedSortOrder;.  
12c50 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20    char *zColl;  
12c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c70 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65   /* Collation se
12c80 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 66  quence */..    f
12c90 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d  or(j=0, pTabCol=
12ca0 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54  pTab->aCol; j<pT
12cb0 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70  ab->nCol; j++, p
12cc0 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  TabCol++){.     
12cd0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
12ce0 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54  Cmp(zColName, pT
12cf0 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30  abCol->zName)==0
12d00 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
12d10 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d      if( j>=pTab-
12d20 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  >nCol ){.      s
12d30 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
12d40 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
12d50 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e   has no column n
12d60 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20  amed %s",.      
12d70 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a    pTab->zName, z
12d80 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ColName);.      
12d90 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12da0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
12db0 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
12dc0 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 69  mn[i] = j;.    i
12dd0 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45  f( pListItem->pE
12de0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73  xpr ){.      ass
12df0 65 72 74 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e  ert( pListItem->
12e00 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a  pExpr->pColl );.
12e10 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45        zColl = zE
12e20 78 74 72 61 3b 0a 20 20 20 20 20 20 73 74 72 63  xtra;.      strc
12e30 70 79 28 7a 45 78 74 72 61 2c 20 70 4c 69 73 74  py(zExtra, pList
12e40 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f  Item->pExpr->pCo
12e50 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
12e60 20 20 7a 45 78 74 72 61 20 2b 3d 20 28 73 74 72    zExtra += (str
12e70 6c 65 6e 28 7a 43 6f 6c 6c 29 20 2b 20 31 29 3b  len(zColl) + 1);
12e80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12e90 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e    zColl = pTab->
12ea0 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[j].zColl;. 
12eb0 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20       if( !zColl 
12ec0 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c  ){.        zColl
12ed0 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
12ee0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ->zName;.      }
12ef0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
12f00 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
12f10 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43   !sqlite3LocateC
12f20 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
12f30 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20  Coll, -1) ){.   
12f40 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
12f50 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
12f60 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43  .    pIndex->azC
12f70 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a  oll[i] = zColl;.
12f80 20 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72      requestedSor
12f90 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74  tOrder = pListIt
12fa0 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20  em->sortOrder & 
12fb0 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20  sortOrderMask;. 
12fc0 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74     pIndex->aSort
12fd0 4f 72 64 65 72 5b 69 5d 20 3d 20 72 65 71 75 65  Order[i] = reque
12fe0 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20  stedSortOrder;. 
12ff0 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61   }.  sqlite3Defa
13000 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78  ultRowEst(pIndex
13010 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  );..  if( pTab==
13020 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
13030 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
13040 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65   routine has bee
13050 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  n called to crea
13060 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  te an automatic 
13070 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a  index as a.    *
13080 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52  * result of a PR
13090 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
130a0 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20  QUE clause on a 
130b0 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
130c0 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50  n, or.    ** a P
130d0 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
130e0 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c  IQUE clause foll
130f0 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e  owing the column
13100 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20   definitions..  
13110 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66    ** i.e. one of
13120 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
13130 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
13140 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29   PRIMARY KEY, y)
13150 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20  ;.    ** CREATE 
13160 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e  TABLE t(x, y, UN
13170 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20  IQUE(x, y));.   
13180 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65   **.    ** Eithe
13190 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20  r way, check to 
131a0 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c 65  see if the table
131b0 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75 63   already has suc
131c0 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20  h an index. If. 
131d0 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20     ** so, don't 
131e0 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67 20  bother creating 
131f0 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f  this one. This o
13200 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20  nly applies to. 
13210 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61     ** automatica
13220 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 69  lly created indi
13230 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64  ces. Users can d
13240 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20 77  o as they wish w
13250 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69  ith.    ** expli
13260 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20  cit indices..   
13270 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
13280 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
13290 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
132a0 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
132b0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
132c0 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  nt k;.      asse
132d0 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  rt( pIdx->onErro
132e0 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20  r!=OE_None );.  
132f0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
13300 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20  ->autoIndex );. 
13310 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
13320 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  dex->onError!=OE
13330 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20  _None );..      
13340 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  if( pIdx->nColum
13350 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  n!=pIndex->nColu
13360 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
13370 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
13380 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b  pIdx->nColumn; k
13390 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ++){.        con
133a0 73 74 20 63 68 61 72 20 2a 7a 31 20 3d 20 70 49  st char *z1 = pI
133b0 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20  dx->azColl[k];. 
133c0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
133d0 72 20 2a 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e  r *z2 = pIndex->
133e0 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20  azColl[k];.     
133f0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
13400 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78  olumn[k]!=pIndex
13410 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20  ->aiColumn[k] ) 
13420 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69  break;.        i
13430 66 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  f( pIdx->aSortOr
13440 64 65 72 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e  der[k]!=pIndex->
13450 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 20 29 20  aSortOrder[k] ) 
13460 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69  break;.        i
13470 66 28 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c  f( z1!=z2 && sql
13480 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20  ite3StrICmp(z1, 
13490 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  z2) ) break;.   
134a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b     }.      if( k
134b0 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  ==pIdx->nColumn 
134c0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
134d0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49  Idx->onError!=pI
134e0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b  ndex->onError ){
134f0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
13500 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72  is constraint cr
13510 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69  eates the same i
13520 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f  ndex as a previo
13530 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  us.          ** 
13540 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69  constraint speci
13550 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69  fied somewhere i
13560 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
13570 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  LE statement..  
13580 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76          ** Howev
13590 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49  er the ON CONFLI
135a0 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64  CT clauses are d
135b0 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74  ifferent. If bot
135c0 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  h this .        
135d0 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
135e0 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73  and the previous
135f0 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73   equivalent cons
13600 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c  traint have expl
13610 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a  icit.          *
13620 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  * ON CONFLICT cl
13630 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e  auses this is an
13640 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73   error. Otherwis
13650 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  e, use the.     
13660 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74       ** explicit
13670 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68  ly specified beh
13680 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65 20 69  aviour for the i
13690 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20  ndex..          
136a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
136b0 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72   !(pIdx->onError
136c0 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20  ==OE_Default || 
136d0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d  pIndex->onError=
136e0 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a  =OE_Default) ){.
136f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
13700 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13710 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
13720 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e       "conflictin
13730 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  g ON CONFLICT cl
13740 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22  auses specified"
13750 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
13760 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
13770 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
13780 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  E_Default ){.   
13790 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f           pIdx->o
137a0 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d  nError = pIndex-
137b0 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  >onError;.      
137c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
137d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
137e0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
137f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13800 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  }..  /* Link the
13810 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63   new Index struc
13820 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c  ture to its tabl
13830 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68  e and to the oth
13840 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  er.  ** in-memor
13850 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  y database struc
13860 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69  tures. .  */.  i
13870 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
13880 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
13890 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
138a0 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 49 6e  3HashInsert(&pIn
138b0 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  dex->pSchema->id
138c0 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  xHash, .        
138d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138e0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
138f0 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a  strlen(pIndex->z
13900 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29  Name)+1, pIndex)
13910 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
13920 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
13930 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61  pIndex );  /* Ma
13940 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
13950 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 67  ailed */.      g
13960 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
13970 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
13980 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
13990 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
139a0 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c  es;.    if( pTbl
139b0 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
139c0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
139d0 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
139e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
139f0 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
13a00 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65 6e  t.busy is 0 then
13a10 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65   create the inde
13a20 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73  x on disk.  This
13a30 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77  .  ** involves w
13a40 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78  riting the index
13a50 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72   into the master
13a60 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69   table and filli
13a70 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ng in the.  ** i
13a80 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75  ndex with the cu
13a90 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74  rrent table cont
13aa0 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ents..  **.  ** 
13ab0 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  The db->init.bus
13ac0 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20  y is 0 when the 
13ad0 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72  user first enter
13ae0 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58  s a CREATE INDEX
13af0 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20   .  ** command. 
13b00 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
13b10 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62  s 1 when a datab
13b20 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e  ase is opened an
13b30 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49  d .  ** CREATE I
13b40 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20  NDEX statements 
13b50 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20  are read out of 
13b60 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
13b70 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c  .  In.  ** the l
13b80 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69  atter case the i
13b90 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
13ba0 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69  sts on disk, whi
13bb0 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77  ch is why.  ** w
13bc0 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  e don't want to 
13bd0 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a  recreate it..  *
13be0 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61  *.  ** If pTblNa
13bf0 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
13c00 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e  his index is gen
13c10 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d  erated as a prim
13c20 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20  ary key.  ** or 
13c30 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
13c40 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41  t of a CREATE TA
13c50 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
13c60 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a  Since the table.
13c70 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65    ** has just be
13c80 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63  en created, it c
13c90 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20  ontains no data 
13ca0 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e  and the index in
13cb0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a  itialization.  *
13cc0 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b  * step can be sk
13cd0 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
13ce0 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  se if( db->init.
13cf0 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 56  busy==0 ){.    V
13d00 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
13d10 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74   *zStmt;.    int
13d20 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e   iMem = pParse->
13d30 6e 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 76 20 3d  nMem++;..    v =
13d40 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
13d50 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
13d60 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69   v==0 ) goto exi
13d70 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13d80 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
13d90 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72  the rootpage for
13da0 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a   the index.    *
13db0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  /.    sqlite3Beg
13dc0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
13dd0 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
13de0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13df0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65  eAddOp(v, OP_Cre
13e00 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 30  ateIndex, iDb, 0
13e10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13e20 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
13e30 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29  mStore, iMem, 0)
13e40 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72  ;..    /* Gather
13e50 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
13e60 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
13e70 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
13e80 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65   into.    ** the
13e90 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a   zStmt variable.
13ea0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
13eb0 53 74 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b  Start && pEnd ){
13ec0 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65  .      /* A name
13ed0 64 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20  d index with an 
13ee0 65 78 70 6c 69 63 69 74 20 43 52 45 41 54 45 20  explicit CREATE 
13ef0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
13f00 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  */.      zStmt =
13f10 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
13f20 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20  "CREATE%s INDEX 
13f30 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f  %.*s",.        o
13f40 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
13f50 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22  ? "" : " UNIQUE"
13f60 2c 0a 20 20 20 20 20 20 20 20 70 45 6e 64 2d 3e  ,.        pEnd->
13f70 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b 20 31  z - pName->z + 1
13f80 2c 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d  ,.        pName-
13f90 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >z);.    }else{.
13fa0 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f        /* An auto
13fb0 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72 65 61  matic index crea
13fc0 74 65 64 20 62 79 20 61 20 50 52 49 4d 41 52 59  ted by a PRIMARY
13fd0 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
13fe0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
13ff0 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71     /* zStmt = sq
14000 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29  lite3MPrintf("")
14010 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74  ; */.      zStmt
14020 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
14030 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79   /* Add an entry
14040 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   in sqlite_maste
14050 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78  r for this index
14060 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
14070 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
14080 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
14090 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e  "INSERT INTO %Q.
140a0 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78  %s VALUES('index
140b0 27 2c 25 51 2c 25 51 2c 23 30 2c 25 51 29 3b 22  ',%Q,%Q,#0,%Q);"
140c0 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ,.        db->aD
140d0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
140e0 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
140f0 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
14100 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
14110 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
14120 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29       zStmt.    )
14130 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14140 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
14150 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 1, 0);.    sql
14160 69 74 65 46 72 65 65 28 7a 53 74 6d 74 29 3b 0a  iteFree(zStmt);.
14170 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65  .    /* Fill the
14180 20 69 6e 64 65 78 20 77 69 74 68 20 64 61 74 61   index with data
14190 20 61 6e 64 20 72 65 70 61 72 73 65 20 74 68 65   and reparse the
141a0 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e   schema. Code an
141b0 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a   OP_Expire.    *
141c0 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
141d0 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64  all pre-compiled
141e0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20   statements..   
141f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c   */.    if( pTbl
14200 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Name ){.      sq
14210 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
14220 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
14230 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71   iMem);.      sq
14240 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
14250 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20  e(db, v, iDb);. 
14260 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14270 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53  Op3(v, OP_ParseS
14280 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 0a 20  chema, iDb, 0,. 
14290 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
142a0 50 72 69 6e 74 66 28 22 6e 61 6d 65 3d 27 25 71  Printf("name='%q
142b0 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  '", pIndex->zNam
142c0 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b  e), P3_DYNAMIC);
142d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
142e0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 45 78  beAddOp(v, OP_Ex
142f0 70 69 72 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  pire, 0, 0);.   
14300 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65   }.  }..  /* Whe
14310 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65  n adding an inde
14320 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  x to the list of
14330 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74   indices for a t
14340 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20  able, make.  ** 
14350 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  sure all indices
14360 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c   labeled OE_Repl
14370 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61  ace come after a
14380 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64  ll those labeled
14390 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e  .  ** OE_Ignore.
143a0 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
143b0 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72  ary for the corr
143c0 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  ect operation of
143d0 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64   UPDATE.  ** and
143e0 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20   INSERT..  */.  
143f0 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
14400 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  y || pTblName==0
14410 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72   ){.    if( onEr
14420 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
14430 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d  || pTab->pIndex=
14440 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
14450 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45  Tab->pIndex->onE
14460 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
14470 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
14480 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70  >pNext = pTab->p
14490 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61  Index;.      pTa
144a0 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  b->pIndex = pInd
144b0 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ex;.    }else{. 
144c0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68       Index *pOth
144d0 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  er = pTab->pInde
144e0 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  x;.      while( 
144f0 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26  pOther->pNext &&
14500 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e   pOther->pNext->
14510 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
14520 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ace ){.        p
14530 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e  Other = pOther->
14540 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
14550 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
14560 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  xt = pOther->pNe
14570 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72  xt;.      pOther
14580 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
14590 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
145a0 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ex = 0;.  }..  /
145b0 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72  * Clean up befor
145c0 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69  e exiting */.exi
145d0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a  t_create_index:.
145e0 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
145f0 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70 49      freeIndex(pI
14600 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ndex);.  }.  sql
14610 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
14620 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c  te(pList);.  sql
14630 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
14640 65 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73  e(pTblName);.  s
14650 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
14660 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
14670 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
14680 64 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  de to make sure 
14690 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  the file format 
146a0 6e 75 6d 62 65 72 20 69 73 20 61 74 20 6c 65 61  number is at lea
146b0 73 74 20 6d 69 6e 46 6f 72 6d 61 74 2e 0a 2a 2a  st minFormat..**
146c0 20 54 68 65 20 67 65 6e 65 72 61 74 65 64 20 63   The generated c
146d0 6f 64 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ode will increas
146e0 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  e the file forma
146f0 74 20 6e 75 6d 62 65 72 20 69 66 20 6e 65 63 65  t number if nece
14700 73 73 61 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ssary..*/.void s
14710 71 6c 69 74 65 33 4d 69 6e 69 6d 75 6d 46 69 6c  qlite3MinimumFil
14720 65 46 6f 72 6d 61 74 28 50 61 72 73 65 20 2a 70  eFormat(Parse *p
14730 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 2c 20  Parse, int iDb, 
14740 69 6e 74 20 6d 69 6e 46 6f 72 6d 61 74 29 7b 0a  int minFormat){.
14750 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 76 20 3d    Vdbe *v;.  v =
14760 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
14770 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
14780 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
14790 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
147a0 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  eadCookie, iDb, 
147b0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
147c0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
147d0 6e 74 65 67 65 72 2c 20 6d 69 6e 46 6f 72 6d 61  nteger, minForma
147e0 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
147f0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
14800 50 5f 47 65 2c 20 30 2c 20 73 71 6c 69 74 65 33  P_Ge, 0, sqlite3
14810 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
14820 76 29 2b 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  v)+3);.    sqlit
14830 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
14840 50 5f 49 6e 74 65 67 65 72 2c 20 6d 69 6e 46 6f  P_Integer, minFo
14850 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  rmat, 0);.    sq
14860 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14870 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
14880 69 44 62 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  iDb, 1);.  }.}..
14890 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49  /*.** Fill the I
148a0 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20  ndex.aiRowEst[] 
148b0 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61 75  array with defau
148c0 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  lt information -
148d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
148e0 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20  to be used when 
148f0 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20  we have not run 
14900 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d  the ANALYZE comm
14910 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77  and..**.** aiRow
14920 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73  Est[0] is suppos
14930 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  e to contain the
14940 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
14950 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  nts in the index
14960 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f  ..** Since we do
14970 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73   not know, guess
14980 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52   1 million.  aiR
14990 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65  owEst[1] is an e
149a0 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a  stimate of the.*
149b0 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
149c0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68   in the table th
149d0 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72  at match any par
149e0 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66  ticular value of
149f0 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f   the.** first co
14a00 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
14a10 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20  x.  aiRowEst[2] 
14a20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
14a30 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  f the number.** 
14a40 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74  of rows that mat
14a50 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  ch any particula
14a60 72 20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e 20 6f  r combiniation o
14a70 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63 6f  f the first 2 co
14a80 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20  lumns.** of the 
14a90 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66  index.  And so f
14aa0 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61  orth.  It must a
14ab0 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61 73  lways be the cas
14ac0 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20  e that.*.**     
14ad0 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e        aiRowEst[N
14ae0 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d  ]<=aiRowEst[N-1]
14af0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69  .**           ai
14b00 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a  RowEst[N]>=1.**.
14b10 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68  ** Apart from th
14b20 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74  at, we have litt
14b30 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69  le to go on besi
14b40 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73  des intuition as
14b50 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77   to.** how aiRow
14b60 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  Est[] should be 
14b70 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68  initialized.  Th
14b80 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61  e numbers genera
14b90 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20  ted here.** are 
14ba0 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c  based on typical
14bb0 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e   values found in
14bc0 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e   actual indices.
14bd0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14be0 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e  DefaultRowEst(In
14bf0 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e  dex *pIdx){.  un
14c00 73 69 67 6e 65 64 20 2a 61 20 3d 20 70 49 64 78  signed *a = pIdx
14c10 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e  ->aiRowEst;.  in
14c20 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 61  t i;.  assert( a
14c30 21 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20  !=0 );.  a[0] = 
14c40 31 30 30 30 30 30 30 3b 0a 20 20 66 6f 72 28 69  1000000;.  for(i
14c50 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  =pIdx->nColumn; 
14c60 69 3e 3d 31 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=1; i--){.    
14c70 61 5b 69 5d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20  a[i] = 10;.  }. 
14c80 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
14c90 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20  or!=OE_None ){. 
14ca0 20 20 20 61 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75     a[pIdx->nColu
14cb0 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  mn] = 1;.  }.}..
14cc0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
14cd0 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20  ne will drop an 
14ce0 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69  existing named i
14cf0 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74  ndex.  This rout
14d00 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ine.** implement
14d10 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58  s the DROP INDEX
14d20 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
14d30 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49  oid sqlite3DropI
14d40 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
14d50 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61  se, SrcList *pNa
14d60 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73 74 73  me, int ifExists
14d70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
14d80 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ex;.  Vdbe *v;. 
14d90 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
14da0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
14db0 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61   iDb;..  if( pPa
14dc0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
14dd0 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64  ite3MallocFailed
14de0 28 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  () ){.    goto e
14df0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
14e00 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e    }.  assert( pN
14e10 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
14e20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
14e30 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
14e40 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
14e50 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
14e60 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49  _index;.  }.  pI
14e70 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
14e80 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d  ndIndex(db, pNam
14e90 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  e->a[0].zName, p
14ea0 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
14eb0 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e  base);.  if( pIn
14ec0 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  dex==0 ){.    if
14ed0 28 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a 20  ( !ifExists ){. 
14ee0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
14ef0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
14f00 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22   such index: %S"
14f10 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , pName, 0);.   
14f20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63   }.    pParse->c
14f30 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
14f40 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
14f50 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
14f60 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f  if( pIndex->auto
14f70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c  Index ){.    sql
14f80 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14f90 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f  rse, "index asso
14fa0 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51  ciated with UNIQ
14fb0 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50  UE ".      "or P
14fc0 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
14fd0 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
14fe0 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20  dropped", 0);.  
14ff0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
15000 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44  _index;.  }.  iD
15010 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
15020 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  aToIndex(db, pIn
15030 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23  dex->pSchema);.#
15040 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15050 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
15060 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
15070 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
15080 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65  INDEX;.    Table
15090 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
150a0 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e  >pTable;.    con
150b0 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
150c0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
150d0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
150e0 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
150f0 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
15100 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
15110 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
15120 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
15130 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  b, 0, zDb) ){.  
15140 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
15150 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
15160 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
15170 4d 50 44 42 20 26 26 20 69 44 62 20 29 20 63 6f  MPDB && iDb ) co
15180 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
15190 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
151a0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
151b0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
151c0 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  de, pIndex->zNam
151d0 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
151e0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
151f0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
15200 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
15210 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
15220 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
15230 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  ve the index and
15240 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
15250 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20   table */.  v = 
15260 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
15270 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
15280 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  ){.    sqlite3Ne
15290 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
152a0 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  ,.       "DELETE
152b0 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
152c0 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20  E name=%Q",.    
152d0 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
152e0 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
152f0 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20  BLE(iDb),.      
15300 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20   pIndex->zName. 
15310 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
15320 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  3ChangeCookie(db
15330 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 64  , v, iDb);.    d
15340 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
15350 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74  Parse, pIndex->t
15360 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  num, iDb);.    s
15370 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
15380 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69   OP_DropIndex, i
15390 44 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a  Db, 0, pIndex->z
153a0 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65  Name, 0);.  }..e
153b0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a  xit_drop_index:.
153c0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
153d0 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d  Delete(pName);.}
153e0 0a 0a 2f 2a 0a 2a 2a 20 70 70 41 72 72 61 79 20  ../*.** ppArray 
153f0 70 6f 69 6e 74 73 20 69 6e 74 6f 20 61 20 73 74  points into a st
15400 72 75 63 74 75 72 65 20 77 68 65 72 65 20 74 68  ructure where th
15410 65 72 65 20 69 73 20 61 6e 20 61 72 72 61 79 20  ere is an array 
15420 70 6f 69 6e 74 65 72 0a 2a 2a 20 66 6f 6c 6c 6f  pointer.** follo
15430 77 65 64 20 62 79 20 74 77 6f 20 69 6e 74 65 67  wed by two integ
15440 65 72 73 2e 20 54 68 65 20 66 69 72 73 74 20 69  ers. The first i
15450 6e 74 65 67 65 72 20 69 73 20 74 68 65 0a 2a 2a  nteger is the.**
15460 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
15470 6e 74 73 20 69 6e 20 74 68 65 20 73 74 72 75 63  nts in the struc
15480 74 75 72 65 20 61 72 72 61 79 2e 20 20 54 68 65  ture array.  The
15490 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 0a   second integer.
154a0 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ** is the number
154b0 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c   of allocated sl
154c0 6f 74 73 20 69 6e 20 74 68 65 20 61 72 72 61 79  ots in the array
154d0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ..**.** In other
154e0 20 77 6f 72 64 73 2c 20 74 68 65 20 73 74 72 75   words, the stru
154f0 63 74 75 72 65 20 6c 6f 6f 6b 73 20 73 6f 6d 65  cture looks some
15500 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a  thing like this:
15510 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 73 74  .**.**        st
15520 72 75 63 74 20 45 78 61 6d 70 6c 65 31 20 7b 0a  ruct Example1 {.
15530 2a 2a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  **          stru
15540 63 74 20 73 75 62 45 6c 65 6d 20 2a 61 45 6e 74  ct subElem *aEnt
15550 72 79 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ry;.**          
15560 69 6e 74 20 6e 45 6e 74 72 79 3b 0a 2a 2a 20 20  int nEntry;.**  
15570 20 20 20 20 20 20 20 20 69 6e 74 20 6e 41 6c 6c          int nAll
15580 6f 63 3b 0a 2a 2a 20 20 20 20 20 20 20 20 7d 0a  oc;.**        }.
15590 2a 2a 0a 2a 2a 20 54 68 65 20 70 6e 45 6e 74 72  **.** The pnEntr
155a0 79 20 70 61 72 61 6d 65 74 65 72 20 70 6f 69 6e  y parameter poin
155b0 74 73 20 74 6f 20 74 68 65 20 65 71 75 69 76 61  ts to the equiva
155c0 6c 65 6e 74 20 6f 66 20 45 78 61 6d 70 6c 65 31  lent of Example1
155d0 2e 6e 45 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  .nEntry..**.** T
155e0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f  his routine allo
155f0 63 61 74 65 73 20 61 20 6e 65 77 20 73 6c 6f 74  cates a new slot
15600 20 69 6e 20 74 68 65 20 61 72 72 61 79 2c 20 7a   in the array, z
15610 65 72 6f 73 20 69 74 20 6f 75 74 2c 0a 2a 2a 20  eros it out,.** 
15620 61 6e 64 20 72 65 74 75 72 6e 73 20 69 74 73 20  and returns its 
15630 69 6e 64 65 78 2e 20 20 49 66 20 6d 61 6c 6c 6f  index.  If mallo
15640 63 20 66 61 69 6c 73 20 61 20 6e 65 67 61 74 69  c fails a negati
15650 76 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 74  ve number is ret
15660 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 7a 45  urned..**.** szE
15670 6e 74 72 79 20 69 73 20 74 68 65 20 73 69 7a 65  ntry is the size
15680 6f 66 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 61  of of a single a
15690 72 72 61 79 20 65 6e 74 72 79 2e 20 20 69 6e 69  rray entry.  ini
156a0 74 53 69 7a 65 20 69 73 20 74 68 65 20 0a 2a 2a  tSize is the .**
156b0 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 72 61 79   number of array
156c0 20 65 6e 74 72 69 65 73 20 61 6c 6c 6f 63 61 74   entries allocat
156d0 65 64 20 6f 6e 20 74 68 65 20 69 6e 69 74 69 61  ed on the initia
156e0 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f  l allocation..*/
156f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 41 72 72 61  .int sqlite3Arra
15700 79 41 6c 6c 6f 63 61 74 65 28 76 6f 69 64 20 2a  yAllocate(void *
15710 2a 70 70 41 72 72 61 79 2c 20 69 6e 74 20 73 7a  *ppArray, int sz
15720 45 6e 74 72 79 2c 20 69 6e 74 20 69 6e 69 74 53  Entry, int initS
15730 69 7a 65 29 7b 0a 20 20 63 68 61 72 20 2a 70 3b  ize){.  char *p;
15740 0a 20 20 69 6e 74 20 2a 61 6e 20 3d 20 28 69 6e  .  int *an = (in
15750 74 2a 29 26 70 70 41 72 72 61 79 5b 31 5d 3b 0a  t*)&ppArray[1];.
15760 20 20 69 66 28 20 61 6e 5b 30 5d 3e 3d 61 6e 5b    if( an[0]>=an[
15770 31 5d 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  1] ){.    void *
15780 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 65  pNew;.    int ne
15790 77 53 69 7a 65 3b 0a 20 20 20 20 6e 65 77 53 69  wSize;.    newSi
157a0 7a 65 20 3d 20 61 6e 5b 31 5d 2a 32 20 2b 20 69  ze = an[1]*2 + i
157b0 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65  nitSize;.    pNe
157c0 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
157d0 63 28 2a 70 70 41 72 72 61 79 2c 20 6e 65 77 53  c(*ppArray, newS
157e0 69 7a 65 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20  ize*szEntry);.  
157f0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
15800 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
15810 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 5b 31  ;.    }.    an[1
15820 5d 20 3d 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  ] = newSize;.   
15830 20 2a 70 70 41 72 72 61 79 20 3d 20 70 4e 65 77   *ppArray = pNew
15840 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 2a 70 70 41  ;.  }.  p = *ppA
15850 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26  rray;.  memset(&
15860 70 5b 61 6e 5b 30 5d 2a 73 7a 45 6e 74 72 79 5d  p[an[0]*szEntry]
15870 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20  , 0, szEntry);. 
15880 20 72 65 74 75 72 6e 20 61 6e 5b 30 5d 2b 2b 3b   return an[0]++;
15890 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
158a0 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
158b0 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69  o the given IdLi
158c0 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
158d0 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e  w IdList if.** n
158e0 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  eed be..**.** A 
158f0 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65  new IdList is re
15900 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
15910 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  if malloc() fail
15920 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71  s..*/.IdList *sq
15930 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
15940 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  d(IdList *pList,
15950 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
15960 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
15970 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
15980 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61  pList = sqliteMa
15990 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c  lloc( sizeof(IdL
159a0 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
159b0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
159c0 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  n 0;.    pList->
159d0 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a  nAlloc = 0;.  }.
159e0 20 20 69 20 3d 20 73 71 6c 69 74 65 33 41 72 72    i = sqlite3Arr
159f0 61 79 41 6c 6c 6f 63 61 74 65 28 28 76 6f 69 64  ayAllocate((void
15a00 2a 2a 29 26 70 4c 69 73 74 2d 3e 61 2c 20 73 69  **)&pList->a, si
15a10 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
15a20 29 2c 20 35 29 3b 0a 20 20 69 66 28 20 69 3c 30  ), 5);.  if( i<0
15a30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   ){.    sqlite3I
15a40 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
15a50 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
15a60 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61  ;.  }.  pList->a
15a70 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
15a80 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
15a90 28 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75  (pToken);.  retu
15aa0 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
15ab0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c  ** Delete an IdL
15ac0 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
15ad0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
15ae0 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  (IdList *pList){
15af0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
15b00 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
15b10 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
15b20 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
15b30 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
15b40 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
15b50 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
15b60 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b  eFree(pList->a);
15b70 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
15b80 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ist);.}../*.** R
15b90 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
15ba0 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20  in pList of the 
15bb0 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64  identifier named
15bc0 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31   zId.  Return -1
15bd0 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  .** if not found
15be0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15bf0 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69  IdListIndex(IdLi
15c00 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74  st *pList, const
15c10 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
15c20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
15c30 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
15c40 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  -1;.  for(i=0; i
15c50 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
15c60 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
15c70 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
15c80 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  >a[i].zName, zNa
15c90 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
15ca0 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
15cb0 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  -1;.}../*.** App
15cc0 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20  end a new table 
15cd0 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65  name to the give
15ce0 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61  n SrcList.  Crea
15cf0 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  te a new SrcList
15d00 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20   if.** need be. 
15d10 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   A new entry is 
15d20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53  created in the S
15d30 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70  rcList even if p
15d40 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a  Token is NULL..*
15d50 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c 69  *.** A new SrcLi
15d60 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
15d70 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f  or NULL if mallo
15d80 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a  c() fails..**.**
15d90 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69 73   If pDatabase is
15da0 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65   not null, it me
15db0 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61 62  ans that the tab
15dc0 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e  le has an option
15dd0 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e  al.** database n
15de0 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b  ame prefix.  Lik
15df0 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62 61  e this:  "databa
15e00 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20  se.table".  The 
15e10 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69  pDatabase.** poi
15e20 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65  nts to the table
15e30 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54   name and the pT
15e40 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74  able points to t
15e50 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
15e60 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74  ..** The SrcList
15e70 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64  .a[].zName field
15e80 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
15e90 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
15ea0 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f  hich might.** co
15eb0 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28  me from pTable (
15ec0 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20  if pDatabase is 
15ed0 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44  NULL) or from pD
15ee0 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72  atabase.  .** Sr
15ef0 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62  cList.a[].zDatab
15f00 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69  ase is filled wi
15f10 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
15f20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  name from pTable
15f30 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c  ,.** or with NUL
15f40 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65  L if no database
15f50 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a   is specified..*
15f60 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f  *.** In other wo
15f70 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b  rds, if call lik
15f80 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
15f90 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
15fa0 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 30  ListAppend(A,B,0
15fb0 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20  );.**.** Then B 
15fc0 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20  is a table name 
15fd0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
15fe0 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69   name is unspeci
15ff0 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64  fied.  If called
16000 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  .** like this:.*
16010 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
16020 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
16030 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20  d(A,B,C);.**.** 
16040 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61  Then C is the ta
16050 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69  ble name and B i
16060 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  s the database n
16070 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ame..*/.SrcList 
16080 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
16090 70 70 65 6e 64 28 53 72 63 4c 69 73 74 20 2a 70  ppend(SrcList *p
160a0 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61  List, Token *pTa
160b0 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74  ble, Token *pDat
160c0 61 62 61 73 65 29 7b 0a 20 20 73 74 72 75 63 74  abase){.  struct
160d0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
160e0 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
160f0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
16100 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
16110 28 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74  ( sizeof(SrcList
16120 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
16130 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
16140 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
16150 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  loc = 1;.  }.  i
16160 66 28 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d  f( pList->nSrc>=
16170 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  pList->nAlloc ){
16180 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  .    SrcList *pN
16190 65 77 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e  ew;.    pList->n
161a0 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20  Alloc *= 2;.    
161b0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61  pNew = sqliteRea
161c0 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a 20 20 20 20  lloc(pList,.    
161d0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
161e0 66 28 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c 69  f(*pList) + (pLi
161f0 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69  st->nAlloc-1)*si
16200 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
16210 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ) );.    if( pNe
16220 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  w==0 ){.      sq
16230 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
16240 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  te(pList);.     
16250 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
16260 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65  .    pList = pNe
16270 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d  w;.  }.  pItem =
16280 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
16290 2d 3e 6e 53 72 63 5d 3b 0a 20 20 6d 65 6d 73 65  ->nSrc];.  memse
162a0 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65  t(pItem, 0, size
162b0 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
162c0 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  ;.  if( pDatabas
162d0 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e  e && pDatabase->
162e0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74  z==0 ){.    pDat
162f0 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  abase = 0;.  }. 
16300 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26   if( pDatabase &
16310 26 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  & pTable ){.    
16320 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70  Token *pTemp = p
16330 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44  Database;.    pD
16340 61 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65  atabase = pTable
16350 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70  ;.    pTable = p
16360 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65  Temp;.  }.  pIte
16370 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
16380 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
16390 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d  pTable);.  pItem
163a0 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
163b0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
163c0 65 6e 28 70 44 61 74 61 62 61 73 65 29 3b 0a 20  en(pDatabase);. 
163d0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20   pItem->iCursor 
163e0 3d 20 2d 31 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e  = -1;.  pList->n
163f0 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  Src++;.  return 
16400 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
16410 41 73 73 69 67 6e 20 63 75 72 73 6f 72 73 20 74  Assign cursors t
16420 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  o all tables in 
16430 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69  a SrcList.*/.voi
16440 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
16450 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61  AssignCursors(Pa
16460 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
16470 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
16480 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
16490 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
164a0 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c  tem;.  assert(pL
164b0 69 73 74 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61  ist || sqlite3Ma
164c0 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 3b 0a  llocFailed() );.
164d0 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
164e0 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
164f0 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c  m=pList->a; i<pL
16500 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
16510 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
16520 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  if( pItem->iCurs
16530 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  or>=0 ) break;. 
16540 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72       pItem->iCur
16550 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
16560 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ab++;.      if( 
16570 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
16580 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
16590 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
165a0 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49  rsors(pParse, pI
165b0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  tem->pSelect->pS
165c0 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
165d0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
165e0 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20  Add an alias to 
165f0 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66  the last identif
16600 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ier on the given
16610 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74   identifier list
16620 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
16630 33 53 72 63 4c 69 73 74 41 64 64 41 6c 69 61 73  3SrcListAddAlias
16640 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c  (SrcList *pList,
16650 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
16660 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26 26 20  .  if( pList && 
16670 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b  pList->nSrc>0 ){
16680 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c  .    pList->a[pL
16690 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 2e 7a 41 6c  ist->nSrc-1].zAl
166a0 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ias = sqlite3Nam
166b0 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65  eFromToken(pToke
166c0 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  n);.  }.}../*.**
166d0 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
166e0 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64  e SrcList includ
166f0 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73  ing all its subs
16700 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
16710 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
16720 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20 2a  Delete(SrcList *
16730 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
16740 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
16750 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
16760 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
16770 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49  return;.  for(pI
16780 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
16790 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  0; i<pList->nSrc
167a0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
167b0 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
167c0 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
167d0 29 3b 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 4e 61 6d 65 29 3b  e(pItem->zName);
167f0 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
16800 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
16810 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
16820 65 54 61 62 6c 65 28 30 2c 20 70 49 74 65 6d 2d  eTable(0, pItem-
16830 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69  >pTab);.    sqli
16840 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
16850 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pItem->pSelect);
16860 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
16870 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 4f  Delete(pItem->pO
16880 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49  n);.    sqlite3I
16890 64 4c 69 73 74 44 65 6c 65 74 65 28 70 49 74 65  dListDelete(pIte
168a0 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a  m->pUsing);.  }.
168b0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
168c0 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  st);.}../*.** Be
168d0 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  gin a transactio
168e0 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
168f0 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  3BeginTransactio
16900 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
16910 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71   int type){.  sq
16920 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
16930 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  e *v;.  int i;..
16940 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
16950 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
16960 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62  b)==0 || db->aDb
16970 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
16980 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
16990 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
169a0 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
169b0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
169c0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
169d0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
169e0 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42  _TRANSACTION, "B
169f0 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 20 72  EGIN", 0, 0) ) r
16a00 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71  eturn;..  v = sq
16a10 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
16a20 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29  rse);.  if( !v )
16a30 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74   return;.  if( t
16a40 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44  ype!=TK_DEFERRED
16a50 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
16a60 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
16a70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
16a80 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54  dbeAddOp(v, OP_T
16a90 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28  ransaction, i, (
16aa0 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49  type==TK_EXCLUSI
16ab0 56 45 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  VE)+1);.    }.  
16ac0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
16ad0 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43  ddOp(v, OP_AutoC
16ae0 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a  ommit, 0, 0);.}.
16af0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20  ./*.** Commit a 
16b00 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
16b10 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
16b20 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  tTransaction(Par
16b30 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
16b40 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
16b50 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50  be *v;..  if( pP
16b60 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
16b70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
16b80 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
16b90 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
16ba0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
16bb0 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  || sqlite3Malloc
16bc0 46 61 69 6c 65 64 28 29 20 29 20 72 65 74 75 72  Failed() ) retur
16bd0 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
16be0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
16bf0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
16c00 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  TION, "COMMIT", 
16c10 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
16c20 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
16c30 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
16c40 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
16c50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
16c60 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
16c70 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   1, 0);.  }.}../
16c80 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20  *.** Rollback a 
16c90 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
16ca0 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  oid sqlite3Rollb
16cb0 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ackTransaction(P
16cc0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
16cd0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
16ce0 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
16cf0 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
16d00 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
16d10 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
16d20 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
16d30 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
16d40 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c  r || sqlite3Mall
16d50 6f 63 46 61 69 6c 65 64 28 29 20 29 20 72 65 74  ocFailed() ) ret
16d60 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
16d70 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
16d80 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
16d90 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43  ACTION, "ROLLBAC
16da0 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75  K", 0, 0) ) retu
16db0 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  rn;..  v = sqlit
16dc0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
16dd0 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
16de0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16df0 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  Op(v, OP_AutoCom
16e00 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a  mit, 1, 1);.  }.
16e10 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
16e20 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61  re the TEMP data
16e30 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64  base is open and
16e40 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
16e50 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  se.  Return.** t
16e60 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
16e70 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20  ors.  Leave any 
16e80 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
16e90 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
16ea0 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
16eb0 63 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65  c int sqlite3Ope
16ec0 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50 61  nTempDatabase(Pa
16ed0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
16ee0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
16ef0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
16f00 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d  db->aDb[1].pBt==
16f10 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78  0 && !pParse->ex
16f20 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74  plain ){.    int
16f30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
16f40 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30 2c  eeFactory(db, 0,
16f50 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 26   0, MAX_PAGES, &
16f60 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b  db->aDb[1].pBt);
16f70 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
16f80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16f90 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16fa0 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
16fb0 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
16fc0 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20  ary database ". 
16fd0 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72         "file for
16fe0 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61   storing tempora
16ff0 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ry tables");.   
17000 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
17010 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
17020 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
17030 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 21 64  ( db->flags & !d
17040 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
17050 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
17060 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
17070 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  ns(db->aDb[1].pB
17080 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 1);.      if(
17090 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
170a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
170b0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
170c0 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74  , "unable to get
170d0 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e   a write lock on
170e0 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 74 68   ".          "th
170f0 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  e temporary data
17100 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20 20 20  base file");.   
17110 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
17120 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 65  = rc;.        re
17130 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
17140 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
17150 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ( db->aDb[1].pSc
17160 68 65 6d 61 20 29 3b 0a 20 20 7d 0a 20 20 72 65  hema );.  }.  re
17170 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
17180 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
17190 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65  ode that will ve
171a0 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
171b0 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74  cookie and start
171c0 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73  .** a read-trans
171d0 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e  action for all n
171e0 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  amed database fi
171f0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  les..**.** It is
17200 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
17210 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  all schema cooki
17220 65 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61  es be verified a
17230 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74  nd all.** read t
17240 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73  ransactions be s
17250 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e  tarted before an
17260 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70  ything else happ
17270 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44  ens in.** the VD
17280 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74  BE program.  But
17290 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
172a0 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  n be called afte
172b0 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20  r much other.** 
172c0 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65  code has been ge
172d0 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72  nerated.  So her
172e0 65 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a  e is what we do:
172f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
17300 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
17310 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65  ne is called, we
17320 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f   code an OP_Goto
17330 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75   that.** will ju
17340 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  mp to a subrouti
17350 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ne at the end of
17360 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54   the program.  T
17370 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64  hen we.** record
17380 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20   every database 
17390 74 68 61 74 20 6e 65 65 64 73 20 69 74 73 20 73  that needs its s
173a0 63 68 65 6d 61 20 76 65 72 69 66 69 65 64 20 69  chema verified i
173b0 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d  n the.** pParse-
173c0 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c  >cookieMask fiel
173d0 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72  d.  Later, after
173e0 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20   all other code 
173f0 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65  has been.** gene
17400 72 61 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f  rated, the subro
17410 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20  utine that does 
17420 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
17430 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  ications and.** 
17440 73 74 61 72 74 73 20 74 68 65 20 74 72 61 6e 73  starts the trans
17450 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20  actions will be 
17460 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50  coded and the OP
17470 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a  _Goto P2 value.*
17480 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  * will be made t
17490 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20  o point to that 
174a0 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  subroutine.  The
174b0 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74   generation of t
174c0 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72  he.** cookie ver
174d0 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75  ification subrou
174e0 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e  tine code happen
174f0 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69  s in sqlite3Fini
17500 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a  shCoding()..**.*
17510 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20  * If iDb<0 then 
17520 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f  code the OP_Goto
17530 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65   only - don't se
17540 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79  t flag to verify
17550 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f   the.** schema o
17560 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e  n any databases.
17570 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
17580 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74  ed to position t
17590 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61  he OP_Goto.** ea
175a0 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c  rly in the code,
175b0 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20   before we know 
175c0 69 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  if any database 
175d0 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75  tables will be u
175e0 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
175f0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
17600 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
17610 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
17620 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
17630 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61  dbe *v;.  int ma
17640 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  sk;..  v = sqlit
17650 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
17660 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
17670 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73  return;  /* This
17680 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66   only happens if
17690 20 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69   there was a pri
176a0 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62  or error */.  db
176b0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
176c0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f   if( pParse->coo
176d0 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20  kieGoto==0 ){.  
176e0 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
176f0 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64  Goto = sqlite3Vd
17700 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
17710 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d  to, 0, 0)+1;.  }
17720 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b  .  if( iDb>=0 ){
17730 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
17740 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  <db->nDb );.    
17750 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
17760 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69  iDb].pBt!=0 || i
17770 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  Db==1 );.    ass
17780 65 72 74 28 20 69 44 62 3c 33 32 20 29 3b 0a 20  ert( iDb<32 );. 
17790 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62     mask = 1<<iDb
177a0 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 72 73  ;.    if( (pPars
177b0 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20  e->cookieMask & 
177c0 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
177d0 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
177e0 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
177f0 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
17800 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64  ieValue[iDb] = d
17810 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
17820 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  ema->schema_cook
17830 69 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  ie;.      if( !O
17840 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
17850 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
17860 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
17870 61 74 61 62 61 73 65 28 70 50 61 72 73 65 29 3b  atabase(pParse);
17880 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17890 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
178a0 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
178b0 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72  hat prepares for
178c0 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74   doing an operat
178d0 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  ion that.** migh
178e0 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74  t change the dat
178f0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abase..**.** Thi
17900 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
17910 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
17920 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  on if we are not
17930 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a   already within.
17940 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
17950 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72  .  If we are alr
17960 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72  eady within a tr
17970 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
17980 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  a checkpoint.** 
17990 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65  is set if the se
179a0 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d  tStatement param
179b0 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41  eter is true.  A
179c0 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
179d0 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72  ld.** be set for
179e0 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74   operations that
179f0 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65   might fail (due
17a00 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   to a constraint
17a10 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  ) part of.** the
17a20 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64   way through and
17a30 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64   which will need
17a40 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72   to undo some wr
17a50 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76  ites without hav
17a60 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61  ing to.** rollba
17a70 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  ck the whole tra
17a80 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f  nsaction.  For o
17a90 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20  perations where 
17aa0 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
17ab0 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65  ** can be checke
17ac0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  d before any cha
17ad0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
17ae0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
17af0 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65  t is never.** ne
17b00 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
17b10 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20  a write and the 
17b20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
17b30 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a  d not be set..**
17b40 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73  .** Only databas
17b50 65 20 69 44 62 20 61 6e 64 20 74 68 65 20 74 65  e iDb and the te
17b60 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20  mp database are 
17b70 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 62 79  made writable by
17b80 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49   this call..** I
17b90 66 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74  f iDb==0, then t
17ba0 68 65 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70  he main and temp
17bb0 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 6d   databases are m
17bc0 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20  ade writable.   
17bd0 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65  If.** iDb==1 the
17be0 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20  n only the temp 
17bf0 64 61 74 61 62 61 73 65 20 69 73 20 6d 61 64 65  database is made
17c00 20 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69   writable.  If i
17c10 44 62 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a  Db>1 then the.**
17c20 20 73 70 65 63 69 66 69 65 64 20 61 75 78 69 6c   specified auxil
17c30 69 61 72 79 20 64 61 74 61 62 61 73 65 20 61 6e  iary database an
17c40 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  d the temp datab
17c50 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69  ase are made wri
17c60 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
17c70 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
17c80 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
17c90 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74  *pParse, int set
17ca0 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69  Statement, int i
17cb0 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
17cc0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
17cd0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
17ce0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
17cf0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
17d00 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
17d10 69 44 62 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  iDb);.  pParse->
17d20 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c  writeMask |= 1<<
17d30 69 44 62 3b 0a 20 20 69 66 28 20 73 65 74 53 74  iDb;.  if( setSt
17d40 61 74 65 6d 65 6e 74 20 26 26 20 70 50 61 72 73  atement && pPars
17d50 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a  e->nested==0 ){.
17d60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17d70 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74 65  ddOp(v, OP_State
17d80 6d 65 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20  ment, iDb, 0);. 
17d90 20 7d 0a 20 20 69 66 28 20 28 4f 4d 49 54 5f 54   }.  if( (OMIT_T
17da0 45 4d 50 44 42 20 7c 7c 20 69 44 62 21 3d 31 29  EMPDB || iDb!=1)
17db0 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   && pParse->db->
17dc0 61 44 62 5b 31 5d 2e 70 42 74 21 3d 30 20 29 7b  aDb[1].pBt!=0 ){
17dd0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
17de0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
17df0 70 50 61 72 73 65 2c 20 73 65 74 53 74 61 74 65  pParse, setState
17e00 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a  ment, 1);.  }.}.
17e10 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
17e20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73  see if pIndex us
17e30 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  es the collating
17e40 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
17e50 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
17e60 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
17e70 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73  false if it does
17e80 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   not..*/.#ifndef
17e90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
17ea0 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20  NDEX.static int 
17eb0 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63  collationMatch(c
17ec0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
17ed0 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29  , Index *pIndex)
17ee0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
17ef0 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e  (i=0; i<pIndex->
17f00 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
17f10 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
17f20 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
17f30 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 3d  l[i];.    if( z=
17f40 3d 7a 43 6f 6c 6c 20 7c 7c 20 28 7a 20 26 26 20  =zColl || (z && 
17f50 7a 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69  zColl && 0==sqli
17f60 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43  te3StrICmp(z, zC
17f70 6f 6c 6c 29 29 20 29 7b 0a 20 20 20 20 20 20 72  oll)) ){.      r
17f80 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
17f90 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
17fa0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
17fb0 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
17fc0 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61  ices of pTab tha
17fd0 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  t use the collat
17fe0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
17ff0 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d  ll..** If pColl=
18000 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
18010 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
18020 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65   pTab..*/.#ifnde
18030 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
18040 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69  INDEX.static voi
18050 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50  d reindexTable(P
18060 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
18070 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20  ble *pTab, char 
18080 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20  const *zColl){. 
18090 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
180a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
180b0 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
180c0 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
180d0 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70  ..  for(pIndex=p
180e0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  Tab->pIndex; pIn
180f0 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64  dex; pIndex=pInd
18100 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ex->pNext){.    
18110 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20  if( zColl==0 || 
18120 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a  collationMatch(z
18130 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b  Coll, pIndex) ){
18140 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
18150 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
18160 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
18170 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
18180 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
18190 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
181a0 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
181b0 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
181c0 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
181d0 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29  rse, pIndex, -1)
181e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
181f0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  ndif../*.** Reco
18200 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
18210 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  s of all tables 
18220 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  in all databases
18230 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e   where the.** in
18240 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63 6f  dices use the co
18250 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
18260 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c   pColl.  If pCol
18270 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
18280 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63  ute.** all indic
18290 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a  es everywhere..*
182a0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
182b0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
182c0 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65  atic void reinde
182d0 78 44 61 74 61 62 61 73 65 73 28 50 61 72 73 65  xDatabases(Parse
182e0 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 63   *pParse, char c
182f0 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20  onst *zColl){.  
18300 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
18310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
18320 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
18330 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
18340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18350 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
18360 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
18370 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
18380 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
18390 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
183a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
183b0 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20  HashElem *k;    
183c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
183d0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
183e0 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f  tables in pDb */
183f0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
18400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18410 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
18420 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20   database */..  
18430 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64  for(iDb=0, pDb=d
18440 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e  b->aDb; iDb<db->
18450 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b  nDb; iDb++, pDb+
18460 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 44 62 3d  +){.    if( pDb=
18470 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
18480 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48     for(k=sqliteH
18490 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70  ashFirst(&pDb->p
184a0 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
184b0 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61  ;  k; k=sqliteHa
184c0 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20  shNext(k)){.    
184d0 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a    pTab = (Table*
184e0 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
184f0 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65  k);.      reinde
18500 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
18510 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  Tab, zColl);.   
18520 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
18530 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
18540 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45 49  code for the REI
18550 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
18560 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
18570 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EX              
18580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
18590 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   1.**        REI
185a0 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e  NDEX  <collation
185b0 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >               
185c0 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 2.**        R
185d0 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
185e0 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e  se>.?<tablename>
185f0 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20    -- 3.**       
18600 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
18610 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d  base>.?<indexnam
18620 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46  e>  -- 4.**.** F
18630 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c  orm 1 causes all
18640 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
18650 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
18660 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74  es to be rebuilt
18670 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75  ..** Form 2 rebu
18680 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  ilds all indices
18690 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
186a0 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e  s that use the n
186b0 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e  amed.** collatin
186c0 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72  g function.  For
186d0 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75 69  ms 3 and 4 rebui
186e0 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  ld the named ind
186f0 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64  ex or all.** ind
18700 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
18710 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74  with the named t
18720 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
18730 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
18740 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65  NDEX.void sqlite
18750 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a  3Reindex(Parse *
18760 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
18770 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Name1, Token *pN
18780 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ame2){.  CollSeq
18790 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *pColl;        
187a0 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
187b0 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65  g sequence to be
187c0 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e   reindexed, or N
187d0 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ULL */.  char *z
187e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
187f0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
18800 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
18810 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
18820 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20   *zDb;          
18830 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
18840 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54   database */.  T
18850 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
18860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
18870 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
18880 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78  abase */.  Index
18890 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
188a0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
188b0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
188c0 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  th pTab */.  int
188d0 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
188e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
188f0 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
18900 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
18910 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
18920 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
18930 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
18940 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f  n */.  Token *pO
18950 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  bjName;         
18960 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
18970 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
18980 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
18990 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   */..  /* Read t
189a0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
189b0 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ma. If an error 
189c0 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
189d0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
189e0 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20   ** and code in 
189f0 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
18a00 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28  n NULL. */.  if(
18a10 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
18a20 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
18a30 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74  arse) ){.    ret
18a40 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  urn;.  }..  if( 
18a50 70 4e 61 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e 61  pName1==0 || pNa
18a60 6d 65 31 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  me1->z==0 ){.   
18a70 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
18a80 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20  s(pParse, 0);.  
18a90 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73    return;.  }els
18aa0 65 20 69 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20  e if( pName2==0 
18ab0 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20  || pName2->z==0 
18ac0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
18ad0 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20  Name1->z );.    
18ae0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
18af0 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
18b00 4e 43 28 64 62 29 2c 20 28 63 68 61 72 2a 29 70  NC(db), (char*)p
18b10 4e 61 6d 65 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31  Name1->z, pName1
18b20 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ->n, 0);.    if(
18b30 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
18b40 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 73 71  char *zColl = sq
18b50 6c 69 74 65 53 74 72 4e 44 75 70 28 28 63 6f 6e  liteStrNDup((con
18b60 73 74 20 63 68 61 72 20 2a 29 70 4e 61 6d 65 31  st char *)pName1
18b70 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d 3e 6e 29 3b  ->z, pName1->n);
18b80 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c  .      if( zColl
18b90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 69 6e   ){.        rein
18ba0 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
18bb0 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  rse, zColl);.   
18bc0 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
18bd0 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  zColl);.      }.
18be0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
18bf0 20 20 7d 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20    }.  }.  iDb = 
18c00 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
18c10 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
18c20 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a  1, pName2, &pObj
18c30 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62  Name);.  if( iDb
18c40 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  <0 ) return;.  z
18c50 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
18c60 6f 6d 54 6f 6b 65 6e 28 70 4f 62 6a 4e 61 6d 65  omToken(pObjName
18c70 29 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61  );.  zDb = db->a
18c80 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
18c90 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
18ca0 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20  indTable(db, z, 
18cb0 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62  zDb);.  if( pTab
18cc0 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54   ){.    reindexT
18cd0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
18ce0 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
18cf0 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 72 65  eFree(z);.    re
18d00 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  turn;.  }.  pInd
18d10 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
18d20 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62  Index(db, z, zDb
18d30 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
18d40 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  z);.  if( pIndex
18d50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
18d60 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
18d70 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
18d80 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  b);.    sqlite3R
18d90 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
18da0 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
18db0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
18dc0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
18dd0 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
18de0 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68  e to identify th
18df0 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72  e object to be r
18e00 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65  eindexed");.}.#e
18e10 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
18e20 72 6e 20 61 20 64 79 6e 61 6d 69 63 6c 79 20 61  rn a dynamicly a
18e30 6c 6c 6f 63 61 74 65 64 20 4b 65 79 49 6e 66 6f  llocated KeyInfo
18e40 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
18e50 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 77  can be used.** w
18e60 69 74 68 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20  ith OP_OpenRead 
18e70 6f 72 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20  or OP_OpenWrite 
18e80 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 62 61  to access databa
18e90 73 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  se index pIdx..*
18ea0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
18eb0 75 6c 2c 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ul, a pointer to
18ec0 20 74 68 65 20 6e 65 77 20 73 74 72 75 63 74 75   the new structu
18ed0 72 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  re is returned. 
18ee0 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
18ef0 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  the caller is re
18f00 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
18f10 6c 6c 69 6e 67 20 73 71 6c 69 74 65 46 72 65 65  lling sqliteFree
18f20 28 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e  () on the return
18f30 65 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 20  ed .** pointer. 
18f40 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
18f50 72 73 20 28 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  rs (out of memor
18f60 79 20 6f 72 20 6d 69 73 73 69 6e 67 20 63 6f 6c  y or missing col
18f70 6c 61 74 69 6f 6e 20 0a 2a 2a 20 73 65 71 75 65  lation .** seque
18f80 6e 63 65 29 2c 20 4e 55 4c 4c 20 69 73 20 72 65  nce), NULL is re
18f90 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73  turned and the s
18fa0 74 61 74 65 20 6f 66 20 70 50 61 72 73 65 20 75  tate of pParse u
18fb0 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63  pdated to reflec
18fc0 74 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 0a  t.** the error..
18fd0 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
18fe0 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
18ff0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
19000 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69  ndex *pIdx){.  i
19010 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  nt i;.  int nCol
19020 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   = pIdx->nColumn
19030 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 20 3d  ;.  int nBytes =
19040 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29   sizeof(KeyInfo)
19050 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65   + (nCol-1)*size
19060 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 6e  of(CollSeq*) + n
19070 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  Col;.  KeyInfo *
19080 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f 20  pKey = (KeyInfo 
19090 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e  *)sqliteMalloc(n
190a0 42 79 74 65 73 29 3b 0a 0a 20 20 69 66 28 20 70  Bytes);..  if( p
190b0 4b 65 79 20 29 7b 0a 20 20 20 20 70 4b 65 79 2d  Key ){.    pKey-
190c0 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
190d0 38 20 2a 29 26 28 70 4b 65 79 2d 3e 61 43 6f 6c  8 *)&(pKey->aCol
190e0 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20 61 73  l[nCol]);.    as
190f0 73 65 72 74 28 20 26 70 4b 65 79 2d 3e 61 53 6f  sert( &pKey->aSo
19100 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 3d 3d 26  rtOrder[nCol]==&
19110 28 28 28 75 38 20 2a 29 70 4b 65 79 29 5b 6e 42  (((u8 *)pKey)[nB
19120 79 74 65 73 5d 29 20 29 3b 0a 20 20 20 20 66 6f  ytes]) );.    fo
19130 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
19140 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ++){.      char 
19150 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61  *zColl = pIdx->a
19160 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zColl[i];.      
19170 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 20 29 3b  assert( zColl );
19180 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f  .      pKey->aCo
19190 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 4c  ll[i] = sqlite3L
191a0 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
191b0 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 3b  rse, zColl, -1);
191c0 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f  .      pKey->aSo
191d0 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64  rtOrder[i] = pId
191e0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
191f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79  ;.    }.    pKey
19200 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b  ->nField = nCol;
19210 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72  .  }..  if( pPar
19220 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
19230 73 71 6c 69 74 65 46 72 65 65 28 70 4b 65 79 29  sqliteFree(pKey)
19240 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a  ;.    pKey = 0;.
19250 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65    }.  return pKe
19260 79 3b 0a 7d 0a                                   y;.}.