/ Hex Artifact Content
Login

Artifact 98b458e30906461777ff1e003eef2db14c37314f:


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 39 30 20 32 30 30 36 2f 30 33 2f 30 36  1.390 2006/03/06
02f0: 20 32 30 3a 35 35 3a 34 36 20 64 72 68 20 45 78   20:55:46 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: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
0e20: 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
0e30: 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20 73 6f  by generating so
0e40: 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  me termination c
0e50: 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ode at the end o
0e60: 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62 65 20  f the.  ** vdbe 
0e70: 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20 20 64  program.  */.  d
0e80: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
0e90: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
0ea0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0eb0: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
0ec0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
0ed0: 20 4f 50 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b   OP_Halt, 0, 0);
0ee0: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f  ..    /* The coo
0ef0: 6b 69 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e  kie mask contain
0f00: 73 20 6f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  s one bit for ea
0f10: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
0f20: 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42   open..    ** (B
0f30: 69 74 20 30 20 69 73 20 66 6f 72 20 6d 61 69 6e  it 0 is for main
0f40: 2c 20 62 69 74 20 31 20 69 73 20 66 6f 72 20 74  , bit 1 is for t
0f50: 65 6d 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  emp, and so fort
0f60: 68 2e 29 20 20 42 69 74 73 20 61 72 65 0a 20 20  h.)  Bits are.  
0f70: 20 20 2a 2a 20 73 65 74 20 66 6f 72 20 65 61 63    ** set for eac
0f80: 68 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  h database that 
0f90: 69 73 20 75 73 65 64 2e 20 20 47 65 6e 65 72 61  is used.  Genera
0fa0: 74 65 20 63 6f 64 65 20 74 6f 20 73 74 61 72 74  te code to start
0fb0: 20 61 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61   a.    ** transa
0fc0: 63 74 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73  ction on each us
0fd0: 65 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ed database and 
0fe0: 74 6f 20 76 65 72 69 66 79 20 74 68 65 20 73 63  to verify the sc
0ff0: 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20  hema cookie.    
1000: 2a 2a 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20  ** on each used 
1010: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
1020: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
1030: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3e 30 20 29 7b  >cookieGoto>0 ){
1040: 0a 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b  .      u32 mask;
1050: 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a  .      int iDb;.
1060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1070: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 50 61  eJumpHere(v, pPa
1080: 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d  rse->cookieGoto-
1090: 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44  1);.      for(iD
10a0: 62 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62  b=0, mask=1; iDb
10b0: 3c 64 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c  <db->nDb; mask<<
10c0: 3d 31 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20  =1, iDb++){.    
10d0: 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20      if( (mask & 
10e0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
10f0: 73 6b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  sk)==0 ) continu
1100: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
1110: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1120: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
1130: 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72  Db, (mask & pPar
1140: 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d  se->writeMask)!=
1150: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
1160: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1170: 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c  OP_VerifyCookie,
1180: 20 69 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f   iDb, pParse->co
1190: 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b  okieValue[iDb]);
11a0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
11b0: 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20  /* Once all the 
11c0: 63 6f 6f 6b 69 65 73 20 68 61 76 65 20 62 65 65  cookies have bee
11d0: 6e 20 76 65 72 69 66 69 65 64 20 61 6e 64 20 74  n verified and t
11e0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e  ransactions open
11f0: 65 64 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62  ed, .      ** ob
1200: 74 61 69 6e 20 74 68 65 20 72 65 71 75 69 72 65  tain the require
1210: 64 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54  d table-locks. T
1220: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75  his is a no-op u
1230: 6e 6c 65 73 73 20 74 68 65 20 0a 20 20 20 20 20  nless the .     
1240: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
1250: 20 66 65 61 74 75 72 65 20 69 73 20 65 6e 61 62   feature is enab
1260: 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  led..      */.  
1270: 20 20 20 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63      codeTableLoc
1280: 6b 73 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ks(pParse);.    
1290: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12a0: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
12b0: 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  , pParse->cookie
12c0: 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  Goto);.    }..#i
12d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12e0: 54 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 41  T_TRACE.    /* A
12f0: 64 64 20 61 20 4e 6f 2d 6f 70 20 74 68 61 74 20  dd a No-op that 
1300: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6d  contains the com
1310: 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
1320: 65 20 63 6f 6d 70 69 6c 65 64 20 53 51 4c 0a 20  e compiled SQL. 
1330: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
1340: 61 73 20 69 74 73 20 50 33 20 61 72 67 75 6d 65  as its P3 argume
1350: 6e 74 2e 20 20 54 68 69 73 20 64 6f 65 73 20 6e  nt.  This does n
1360: 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 66 75  ot change the fu
1370: 6e 63 74 69 6f 6e 61 6c 69 74 79 0a 20 20 20 20  nctionality.    
1380: 2a 2a 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  ** of the progra
1390: 6d 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  m. .    **.    *
13a0: 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74  * This is used t
13b0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69  o implement sqli
13c0: 74 65 33 5f 74 72 61 63 65 28 29 2e 0a 20 20 20  te3_trace()..   
13d0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
13e0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 6f  dbeOp3(v, OP_Noo
13f0: 70 2c 20 30 2c 20 30 2c 20 70 50 61 72 73 65 2d  p, 0, 0, pParse-
1400: 3e 7a 53 71 6c 2c 20 70 50 61 72 73 65 2d 3e 7a  >zSql, pParse->z
1410: 54 61 69 6c 2d 70 50 61 72 73 65 2d 3e 7a 53 71  Tail-pParse->zSq
1420: 6c 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  l);.#endif /* SQ
1430: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
1440: 2a 2f 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65  */.  }...  /* Ge
1450: 74 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  t the VDBE progr
1460: 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65 78 65  am ready for exe
1470: 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66  cution.  */.  if
1480: 28 20 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ( v && pParse->n
1490: 45 72 72 3d 3d 30 20 26 26 20 21 73 71 6c 69 74  Err==0 && !sqlit
14a0: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
14b0: 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74 72   ){.    FILE *tr
14c0: 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  ace = (db->flags
14d0: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72   & SQLITE_VdbeTr
14e0: 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74  ace)!=0 ? stdout
14f0: 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   : 0;.    sqlite
1500: 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74 72  3VdbeTrace(v, tr
1510: 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ace);.    sqlite
1520: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76  3VdbeMakeReady(v
1530: 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  , pParse->nVar, 
1540: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 33 2c 0a  pParse->nMem+3,.
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
1570: 3e 6e 54 61 62 2b 33 2c 20 70 50 61 72 73 65 2d  >nTab+3, pParse-
1580: 3e 65 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70  >explain);.    p
1590: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
15a0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61  TE_DONE;.    pPa
15b0: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
15c0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
15d0: 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51  ( pParse->rc==SQ
15e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
15f0: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1600: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
1610: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30  pParse->nTab = 0
1620: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
1630: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
1640: 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72  nSet = 0;.  pPar
1650: 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20  se->nVar = 0;.  
1660: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1670: 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  sk = 0;.  pParse
1680: 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30  ->cookieGoto = 0
1690: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74  ;.}../*.** Run t
16a0: 68 65 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f  he parser and co
16b0: 64 65 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63  de generator rec
16c0: 75 72 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65  ursively in orde
16d0: 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a  r to generate.**
16e0: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51   code for the SQ
16f0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65  L statement give
1700: 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  n onto the end o
1710: 66 20 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e  f the pParse con
1720: 74 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  text.** currentl
1730: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
1740: 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20  tion.  When the 
1750: 70 61 72 73 65 72 20 69 73 20 72 75 6e 20 72 65  parser is run re
1760: 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69  cursively.** thi
1770: 73 20 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c  s way, the final
1780: 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20   OP_Halt is not 
1790: 61 70 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68  appended and oth
17a0: 65 72 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  er initializatio
17b0: 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a  n.** and finaliz
17c0: 61 74 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20  ation steps are 
17d0: 6f 6d 69 74 74 65 64 20 62 65 63 61 75 73 65 20  omitted because 
17e0: 74 68 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69  those are handli
17f0: 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74  ng by the.** out
1800: 65 72 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a  ermost parser..*
1810: 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68  *.** Not everyth
1820: 69 6e 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e  ing is nestable.
1830: 20 20 54 68 69 73 20 66 61 63 69 6c 69 74 79 20    This facility 
1840: 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70  is designed to p
1850: 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c  ermit.** INSERT,
1860: 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c   UPDATE, and DEL
1870: 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ETE operations a
1880: 67 61 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41  gainst SQLITE_MA
1890: 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61  STER.  Use.** ca
18a0: 72 65 20 69 66 20 79 6f 75 20 64 65 63 69 64 65  re if you decide
18b0: 20 74 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74   to try to use t
18c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  his routine for 
18d0: 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
18e0: 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ses..*/.void sql
18f0: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
1900: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
1910: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
1920: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
1930: 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a  ist ap;.  char *
1940: 7a 53 71 6c 3b 0a 23 20 64 65 66 69 6e 65 20 53  zSql;.# define S
1950: 41 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28  AVE_SZ  (sizeof(
1960: 50 61 72 73 65 29 20 2d 20 6f 66 66 73 65 74 6f  Parse) - offseto
1970: 66 28 50 61 72 73 65 2c 6e 56 61 72 29 29 0a 20  f(Parse,nVar)). 
1980: 20 63 68 61 72 20 73 61 76 65 42 75 66 5b 53 41   char saveBuf[SA
1990: 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70  VE_SZ];..  if( p
19a0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
19b0: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
19c0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31  pParse->nested<1
19d0: 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67  0 );  /* Nesting
19e0: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
19f0: 6f 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74 68  of limited depth
1a00: 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28 61   */.  va_start(a
1a10: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a  p, zFormat);.  z
1a20: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  Sql = sqlite3VMP
1a30: 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61  rintf(zFormat, a
1a40: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
1a50: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
1a60: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20  ){.    return;  
1a70: 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73   /* A malloc mus
1a80: 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f  t have failed */
1a90: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
1aa0: 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70  ested++;.  memcp
1ab0: 79 28 73 61 76 65 42 75 66 2c 20 26 70 50 61 72  y(saveBuf, &pPar
1ac0: 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53  se->nVar, SAVE_S
1ad0: 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 50  Z);.  memset(&pP
1ae0: 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53  arse->nVar, 0, S
1af0: 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74  AVE_SZ);.  sqlit
1b00: 65 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72  e3RunParser(pPar
1b10: 73 65 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20  se, zSql, 0);.  
1b20: 73 71 6c 69 74 65 46 72 65 65 28 7a 53 71 6c 29  sqliteFree(zSql)
1b30: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 72  ;.  memcpy(&pPar
1b40: 73 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42 75  se->nVar, saveBu
1b50: 66 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70  f, SAVE_SZ);.  p
1b60: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b  Parse->nested--;
1b70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
1b80: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
1b90: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
1ba0: 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63  scribes a partic
1bb0: 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a  ular database.**
1bc0: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65   table given the
1bd0: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61   name of that ta
1be0: 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61  ble and (optiona
1bf0: 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66  lly) the name of
1c00: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
1c10: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1c20: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e  table.  Return N
1c30: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
1c40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61  ..**.** If zData
1c50: 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64  base is 0, all d
1c60: 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61  atabases are sea
1c70: 72 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61  rched for the ta
1c80: 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66  ble and the.** f
1c90: 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61  irst matching ta
1ca0: 62 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ble is returned.
1cb0: 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66    (No checking f
1cc0: 6f 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62  or duplicate tab
1cd0: 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64  le.** names is d
1ce0: 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63  one.)  The searc
1cf0: 68 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20  h order is TEMP 
1d00: 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e  first, then MAIN
1d10: 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75  , then any.** au
1d20: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
1d30: 73 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68  s added using th
1d40: 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64  e ATTACH command
1d50: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
1d60: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
1d70: 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ble()..*/.Table 
1d80: 2a 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c  *sqlite3FindTabl
1d90: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
1da0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1db0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
1dc0: 61 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c  atabase){.  Tabl
1dd0: 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *p = 0;.  int 
1de0: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 4e 61  i;.  assert( zNa
1df0: 6d 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  me!=0 );.  for(i
1e00: 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c  =OMIT_TEMPDB; i<
1e10: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
1e20: 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29     int j = (i<2)
1e30: 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a   ? i^1 : i;   /*
1e40: 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66   Search TEMP bef
1e50: 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20  ore MAIN */.    
1e60: 69 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30  if( zDatabase!=0
1e70: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
1e80: 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62  mp(zDatabase, db
1e90: 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20  ->aDb[j].zName) 
1ea0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1eb0: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  p = sqlite3HashF
1ec0: 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e  ind(&db->aDb[j].
1ed0: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
1ee0: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
1ef0: 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69  zName)+1);.    i
1f00: 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20  f( p ) break;.  
1f10: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
1f20: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
1f30: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
1f40: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
1f50: 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61  ibes a particula
1f60: 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61  r database.** ta
1f70: 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61  ble given the na
1f80: 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65  me of that table
1f90: 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79   and (optionally
1fa0: 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  ) the name of th
1fb0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
1fc0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
1fd0: 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  le.  Return NULL
1fe0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20   if not found.  
1ff0: 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a  Also leave an.**
2000: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
2010: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
2020: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  g..**.** The dif
2030: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
2040: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
2050: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
2060: 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73  e() is that this
2070: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76  .** routine leav
2080: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
2090: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
20a0: 45 72 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20  ErrMsg where.** 
20b0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
20c0: 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a  () does not..*/.
20d0: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f  Table *sqlite3Lo
20e0: 63 61 74 65 54 61 62 6c 65 28 50 61 72 73 65 20  cateTable(Parse 
20f0: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
2100: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
2110: 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65 29 7b  t char *zDbase){
2120: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20  .  Table *p;..  
2130: 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
2140: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
2150: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2160: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
2170: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
2180: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
2190: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
21a0: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
21b0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
21c0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
21d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
21e0: 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74    }..  p = sqlit
21f0: 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
2200: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  se->db, zName, z
2210: 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  Dbase);.  if( p=
2220: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 44  =0 ){.    if( zD
2230: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71  base ){.      sq
2240: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2250: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
2260: 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a 44  able: %s.%s", zD
2270: 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  base, zName);.  
2280: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2290: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
22a0: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
22b0: 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 4e 61 6d  table: %s", zNam
22c0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  e);.    }.    pP
22d0: 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
22e0: 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  a = 1;.  }.  ret
22f0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
2300: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
2310: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
2320: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a  hat describes .*
2330: 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  * a particular i
2340: 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e  ndex given the n
2350: 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65  ame of that inde
2360: 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d  x.** and the nam
2370: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2380: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
2390: 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65  the index..** Re
23a0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
23b0: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
23c0: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
23d0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
23e0: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
23f0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64  the.** table and
2400: 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
2410: 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65 74  ing index is ret
2420: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
2430: 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c  king.** for dupl
2440: 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65  icate index name
2450: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
2460: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
2470: 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20  .** TEMP first, 
2480: 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20  then MAIN, then 
2490: 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61  any auxiliary da
24a0: 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a  tabases added.**
24b0: 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43   using the ATTAC
24c0: 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e  H command..*/.In
24d0: 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  dex *sqlite3Find
24e0: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
24f0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
2500: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
2510: 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20   *zDb){.  Index 
2520: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  *p = 0;.  int i;
2530: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
2540: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
2550: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
2560: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
2570: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
2580: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
2590: 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  */.    Schema *p
25a0: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
25b0: 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [j].pSchema;.   
25c0: 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69   if( zDb && sqli
25d0: 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20  te3StrICmp(zDb, 
25e0: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65  db->aDb[j].zName
25f0: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2600: 20 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d    assert( pSchem
2610: 61 20 7c 7c 20 28 6a 3d 3d 31 20 26 26 20 21 64  a || (j==1 && !d
2620: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29  b->aDb[1].pBt) )
2630: 3b 0a 20 20 20 20 69 66 28 20 70 53 63 68 65 6d  ;.    if( pSchem
2640: 61 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 73  a ){.      p = s
2650: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
2660: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
2670: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
2680: 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 7d  zName)+1);.    }
2690: 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65  .    if( p ) bre
26a0: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
26b0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63   p;.}../*.** Rec
26c0: 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20  laim the memory 
26d0: 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78  used by an index
26e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26f0: 66 72 65 65 49 6e 64 65 78 28 49 6e 64 65 78 20  freeIndex(Index 
2700: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65  *p){.  sqliteFre
2710: 65 28 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  e(p->zColAff);. 
2720: 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a   sqliteFree(p);.
2730: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
2740: 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20  the given index 
2750: 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68  from the index h
2760: 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20 66  ash table, and f
2770: 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f 72  ree.** its memor
2780: 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a  y structures..**
2790: 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69 73  .** The index is
27a0: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
27b0: 65 20 64 61 74 61 62 61 73 65 20 68 61 73 68 20  e database hash 
27c0: 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69 74  tables but.** it
27d0: 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64   is not unlinked
27e0: 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20   from the Table 
27f0: 74 68 61 74 20 69 74 20 69 6e 64 65 78 65 73 2e  that it indexes.
2800: 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72  .** Unlinking fr
2810: 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75 73  om the Table mus
2820: 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68 65  t be done by the
2830: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2840: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
2850: 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e  d sqliteDeleteIn
2860: 64 65 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20  dex(Index *p){. 
2870: 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 20 20   Index *pOld;.  
2880: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2890: 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20  e = p->zName;.. 
28a0: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48   pOld = sqlite3H
28b0: 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53  ashInsert(&p->pS
28c0: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
28d0: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 20 7a  zName, strlen( z
28e0: 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61  Name)+1, 0);.  a
28f0: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c  ssert( pOld==0 |
2900: 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66  | pOld==p );.  f
2910: 72 65 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a  reeIndex(p);.}..
2920: 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e  /*.** For the in
2930: 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e  dex called zIdxN
2940: 61 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f 75  ame which is fou
2950: 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  nd in the databa
2960: 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b  se iDb,.** unlik
2970: 65 20 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f  e that index fro
2980: 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e  m its Table then
2990: 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65   remove the inde
29a0: 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e  x from.** the in
29b0: 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 20 61  dex hash table a
29c0: 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  nd free all memo
29d0: 72 79 20 73 74 72 75 63 74 75 72 65 73 20 61 73  ry structures as
29e0: 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
29f0: 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76   the index..*/.v
2a00: 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e  oid sqlite3Unlin
2a10: 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28  kAndDeleteIndex(
2a20: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
2a30: 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   iDb, const char
2a40: 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49   *zIdxName){.  I
2a50: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
2a60: 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61 73 68 20  int len;.  Hash 
2a70: 2a 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44  *pHash = &db->aD
2a80: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
2a90: 69 64 78 48 61 73 68 3b 0a 0a 20 20 6c 65 6e 20  idxHash;..  len 
2aa0: 3d 20 73 74 72 6c 65 6e 28 7a 49 64 78 4e 61 6d  = strlen(zIdxNam
2ab0: 65 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73  e);.  pIndex = s
2ac0: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
2ad0: 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65  (pHash, zIdxName
2ae0: 2c 20 6c 65 6e 2b 31 2c 20 30 29 3b 0a 20 20 69  , len+1, 0);.  i
2af0: 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
2b00: 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61   if( pIndex->pTa
2b10: 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e  ble->pIndex==pIn
2b20: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  dex ){.      pIn
2b30: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
2b40: 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  dex = pIndex->pN
2b50: 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
2b60: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a        Index *p;.
2b70: 20 20 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64        for(p=pInd
2b80: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
2b90: 65 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78  ex; p && p->pNex
2ba0: 74 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e  t!=pIndex; p=p->
2bb0: 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 20 20 69  pNext){}.      i
2bc0: 66 28 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74  f( p && p->pNext
2bd0: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
2be0: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
2bf0: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
2c00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2c10: 66 72 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78  freeIndex(pIndex
2c20: 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61  );.  }.  db->fla
2c30: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
2c40: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
2c50: 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73  *.** Erase all s
2c60: 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f  chema informatio
2c70: 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65  n from the in-me
2c80: 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73  mory hash tables
2c90: 20 6f 66 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20   of.** a single 
2ca0: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
2cb0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2cc0: 64 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d  d to reclaim mem
2cd0: 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68  ory.** before th
2ce0: 65 20 64 61 74 61 62 61 73 65 20 63 6c 6f 73 65  e database close
2cf0: 73 2e 20 20 49 74 20 69 73 20 61 6c 73 6f 20 63  s.  It is also c
2d00: 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 61 20 72  alled during a r
2d10: 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68  ollback.** if th
2d20: 65 72 65 20 77 65 72 65 20 73 63 68 65 6d 61 20  ere were schema 
2d30: 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74  changes during t
2d40: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  he transaction o
2d50: 72 20 69 66 20 61 0a 2a 2a 20 73 63 68 65 6d 61  r if a.** schema
2d60: 2d 63 6f 6f 6b 69 65 20 6d 69 73 6d 61 74 63 68  -cookie mismatch
2d70: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   occurs..**.** I
2d80: 66 20 69 44 62 3c 3d 30 20 74 68 65 6e 20 72 65  f iDb<=0 then re
2d90: 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  set the internal
2da0: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20 66   schema tables f
2db0: 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a  or all database.
2dc0: 2a 2a 20 66 69 6c 65 73 2e 20 20 49 66 20 69 44  ** files.  If iD
2dd0: 62 3e 3d 32 20 74 68 65 6e 20 72 65 73 65 74 20  b>=2 then reset 
2de0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
2df0: 65 6d 61 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65  ema for only the
2e00: 0a 2a 2a 20 73 69 6e 67 6c 65 20 66 69 6c 65 20  .** single file 
2e10: 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f  indicated..*/.vo
2e20: 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 49  id sqlite3ResetI
2e30: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 73 71  nternalSchema(sq
2e40: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
2e50: 44 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  Db){.  int i, j;
2e60: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ..  assert( iDb>
2e70: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
2e80: 62 20 29 3b 0a 20 20 66 6f 72 28 69 3d 69 44 62  b );.  for(i=iDb
2e90: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
2ea0: 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d  ){.    Db *pDb =
2eb0: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
2ec0: 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
2ed0: 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ma ){.      sqli
2ee0: 74 65 33 53 63 68 65 6d 61 46 72 65 65 28 70 44  te3SchemaFree(pD
2ef0: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
2f00: 20 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e 30   }.    if( iDb>0
2f10: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20   ) return;.  }. 
2f20: 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20   assert( iDb==0 
2f30: 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  );.  db->flags &
2f40: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
2f50: 43 68 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20 49  Changes;..  /* I
2f60: 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  f one or more of
2f70: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
2f80: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61  atabase files ha
2f90: 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20  s been closed,. 
2fa0: 20 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20   ** then remove 
2fb0: 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 61 75  them from the au
2fc0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2fd0: 20 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20   list.  We take 
2fe0: 74 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75  the.  ** opportu
2ff0: 6e 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20  nity to do this 
3000: 68 65 72 65 20 73 69 6e 63 65 20 77 65 20 68 61  here since we ha
3010: 76 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20  ve just deleted 
3020: 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  all of the.  ** 
3030: 73 63 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c  schema hash tabl
3040: 65 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65  es and therefore
3050: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
3060: 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73  make any changes
3070: 0a 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20  .  ** to any of 
3080: 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20  those tables..  
3090: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
30a0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
30b0: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
30c0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
30d0: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
30e0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  t==0 ){.      if
30f0: 28 20 70 44 62 2d 3e 70 41 75 78 20 26 26 20 70  ( pDb->pAux && p
3100: 44 62 2d 3e 78 46 72 65 65 41 75 78 20 29 20 70  Db->xFreeAux ) p
3110: 44 62 2d 3e 78 46 72 65 65 41 75 78 28 70 44 62  Db->xFreeAux(pDb
3120: 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 70  ->pAux);.      p
3130: 44 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20  Db->pAux = 0;.  
3140: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
3150: 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  j=2; i<db->nDb; 
3160: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
3170: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
3180: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
3190: 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20  pDb->pBt==0 ){. 
31a0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
31b0: 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  pDb->zName);.   
31c0: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20     pDb->zName = 
31d0: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
31e0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
31f0: 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62   j<i ){.      db
3200: 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61  ->aDb[j] = db->a
3210: 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Db[i];.    }.   
3220: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73   j++;.  }.  mems
3230: 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20  et(&db->aDb[j], 
3240: 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73  0, (db->nDb-j)*s
3250: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d  izeof(db->aDb[j]
3260: 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20  ));.  db->nDb = 
3270: 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62  j;.  if( db->nDb
3280: 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d  <=2 && db->aDb!=
3290: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b  db->aDbStatic ){
32a0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e  .    memcpy(db->
32b0: 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61  aDbStatic, db->a
32c0: 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d  Db, 2*sizeof(db-
32d0: 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73  >aDb[0]));.    s
32e0: 71 6c 69 74 65 46 72 65 65 28 64 62 2d 3e 61 44  qliteFree(db->aD
32f0: 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20  b);.    db->aDb 
3300: 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b  = db->aDbStatic;
3310: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
3320: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
3330: 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 20  lled whenever a 
3340: 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e  rollback occurs.
3350: 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65 0a    If there were.
3360: 2a 2a 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ** schema change
3370: 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61  s during the tra
3380: 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 77  nsaction, then w
3390: 65 20 68 61 76 65 20 74 6f 20 72 65 73 65 74 20  e have to reset 
33a0: 74 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20  the.** internal 
33b0: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
33c0: 72 65 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f 6d  reload them from
33d0: 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73   disk..*/.void s
33e0: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 49 6e  qlite3RollbackIn
33f0: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
3400: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66  lite3 *db){.  if
3410: 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
3420: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
3430: 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  es ){.    sqlite
3440: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
3450: 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d  hema(db, 0);.  }
3460: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
3470: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
3480: 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f   when a commit o
3490: 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ccurs..*/.void s
34a0: 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65  qlite3CommitInte
34b0: 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69  rnalChanges(sqli
34c0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e  te3 *db){.  db->
34d0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
34e0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
34f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
3500: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
3510: 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 6f 72 20  from a table or 
3520: 76 69 65 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  view..*/.static 
3530: 76 6f 69 64 20 73 71 6c 69 74 65 52 65 73 65 74  void sqliteReset
3540: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c  ColumnNames(Tabl
3550: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e  e *pTable){.  in
3560: 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  t i;.  Column *p
3570: 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Col;.  assert( p
3580: 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66  Table!=0 );.  if
3590: 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65  ( (pCol = pTable
35a0: 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20  ->aCol)!=0 ){.  
35b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
35c0: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  ble->nCol; i++, 
35d0: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73  pCol++){.      s
35e0: 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e  qliteFree(pCol->
35f0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  zName);.      sq
3600: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3610: 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20  pCol->pDflt);.  
3620: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
3630: 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20  Col->zType);.   
3640: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43     sqliteFree(pC
3650: 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  ol->zColl);.    
3660: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
3670: 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a  (pTable->aCol);.
3680: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43    }.  pTable->aC
3690: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
36a0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f  ->nCol = 0;.}../
36b0: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
36c0: 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75  memory data stru
36d0: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
36e0: 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
36f0: 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63  .** Table.  No c
3700: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
3710: 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20  to disk by this 
3720: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
3730: 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
3740: 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74   deletes the dat
3750: 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74  a structure.  It
3760: 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b   does not unlink
3770: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61  .** the table da
3780: 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ta structure fro
3790: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
37a0: 2e 20 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72  .  Nor does it r
37b0: 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e  emove.** foreign
37c0: 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73   keys from the s
37d0: 71 6c 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68  qlite.aFKey hash
37e0: 20 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20   table.  But it 
37f0: 64 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20  does destroy.** 
3800: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
3810: 73 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73  s of the indices
3820: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
3830: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
3840: 68 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e  h .** the table.
3850: 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61  .**.** Indices a
3860: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
3870: 68 65 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c  he table are unl
3880: 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22  inked from the "
3890: 64 62 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75  db".** data stru
38a0: 63 74 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c  cture if db!=NUL
38b0: 4c 2e 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c  L.  If db==NULL,
38c0: 20 69 6e 64 69 63 65 73 20 61 74 74 61 63 68 65   indices attache
38d0: 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d to.** the tabl
38e0: 65 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62  e are deleted, b
38f0: 75 74 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  ut it is assumed
3900: 20 74 68 65 79 20 68 61 76 65 20 61 6c 72 65 61   they have alrea
3910: 64 79 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e  dy been.** unlin
3920: 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ked..*/.void sql
3930: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
3940: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
3950: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49  le *pTable){.  I
3960: 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70  ndex *pIndex, *p
3970: 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46  Next;.  FKey *pF
3980: 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b  Key, *pNextFKey;
3990: 0a 0a 20 20 64 62 20 3d 20 30 3b 0a 0a 20 20 69  ..  db = 0;..  i
39a0: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72  f( pTable==0 ) r
39b0: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 6f 20  eturn;..  /* Do 
39c0: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 74  not delete the t
39d0: 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72  able until the r
39e0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
39f0: 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a  eaches zero. */.
3a00: 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 2d 2d    pTable->nRef--
3a10: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  ;.  if( pTable->
3a20: 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 72 65  nRef>0 ){.    re
3a30: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
3a40: 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66  rt( pTable->nRef
3a50: 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c  ==0 );..  /* Del
3a60: 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ete all indices 
3a70: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
3a80: 74 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a  this table.  */.
3a90: 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70    for(pIndex = p
3aa0: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
3ab0: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e  Index; pIndex=pN
3ac0: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
3ad0: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
3ae0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
3af0: 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  dex->pSchema==pT
3b00: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29 3b  able->pSchema );
3b10: 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74  .    sqliteDelet
3b20: 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a  eIndex(pIndex);.
3b30: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
3b40: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
3b50: 5f 4b 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74 65  _KEY.  /* Delete
3b60: 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79   all foreign key
3b70: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
3b80: 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20 54  h this table.  T
3b90: 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f  he keys.  ** sho
3ba0: 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
3bb0: 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66   been unlinked f
3bc0: 72 6f 6d 20 74 68 65 20 64 62 2d 3e 61 46 4b 65  rom the db->aFKe
3bd0: 79 20 68 61 73 68 20 74 61 62 6c 65 20 0a 20 20  y hash table .  
3be0: 2a 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d 70  */.  for(pFKey=p
3bf0: 54 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46  Table->pFKey; pF
3c00: 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74  Key; pFKey=pNext
3c10: 46 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65 78 74  FKey){.    pNext
3c20: 46 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e  FKey = pFKey->pN
3c30: 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73  extFrom;.    ass
3c40: 65 72 74 28 20 73 71 6c 69 74 65 33 48 61 73 68  ert( sqlite3Hash
3c50: 46 69 6e 64 28 26 70 54 61 62 6c 65 2d 3e 70 53  Find(&pTable->pS
3c60: 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 0a 20 20  chema->aFKey,.  
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c80: 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e           pFKey->
3c90: 7a 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65  zTo, strlen(pFKe
3ca0: 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65  y->zTo)+1)!=pFKe
3cb0: 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  y );.    sqliteF
3cc0: 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a  ree(pFKey);.  }.
3cd0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c  #endif..  /* Del
3ce0: 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74  ete the Table st
3cf0: 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a  ructure itself..
3d00: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 52 65 73    */.  sqliteRes
3d10: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54  etColumnNames(pT
3d20: 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  able);.  sqliteF
3d30: 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  ree(pTable->zNam
3d40: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
3d50: 28 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66  (pTable->zColAff
3d60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
3d70: 63 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65 2d  ctDelete(pTable-
3d80: 3e 70 53 65 6c 65 63 74 29 3b 0a 23 69 66 6e 64  >pSelect);.#ifnd
3d90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
3da0: 48 45 43 4b 0a 20 20 73 71 6c 69 74 65 33 45 78  HECK.  sqlite3Ex
3db0: 70 72 44 65 6c 65 74 65 28 70 54 61 62 6c 65 2d  prDelete(pTable-
3dc0: 3e 70 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66  >pCheck);.#endif
3dd0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
3de0: 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  able);.}../*.** 
3df0: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
3e00: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
3e10: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
3e20: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
3e30: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
3e40: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
3e50: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
3e60: 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64  gn keys..*/.void
3e70: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
3e80: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
3e90: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
3ea0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
3eb0: 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c  TabName){.  Tabl
3ec0: 65 20 2a 70 3b 0a 20 20 46 4b 65 79 20 2a 70 46  e *p;.  FKey *pF
3ed0: 31 2c 20 2a 70 46 32 3b 0a 20 20 44 62 20 2a 70  1, *pF2;.  Db *p
3ee0: 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64  Db;..  assert( d
3ef0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
3f00: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
3f10: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
3f20: 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 26 26  ert( zTabName &&
3f30: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a   zTabName[0] );.
3f40: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
3f50: 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c  [iDb];.  p = sql
3f60: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
3f70: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
3f80: 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c  lHash, zTabName,
3f90: 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61 6d 65   strlen(zTabName
3fa0: 29 2b 31 2c 30 29 3b 0a 20 20 69 66 28 20 70 20  )+1,0);.  if( p 
3fb0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
3fc0: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
3fd0: 45 59 0a 20 20 20 20 66 6f 72 28 70 46 31 3d 70  EY.    for(pF1=p
3fe0: 2d 3e 70 46 4b 65 79 3b 20 70 46 31 3b 20 70 46  ->pFKey; pF1; pF
3ff0: 31 3d 70 46 31 2d 3e 70 4e 65 78 74 46 72 6f 6d  1=pF1->pNextFrom
4000: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  ){.      int nTo
4010: 20 3d 20 73 74 72 6c 65 6e 28 70 46 31 2d 3e 7a   = strlen(pF1->z
4020: 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  To) + 1;.      p
4030: 46 32 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  F2 = sqlite3Hash
4040: 46 69 6e 64 28 26 70 44 62 2d 3e 70 53 63 68 65  Find(&pDb->pSche
4050: 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e  ma->aFKey, pF1->
4060: 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20  zTo, nTo);.     
4070: 20 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29 7b   if( pF2==pF1 ){
4080: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4090: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
40a0: 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c  >pSchema->aFKey,
40b0: 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20   pF1->zTo, nTo, 
40c0: 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b 0a 20  pF1->pNextTo);. 
40d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
40e0: 20 20 20 20 77 68 69 6c 65 28 20 70 46 32 20 26      while( pF2 &
40f0: 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 21 3d  & pF2->pNextTo!=
4100: 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32 2d 3e  pF1 ){ pF2=pF2->
4110: 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20 20 20  pNextTo; }.     
4120: 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a 20 20     if( pF2 ){.  
4130: 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70 4e 65          pF2->pNe
4140: 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65 78  xtTo = pF1->pNex
4150: 74 54 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  tTo;.        }. 
4160: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
4170: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44  dif.    sqlite3D
4180: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
4190: 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61  );.  }.  db->fla
41a0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
41b0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
41c0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b  *.** Given a tok
41d0: 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72  en, return a str
41e0: 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74  ing that consist
41f0: 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66  s of the text of
4200: 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20 77   that.** token w
4210: 69 74 68 20 61 6e 79 20 71 75 6f 74 61 74 69 6f  ith any quotatio
4220: 6e 73 20 72 65 6d 6f 76 65 64 2e 20 20 53 70 61  ns removed.  Spa
4230: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
4240: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
4250: 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  * is obtained fr
4260: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
4270: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
4280: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
4290: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ng.** function..
42a0: 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65  **.** Tokens are
42b0: 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e   often just poin
42c0: 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72  ters into the or
42d0: 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20  iginal SQL text 
42e0: 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f  and so.** are no
42f0: 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  t \000 terminate
4300: 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65  d and are not pe
4310: 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72  rsistent.  The r
4320: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
4330: 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e  * is \000 termin
4340: 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73  ated and is pers
4350: 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20  istent..*/.char 
4360: 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d  *sqlite3NameFrom
4370: 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61  Token(Token *pNa
4380: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  me){.  char *zNa
4390: 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20  me;.  if( pName 
43a0: 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
43b0: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 28 63 68  qliteStrNDup((ch
43c0: 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  ar*)pName->z, pN
43d0: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c  ame->n);.    sql
43e0: 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d  ite3Dequote(zNam
43f0: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
4400: 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a   zName = 0;.  }.
4410: 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a    return zName;.
4420: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
4430: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
4440: 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20  table stored in 
4450: 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  database number 
4460: 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69  iDb for.** writi
4470: 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73  ng. The table is
4480: 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75   opened using cu
4490: 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20  rsor 0..*/.void 
44a0: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
44b0: 72 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c  rTable(Parse *p,
44c0: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
44d0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
44e0: 74 56 64 62 65 28 70 29 3b 0a 20 20 73 71 6c 69  tVdbe(p);.  sqli
44f0: 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  te3TableLock(p, 
4500: 69 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  iDb, MASTER_ROOT
4510: 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  , 1, SCHEMA_TABL
4520: 45 28 69 44 62 29 29 3b 0a 20 20 73 71 6c 69 74  E(iDb));.  sqlit
4530: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4540: 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20  P_Integer, iDb, 
4550: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
4560: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
4570: 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45  nWrite, 0, MASTE
4580: 52 5f 52 4f 4f 54 29 3b 0a 20 20 73 71 6c 69 74  R_ROOT);.  sqlit
4590: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
45a0: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
45b0: 20 30 2c 20 35 29 3b 20 2f 2a 20 73 71 6c 69 74   0, 5); /* sqlit
45c0: 65 5f 6d 61 73 74 65 72 20 68 61 73 20 35 20 63  e_master has 5 c
45d0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  olumns */.}../*.
45e0: 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e  ** The token *pN
45f0: 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ame contains the
4600: 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62   name of a datab
4610: 61 73 65 20 28 65 69 74 68 65 72 20 22 6d 61 69  ase (either "mai
4620: 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20  n" or.** "temp" 
4630: 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  or the name of a
4640: 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20  n attached db). 
4650: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
4660: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65  urns the.** inde
4670: 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64  x of the named d
4680: 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61  atabase in db->a
4690: 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74  Db[], or -1 if t
46a0: 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20  he named db .** 
46b0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
46c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  */.int sqlite3Fi
46d0: 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62  ndDb(sqlite3 *db
46e0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
46f0: 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20  .  int i = -1;  
4700: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
4710: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  mber */.  int n;
4720: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4730: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
4740: 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a   in the name */.
4750: 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
4760: 20 2f 2a 20 41 20 64 61 74 61 62 61 73 65 20 77   /* A database w
4770: 68 6f 73 65 20 6e 61 6d 65 20 73 70 61 63 65 20  hose name space 
4780: 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  is being searche
4790: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  d */.  char *zNa
47a0: 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65  me;   /* Name we
47b0: 20 61 72 65 20 73 65 61 72 63 68 69 6e 67 20 66   are searching f
47c0: 6f 72 20 2a 2f 0a 0a 20 20 7a 4e 61 6d 65 20 3d  or */..  zName =
47d0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
47e0: 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20  Token(pName);.  
47f0: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
4800: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d   n = strlen(zNam
4810: 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64  e);.    for(i=(d
4820: 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26  b->nDb-1), pDb=&
4830: 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30  db->aDb[i]; i>=0
4840: 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20  ; i--, pDb--){. 
4850: 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49 54 5f       if( (!OMIT_
4860: 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31 20 29  TEMPDB || i!=1 )
4870: 20 26 26 20 6e 3d 3d 73 74 72 6c 65 6e 28 70 44   && n==strlen(pD
4880: 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20  b->zName) && .  
4890: 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74          0==sqlit
48a0: 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a  e3StrICmp(pDb->z
48b0: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  Name, zName) ){.
48c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
48d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
48e0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
48f0: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
4900: 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61   i;.}../* The ta
4910: 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74  ble or view or t
4920: 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70  rigger name is p
4930: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f  assed to this ro
4940: 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73  utine via tokens
4950: 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70  .** pName1 and p
4960: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
4970: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
4980: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
4990: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
49a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
49b0: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20  x.yyy (...);.** 
49c0: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
49d0: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
49e0: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
49f0: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
4a00: 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  and if.** the ta
4a10: 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  ble name is not 
4a20: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
4a30: 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45   i.e.:.**.** CRE
4a40: 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e  ATE TABLE yyy(..
4a50: 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70  .);.**.** Then p
4a60: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
4a70: 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32  "yyy" and pName2
4a80: 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68   is ""..**.** Th
4a90: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
4aa0: 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f  the *ppUnqual po
4ab0: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
4ac0: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
4ad0: 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32  me1 or.** pName2
4ae0: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
4af0: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
4b00: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69  ble name.  The i
4b10: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64  ndex of the.** d
4b20: 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73  atabase "xxx" is
4b30: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
4b40: 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  t sqlite3TwoPart
4b50: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
4b60: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
4b70: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
4b80: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
4b90: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
4ba0: 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54  Name1,      /* T
4bb0: 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20  he "xxx" in the 
4bc0: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f  name "xxx.yyy" o
4bd0: 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b  r "xxx" */.  Tok
4be0: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
4bf0: 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e   /* The "yyy" in
4c00: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
4c10: 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  yy" */.  Token *
4c20: 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20  *pUnqual     /* 
4c30: 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c  Write the unqual
4c40: 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d  ified object nam
4c50: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
4c60: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
4c70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
4c80: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74  tabase holding t
4c90: 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  he object */.  s
4ca0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
4cb0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
4cc0: 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32  pName2 && pName2
4cd0: 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73  ->n>0 ){.    ass
4ce0: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
4cf0: 75 73 79 20 29 3b 0a 20 20 20 20 2a 70 55 6e 71  usy );.    *pUnq
4d00: 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20  ual = pName2;.  
4d10: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46    iDb = sqlite3F
4d20: 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31  indDb(db, pName1
4d30: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
4d40: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4d50: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4d60: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62  , "unknown datab
4d70: 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29  ase %T", pName1)
4d80: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
4d90: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
4da0: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
4db0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
4dc0: 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  rt( db->init.iDb
4dd0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e  ==0 || db->init.
4de0: 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20  busy );.    iDb 
4df0: 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a  = db->init.iDb;.
4e00: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
4e10: 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74  Name1;.  }.  ret
4e20: 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn iDb;.}../*.*
4e30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4e40: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
4e50: 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72  if the UTF-8 str
4e60: 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c  ing zName is a l
4e70: 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66  egal.** unqualif
4e80: 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ied name for a n
4e90: 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  ew schema object
4ea0: 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20   (table, index, 
4eb0: 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67  view or.** trigg
4ec0: 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61  er). All names a
4ed0: 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20  re legal except 
4ee0: 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e  those that begin
4ef0: 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67   with the string
4f00: 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69  .** "sqlite_" (i
4f10: 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f  n upper, lower o
4f20: 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54  r mixed case). T
4f30: 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  his portion of t
4f40: 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20  he namespace.** 
4f50: 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  is reserved for 
4f60: 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f  internal use..*/
4f70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
4f80: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73  kObjectName(Pars
4f90: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
4fa0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
4fb0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62   if( !pParse->db
4fc0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
4fd0: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
4fe0: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
4ff0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
5000: 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65  s & SQLITE_Write
5010: 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20  Schema)==0.     
5020: 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
5030: 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65  e3StrNICmp(zName
5040: 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20  , "sqlite_", 7) 
5050: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
5060: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
5070: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65  object name rese
5080: 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61  rved for interna
5090: 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d  l use: %s", zNam
50a0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
50b0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
50c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
50d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  _OK;.}../*.** Be
50e0: 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  gin constructing
50f0: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70   a new table rep
5100: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d  resentation in m
5110: 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a  emory.  This is.
5120: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  ** the first of 
5130: 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72  several action r
5140: 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74  outines that get
5150: 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f   called in respo
5160: 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41  nse.** to a CREA
5170: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
5180: 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c  nt.  In particul
5190: 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ar, this routine
51a0: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66   is called.** af
51b0: 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e  ter seeing token
51c0: 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22  s "CREATE" and "
51d0: 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74  TABLE" and the t
51e0: 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69  able name. The i
51f0: 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73  sTemp.** flag is
5200: 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62   true if the tab
5210: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  le should be sto
5220: 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c  red in the auxil
5230: 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  iary database.**
5240: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
5250: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
5260: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
5270: 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68  s is normally th
5280: 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74  e case.** when t
5290: 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45  he "TEMP" or "TE
52a0: 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64  MPORARY" keyword
52b0: 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65   occurs in betwe
52c0: 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64  en.** CREATE and
52d0: 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68   TABLE..**.** Th
52e0: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
52f0: 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  rd is initialize
5300: 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61  d and put in pPa
5310: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a  rse->pNewTable..
5320: 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68  ** As more of th
5330: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
5340: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
5350: 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61  ed, additional a
5360: 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65  ction.** routine
5370: 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  s will be called
5380: 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66   to add more inf
5390: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73  ormation to this
53a0: 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74   record..** At t
53b0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
53c0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
53d0: 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65  ment, the sqlite
53e0: 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74  3EndTable() rout
53f0: 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
5400: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
5410: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66   construction of
5420: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   the new table r
5430: 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ecord..*/.void s
5440: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
5450: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5460: 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63  e,   /* Parser c
5470: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
5480: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20  n *pName1,   /* 
5490: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68  First part of th
54a0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
54b0: 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ble or view */. 
54c0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
54d0: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
54e0: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
54f0: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
5500: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
5510: 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  p,      /* True 
5520: 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  if this is a TEM
5530: 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  P table */.  int
5540: 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a   isView,      /*
5550: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
5560: 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74   a VIEW */.  int
5570: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a   noErr        /*
5580: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
5590: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
55a0: 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
55b0: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61  e *pTable;.  cha
55c0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a  r *zName = 0; /*
55d0: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
55e0: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
55f0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
5600: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
5610: 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20   *v;.  int iDb; 
5620: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5630: 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72  ase number to cr
5640: 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  eate the table i
5650: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
5660: 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  ame;    /* Unqua
5670: 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
5680: 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61  he table to crea
5690: 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  te */..  /* The 
56a0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
56b0: 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69 73 20  me to create is 
56c0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
56d0: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
56e0: 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e  s.  ** pName1 an
56f0: 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65  d pName2. If the
5700: 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20   table name was 
5710: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
5720: 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20   for example:.  
5730: 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54  **.  ** CREATE T
5740: 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e  ABLE xxx.yyy (..
5750: 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54  .);.  ** .  ** T
5760: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
5770: 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70  t to "xxx" and p
5780: 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20  Name2 "yyy". On 
5790: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69  the other hand i
57a0: 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65  f.  ** the table
57b0: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c   name is not ful
57c0: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e  ly qualified, i.
57d0: 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52  e.:.  **.  ** CR
57e0: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
57f0: 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ..);.  **.  ** T
5800: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
5810: 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70  t to "yyy" and p
5820: 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20 2a  Name2 is ""..  *
5830: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  *.  ** The call 
5840: 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20 70  below sets the p
5850: 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  Name pointer to 
5860: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b  point at the tok
5870: 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20  en (pName1 or.  
5880: 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20  ** pName2) that 
5890: 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61  stores the unqua
58a0: 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d  lified table nam
58b0: 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65 20  e. The variable 
58c0: 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74 20  iDb is.  ** set 
58d0: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
58e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
58f0: 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  t the table or v
5900: 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20 2a  iew is to be.  *
5910: 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20 20  * created in..  
5920: 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  */.  iDb = sqlit
5930: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
5940: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
5950: 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
5960: 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
5970: 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49 54  urn;.  if( !OMIT
5980: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
5990: 70 20 26 26 20 69 44 62 3e 31 20 29 7b 0a 20 20  p && iDb>1 ){.  
59a0: 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
59b0: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74   a temp table, t
59c0: 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20  he name may not 
59d0: 62 65 20 71 75 61 6c 69 66 69 65 64 20 2a 2f 0a  be qualified */.
59e0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
59f0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d  Msg(pParse, "tem
5a00: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d  porary table nam
5a10: 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c  e must be unqual
5a20: 69 66 69 65 64 22 29 3b 0a 20 20 20 20 72 65 74  ified");.    ret
5a30: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  urn;.  }.  if( !
5a40: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
5a50: 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b  sTemp ) iDb = 1;
5a60: 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d  ..  pParse->sNam
5a70: 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b  eToken = *pName;
5a80: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
5a90: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
5aa0: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
5ab0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
5ac0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
5ad0: 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  !=sqlite3CheckOb
5ae0: 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  jectName(pParse,
5af0: 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67   zName) ){.    g
5b00: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
5b10: 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28  error;.  }.  if(
5b20: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31   db->init.iDb==1
5b30: 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23   ) isTemp = 1;.#
5b40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5b50: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
5b60: 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 54 65  .  assert( (isTe
5b70: 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20  mp & 1)==isTemp 
5b80: 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  );.  {.    int c
5b90: 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ode;.    char *z
5ba0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
5bb0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
5bc0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
5bd0: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
5be0: 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f  _INSERT, SCHEMA_
5bf0: 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30  TABLE(isTemp), 0
5c00: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
5c10: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
5c20: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
5c30: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
5c40: 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
5c50: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
5c60: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
5c70: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
5c80: 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20  _TEMP_VIEW;.    
5c90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5ca0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
5cb0: 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20  REATE_VIEW;.    
5cc0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
5cd0: 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
5ce0: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
5cf0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
5d00: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
5d10: 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  TEMP_TABLE;.    
5d20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5d30: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
5d40: 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20  REATE_TABLE;.   
5d50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
5d60: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
5d70: 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
5d80: 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  , zName, 0, zDb)
5d90: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
5da0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
5db0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
5dc0: 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
5dd0: 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  re the new table
5de0: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63   name does not c
5df0: 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65  ollide with an e
5e00: 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  xisting.  ** ind
5e10: 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65  ex or table name
5e20: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
5e30: 61 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e  abase.  Issue an
5e40: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
5e50: 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 0a  f.  ** it does..
5e60: 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54    */.  if( SQLIT
5e70: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
5e80: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
5e90: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69  ){.    goto begi
5ea0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
5eb0: 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71   }.  pTable = sq
5ec0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
5ed0: 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44  b, zName, db->aD
5ee0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  b[iDb].zName);. 
5ef0: 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
5f00: 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b     if( !noErr ){
5f10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
5f20: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
5f30: 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79  table %T already
5f40: 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29   exists", pName)
5f50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f  ;.    }.    goto
5f60: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
5f70: 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  or;.  }.  if( sq
5f80: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
5f90: 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20  b, zName, 0)!=0 
5fa0: 26 26 20 28 69 44 62 3d 3d 30 20 7c 7c 20 21 64  && (iDb==0 || !d
5fb0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b  b->init.busy) ){
5fc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
5fd0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
5fe0: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
5ff0: 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73  n index named %s
6000: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  ", zName);.    g
6010: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
6020: 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61  error;.  }.  pTa
6030: 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ble = sqliteMall
6040: 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  oc( sizeof(Table
6050: 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  ) );.  if( pTabl
6060: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72  e==0 ){.    pPar
6070: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
6080: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73  NOMEM;.    pPars
6090: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
60a0: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
60b0: 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61  error;.  }.  pTa
60c0: 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  ble->zName = zNa
60d0: 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43  me;.  pTable->nC
60e0: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
60f0: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  ->aCol = 0;.  pT
6100: 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  able->iPKey = -1
6110: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ;.  pTable->pInd
6120: 65 78 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ex = 0;.  pTable
6130: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e  ->pSchema = db->
6140: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
6150: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66  ;.  pTable->nRef
6160: 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 61 72   = 1;.  if( pPar
6170: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 20  se->pNewTable ) 
6180: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
6190: 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70  le(db, pParse->p
61a0: 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61  NewTable);.  pPa
61b0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
61c0: 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49   pTable;..  /* I
61d0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61  f this is the ma
61e0: 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65  gic sqlite_seque
61f0: 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20 62  nce table used b
6200: 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c  y autoincrement,
6210: 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72  .  ** then recor
6220: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  d a pointer to t
6230: 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65  his table in the
6240: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
6250: 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f  tructure.  ** so
6260: 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e   that INSERT can
6270: 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   find the table 
6280: 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  easily..  */.#if
6290: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
62a0: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
62b0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65   if( !pParse->ne
62c0: 73 74 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a  sted && strcmp(z
62d0: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65  Name, "sqlite_se
62e0: 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20  quence")==0 ){. 
62f0: 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65     pTable->pSche
6300: 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20 70 54  ma->pSeqTab = pT
6310: 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  able;.  }.#endif
6320: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
6330: 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65  erating the code
6340: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72   that will inser
6350: 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  t the table reco
6360: 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65  rd into.  ** the
6370: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
6380: 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70  able.  Note in p
6390: 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77  articular that w
63a0: 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a  e must go ahead.
63b0: 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74    ** and allocat
63c0: 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  e the record num
63d0: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
63e0: 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65  e entry now.  Be
63f0: 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52  fore any.  ** PR
6400: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
6410: 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65  QUE keywords are
6420: 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20   parsed.  Those 
6430: 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61  keywords will ca
6440: 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  use.  ** indices
6450: 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61   to be created a
6460: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  nd the table rec
6470: 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65  ord must come be
6480: 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69  fore the .  ** i
6490: 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20  ndices.  Hence, 
64a0: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
64b0: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
64c0: 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
64d0: 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f  d.  ** now..  */
64e0: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
64f0: 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73 71  .busy && (v = sq
6500: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
6510: 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  rse))!=0 ){.    
6520: 69 6e 74 20 6c 62 6c 3b 0a 20 20 20 20 69 6e 74  int lbl;.    int
6530: 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20   fileFormat;.   
6540: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
6550: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
6560: 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 20 20  se, 0, iDb);..  
6570: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
6580: 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f   format and enco
6590: 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61  ding in the data
65a0: 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65  base have not be
65b0: 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20  en set, .    ** 
65c0: 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20  set them now..  
65d0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
65e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
65f0: 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  ReadCookie, iDb,
6600: 20 31 29 3b 20 20 20 2f 2a 20 66 69 6c 65 5f 66   1);   /* file_f
6610: 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20 6c 62 6c  ormat */.    lbl
6620: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
6630: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
6640: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6650: 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 6c 62  (v, OP_If, 0, lb
6660: 6c 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d  l);.    fileForm
6670: 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  at = (db->flags 
6680: 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46  & SQLITE_LegacyF
6690: 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20  ileFmt)!=0 ?.   
66a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
66b0: 20 3a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   : SQLITE_DEFAUL
66c0: 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20  T_FILE_FORMAT;. 
66d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
66e0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
66f0: 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74 2c 20 30  r, fileFormat, 0
6700: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6710: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
6720: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29  tCookie, iDb, 1)
6730: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6740: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
6750: 65 67 65 72 2c 20 45 4e 43 28 64 62 29 2c 20 30  eger, ENC(db), 0
6760: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6770: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
6780: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 34 29  tCookie, iDb, 4)
6790: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
67a0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
67b0: 20 6c 62 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   lbl);..    /* T
67c0: 68 69 73 20 6a 75 73 74 20 63 72 65 61 74 65 73  his just creates
67d0: 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20   a place-holder 
67e0: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71  record in the sq
67f0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
6800: 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  e..    ** The re
6810: 63 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f 65  cord created doe
6820: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
6830: 79 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20  ything yet.  It 
6840: 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64  will be replaced
6850: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72  .    ** by the r
6860: 65 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64  eal entry in cod
6870: 65 20 67 65 6e 65 72 61 74 65 64 20 61 74 20 73  e generated at s
6880: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
6890: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
68a0: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68  The rowid for th
68b0: 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c  e new entry is l
68c0: 65 66 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f  eft on the top o
68d0: 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20  f the stack..   
68e0: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 76 61   ** The rowid va
68f0: 6c 75 65 20 69 73 20 6e 65 65 64 65 64 20 62 79  lue is needed by
6900: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   the code that s
6910: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77  qlite3EndTable w
6920: 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72  ill.    ** gener
6930: 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  ate..    */.#ifn
6940: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6950: 56 49 45 57 0a 20 20 20 20 69 66 28 20 69 73 56  VIEW.    if( isV
6960: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  iew ){.      sql
6970: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6980: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
6990: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  0);.    }else.#e
69a0: 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
69b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
69c0: 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61  p(v, OP_CreateTa
69d0: 62 6c 65 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  ble, iDb, 0);.  
69e0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
69f0: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70  penMasterTable(p
6a00: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
6a10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6a20: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  p(v, OP_NewRowid
6a30: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
6a40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6a50: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
6a60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6a70: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  ddOp(v, OP_Null,
6a80: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
6a90: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6aa0: 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 30 29  OP_Insert, 0, 0)
6ab0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6ac0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
6ad0: 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  se, 0, 0);.    s
6ae0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6af0: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30  v, OP_Pull, 1, 0
6b00: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72  );.  }..  /* Nor
6b10: 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20  mal (non-error) 
6b20: 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74  return. */.  ret
6b30: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  urn;..  /* If an
6b40: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77   error occurs, w
6b50: 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62  e jump here */.b
6b60: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
6b70: 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  :.  sqliteFree(z
6b80: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Name);.  return;
6b90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d  .}../*.** This m
6ba0: 61 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20  acro is used to 
6bb0: 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69  compare two stri
6bc0: 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e  ngs in a case-in
6bd0: 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65 72  sensitive manner
6be0: 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67 68  ..** It is sligh
6bf0: 74 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e 20  tly faster than 
6c00: 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 53  calling sqlite3S
6c10: 74 72 49 43 6d 70 28 29 20 64 69 72 65 63 74 6c  trICmp() directl
6c20: 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63  y, but.** produc
6c30: 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a  es larger code..
6c40: 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54  **.** WARNING: T
6c50: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74  his macro is not
6c60: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
6c70: 20 74 68 65 20 73 74 72 63 6d 70 28 29 20 66 61   the strcmp() fa
6c80: 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75  mily. It.** retu
6c90: 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20  rns true if the 
6ca0: 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65 20  two strings are 
6cb0: 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73 65  equal, otherwise
6cc0: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69   false..*/.#defi
6cd0: 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79 29  ne STRICMP(x, y)
6ce0: 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72   (\.sqlite3Upper
6cf0: 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e  ToLower[*(unsign
6d00: 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d  ed char *)(x)]==
6d10: 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70 65     \.sqlite3Uppe
6d20: 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67  rToLower[*(unsig
6d30: 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d 20  ned char *)(y)] 
6d40: 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65 33      \.&& sqlite3
6d50: 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28 79  StrICmp((x)+1,(y
6d60: 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a  )+1)==0 )../*.**
6d70: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
6d80: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
6d90: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
6da0: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a  onstructed..**.*
6db0: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
6dc0: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
6dd0: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f  once for each co
6de0: 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  lumn declaration
6df0: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
6e00: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
6e10: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
6e20: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
6e30: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
6e40: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
6e50: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
6e60: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
6e70: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
6e80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6e90: 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20  AddColumn(Parse 
6ea0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
6eb0: 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  pName){.  Table 
6ec0: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
6ed0: 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e  har *z;.  Column
6ee0: 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70   *pCol;.  if( (p
6ef0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
6f00: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
6f10: 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  n;.  z = sqlite3
6f20: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e  NameFromToken(pN
6f30: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  ame);.  if( z==0
6f40: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
6f50: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
6f60: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53   i++){.    if( S
6f70: 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f  TRICMP(z, p->aCo
6f80: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20  l[i].zName) ){. 
6f90: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
6fa0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
6fb0: 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e  plicate column n
6fc0: 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ame: %s", z);.  
6fd0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
6fe0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
6ff0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
7000: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
7010: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
7020: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
7030: 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
7040: 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e  c( p->aCol, (p->
7050: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
7060: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
7070: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
7080: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
7090: 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (z);.      retur
70a0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  n;.    }.    p->
70b0: 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d  aCol = aNew;.  }
70c0: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
70d0: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d  ol[p->nCol];.  m
70e0: 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73  emset(pCol, 0, s
70f0: 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d  izeof(p->aCol[0]
7100: 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  ));.  pCol->zNam
7110: 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66  e = z;. .  /* If
7120: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70   there is no typ
7130: 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c  e specified, col
7140: 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64 65  umns have the de
7150: 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20  fault affinity. 
7160: 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74   ** 'NONE'. If t
7170: 68 65 72 65 20 69 73 20 61 20 74 79 70 65 20 73  here is a type s
7180: 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73  pecified, then s
7190: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54  qlite3AddColumnT
71a0: 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20  ype() will.  ** 
71b0: 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74  be called next t
71c0: 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69  o set pCol->affi
71d0: 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a  nity correctly..
71e0: 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66    */.  pCol->aff
71f0: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
7200: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 6e 43  FF_NONE;.  p->nC
7210: 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ol++;.}../*.** T
7220: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
7230: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
7240: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
7250: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
7260: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
7270: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
7280: 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   A "NOT NULL" co
7290: 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20  nstraint has.** 
72a0: 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63  been seen on a c
72b0: 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75  olumn.  This rou
72c0: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f  tine sets the no
72d0: 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a  tNull flag on.**
72e0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72   the column curr
72f0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
7300: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
7310: 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e  d sqlite3AddNotN
7320: 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73  ull(Parse *pPars
7330: 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  e, int onError){
7340: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
7350: 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d  nt i;.  if( (p =
7360: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
7370: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
7380: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
7390: 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70  ;.  if( i>=0 ) p
73a0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c  ->aCol[i].notNul
73b0: 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a  l = onError;.}..
73c0: 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63  /*.** Scan the c
73d0: 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20  olumn type name 
73e0: 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54  zType (length nT
73f0: 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ype) and return 
7400: 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  the.** associate
7410: 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e  d affinity type.
7420: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7430: 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d  ine does a case-
7440: 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72  independent sear
7450: 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20  ch of zType for 
7460: 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e  the .** substrin
7470: 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  gs in the follow
7480: 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e  ing table. If on
7490: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
74a0: 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c  ngs is.** found,
74b0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
74c0: 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72  ng affinity is r
74d0: 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70  eturned. If zTyp
74e0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f  e contains.** mo
74f0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74  re than one of t
7500: 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65  he substrings, e
7510: 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68  ntries toward th
7520: 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65  e top of .** the
7530: 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f   table take prio
7540: 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c  rity. For exampl
7550: 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27  e, if zType is '
7560: 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51  BLOBINT', .** SQ
7570: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
7580: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
7590: 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20  .** Substring   
75a0: 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20    | Affinity.** 
75b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75d0: 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20  .** 'INT'       
75e0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49    | SQLITE_AFF_I
75f0: 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27  NTEGER.** 'CHAR'
7600: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
7610: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c  _AFF_TEXT.** 'CL
7620: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
7630: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
7640: 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20  'TEXT'        | 
7650: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
7660: 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20  ** 'BLOB'       
7670: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   | SQLITE_AFF_NO
7680: 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20  NE.** 'REAL'    
7690: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
76a0: 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20  _REAL.** 'FLOA' 
76b0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
76c0: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55  AFF_REAL.** 'DOU
76d0: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
76e0: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a  TE_AFF_REAL.**.*
76f0: 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
7700: 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74   substrings in t
7710: 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61  he above table a
7720: 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c  re found,.** SQL
7730: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
7740: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
7750: 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69  char sqlite3Affi
7760: 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 54  nityType(const T
7770: 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20  oken *pType){.  
7780: 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61  u32 h = 0;.  cha
7790: 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41  r aff = SQLITE_A
77a0: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f  FF_NUMERIC;.  co
77b0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
77c0: 72 20 2a 7a 49 6e 20 3d 20 70 54 79 70 65 2d 3e  r *zIn = pType->
77d0: 7a 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  z;.  const unsig
77e0: 6e 65 64 20 63 68 61 72 20 2a 7a 45 6e 64 20 3d  ned char *zEnd =
77f0: 20 26 70 54 79 70 65 2d 3e 7a 5b 70 54 79 70 65   &pType->z[pType
7800: 2d 3e 6e 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20  ->n];..  while( 
7810: 7a 49 6e 21 3d 7a 45 6e 64 20 29 7b 0a 20 20 20  zIn!=zEnd ){.   
7820: 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71   h = (h<<8) + sq
7830: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
7840: 72 5b 2a 7a 49 6e 5d 3b 0a 20 20 20 20 7a 49 6e  r[*zIn];.    zIn
7850: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28  ++;.    if( h==(
7860: 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c  ('c'<<24)+('h'<<
7870: 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27  16)+('a'<<8)+'r'
7880: 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  ) ){            
7890: 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20   /* CHAR */.    
78a0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
78b0: 46 46 5f 54 45 58 54 3b 20 0a 20 20 20 20 7d 65  FF_TEXT; .    }e
78c0: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27  lse if( h==(('c'
78d0: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
78e0: 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b  ('o'<<8)+'b') ){
78f0: 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a         /* CLOB *
7900: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
7910: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
7920: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
7930: 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c  (('t'<<24)+('e'<
7940: 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74  <16)+('x'<<8)+'t
7950: 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54  ') ){       /* T
7960: 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  EXT */.      aff
7970: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
7980: 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  XT;.    }else if
7990: 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b  ( h==(('b'<<24)+
79a0: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
79b0: 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20  8)+'b')         
79c0: 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20   /* BLOB */.    
79d0: 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c      && (aff==SQL
79e0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
79f0: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
7a00: 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20  FF_REAL) ){.    
7a10: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
7a20: 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65 66  FF_NONE;.#ifndef
7a30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
7a40: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
7a50: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
7a60: 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36  r'<<24)+('e'<<16
7a70: 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20  )+('a'<<8)+'l') 
7a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c           /* REAL
7a90: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
7aa0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
7ab0: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
7ac0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7ad0: 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _REAL;.    }else
7ae0: 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32   if( h==(('f'<<2
7af0: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
7b00: 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20  '<<8)+'a')      
7b10: 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20      /* FLOA */. 
7b20: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
7b30: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
7b40: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
7b50: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
7b60: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7b70: 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27  h==(('d'<<24)+('
7b80: 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29  o'<<16)+('u'<<8)
7b90: 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'b')          /
7ba0: 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20  * DOUB */.      
7bb0: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
7bc0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
7bd0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
7be0: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e  TE_AFF_REAL;.#en
7bf0: 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  dif.    }else if
7c00: 28 20 28 68 26 30 78 30 30 46 46 46 46 46 46 29  ( (h&0x00FFFFFF)
7c10: 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e  ==(('i'<<16)+('n
7c20: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
7c30: 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20   /* INT */.     
7c40: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
7c50: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  F_INTEGER;.     
7c60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7c70: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b  }..  return aff;
7c80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
7c90: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
7ca0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
7cb0: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
7cc0: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
7cd0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
7ce0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
7cf0: 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20  pFirst token is 
7d00: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b  the first.** tok
7d10: 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  en in the sequen
7d20: 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61  ce of tokens tha
7d30: 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74  t describe the t
7d40: 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ype of the.** co
7d50: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
7d60: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
7d70: 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74 68  n.   pLast is th
7d80: 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20  e last token.** 
7d90: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e  in the sequence.
7da0: 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72    Use this infor
7db0: 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72  mation to constr
7dc0: 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20  uct a string.** 
7dd0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
7de0: 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68  e typename of th
7df0: 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f  e column and sto
7e00: 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a  re that string.*
7e10: 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a  * in zType..*/ .
7e20: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
7e30: 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20  olumnType(Parse 
7e40: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
7e50: 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20  pType){.  Table 
7e60: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43  *p;.  int i;.  C
7e70: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20  olumn *pCol;..  
7e80: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
7e90: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
7ea0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
7eb0: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20  ->nCol-1;.  if( 
7ec0: 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  i<0 ) return;.  
7ed0: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
7ee0: 69 5d 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  i];.  sqliteFree
7ef0: 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20  (pCol->zType);. 
7f00: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73   pCol->zType = s
7f10: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
7f20: 6b 65 6e 28 70 54 79 70 65 29 3b 0a 20 20 70 43  ken(pType);.  pC
7f30: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
7f40: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
7f50: 70 65 28 70 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a  pe(pType);.}../*
7f60: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
7f70: 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  on is the defaul
7f80: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
7f90: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
7fa0: 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66  ded column.** of
7fb0: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
7fc0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
7fd0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44  ruction..**.** D
7fe0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70  efault value exp
7ff0: 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65  ressions must be
8000: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73   constant.  Rais
8010: 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69  e an exception i
8020: 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74  f this.** is not
8030: 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a   the case..**.**
8040: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
8050: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
8060: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
8070: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
8080: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
8090: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
80a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
80b0: 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  3AddDefaultValue
80c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
80d0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
80e0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75  Table *p;.  Colu
80f0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20  mn *pCol;.  if( 
8100: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
8110: 77 54 61 62 6c 65 29 21 3d 30 20 29 7b 0a 20 20  wTable)!=0 ){.  
8120: 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43    pCol = &(p->aC
8130: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a  ol[p->nCol-1]);.
8140: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
8150: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
8160: 46 75 6e 63 74 69 6f 6e 28 70 45 78 70 72 29 20  Function(pExpr) 
8170: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8180: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8190: 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20   "default value 
81a0: 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69  of column [%s] i
81b0: 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c  s not constant",
81c0: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d  .          pCol-
81d0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  >zName);.    }el
81e0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
81f0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 43 6f 6c  3ExprDelete(pCol
8200: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
8210: 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71  pCol->pDflt = sq
8220: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 45 78  lite3ExprDup(pEx
8230: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pr);.    }.  }. 
8240: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8250: 74 65 28 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  te(pExpr);.}../*
8260: 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68  .** Designate th
8270: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f  e PRIMARY KEY fo
8280: 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c  r the table.  pL
8290: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
82a0: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f   names .** of co
82b0: 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  lumns that form 
82c0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
82d0: 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55    If pList is NU
82e0: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  LL, then the.** 
82f0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
8300: 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ded column of th
8310: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70  e table is the p
8320: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a  rimary key..**.*
8330: 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61  * A table can ha
8340: 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70  ve at most one p
8350: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
8360: 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
8370: 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61  y has.** a prima
8380: 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73  ry key (and this
8390: 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   is the second p
83a0: 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e  rimary key) then
83b0: 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72   create an.** er
83c0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
83d0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
83e0: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   on a single col
83f0: 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79  umn whose dataty
8400: 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a  pe is INTEGER,.*
8410: 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74  * then we will t
8420: 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ry to use that c
8430: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77  olumn as the row
8440: 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61 62  id.  Set the Tab
8450: 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c  le.iPKey.** fiel
8460: 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75  d of the table u
8470: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
8480: 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65  n to be the inde
8490: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45  x of the.** INTE
84a0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
84b0: 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69  column.  Table.i
84c0: 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d  PKey is set to -
84d0: 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  1 if there is.**
84e0: 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d   no INTEGER PRIM
84f0: 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49  ARY KEY..**.** I
8500: 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74  f the key is not
8510: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
8520: 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72  ARY KEY, then cr
8530: 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a  eate a unique.**
8540: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b   index for the k
8550: 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73  ey.  No index is
8560: 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54   created for INT
8570: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8580: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
8590: 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  e3AddPrimaryKey(
85a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
85b0: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
85c0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
85d0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f  rList *pList,  /
85e0: 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20  * List of field 
85f0: 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65  names to be inde
8600: 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
8610: 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68  rror,      /* Wh
8620: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20  at to do with a 
8630: 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c  uniqueness confl
8640: 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74  ict */.  int aut
8650: 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72  oInc,      /* Tr
8660: 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e  ue if the AUTOIN
8670: 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20  CREMENT keyword 
8680: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
8690: 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20  int sortOrder   
86a0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41    /* SQLITE_SO_A
86b0: 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f  SC or SQLITE_SO_
86c0: 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  DESC */.){.  Tab
86d0: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
86e0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
86f0: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b  char *zType = 0;
8700: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31  .  int iCol = -1
8710: 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  , i;.  if( pTab=
8720: 3d 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72  =0 ) goto primar
8730: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66  y_key_exit;.  if
8740: 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b  ( pTab->hasPrimK
8750: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
8760: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8770: 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20  , .      "table 
8780: 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20  \"%s\" has more 
8790: 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79  than one primary
87a0: 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61   key", pTab->zNa
87b0: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72  me);.    goto pr
87c0: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
87d0: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73 50    }.  pTab->hasP
87e0: 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66  rimKey = 1;.  if
87f0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
8800: 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e    iCol = pTab->n
8810: 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61  Col - 1;.    pTa
8820: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73  b->aCol[iCol].is
8830: 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d  PrimKey = 1;.  }
8840: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
8850: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
8860: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  r; i++){.      f
8870: 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
8880: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
8890: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
88a0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
88b0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
88c0: 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e, pTab->aCol[iC
88d0: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ol].zName)==0 ){
88e0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
88f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8900: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43    }.      if( iC
8910: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  ol<pTab->nCol ){
8920: 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61  .        pTab->a
8930: 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d  Col[iCol].isPrim
8940: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Key = 1;.      }
8950: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
8960: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 20  List->nExpr>1 ) 
8970: 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20  iCol = -1;.  }. 
8980: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
8990: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iCol<pTab->nCol 
89a0: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70  ){.    zType = p
89b0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
89c0: 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28  zType;.  }.  if(
89d0: 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74 65   zType && sqlite
89e0: 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20  3StrICmp(zType, 
89f0: 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20  "INTEGER")==0.  
8a00: 20 20 20 20 20 20 26 26 20 73 6f 72 74 4f 72 64        && sortOrd
8a10: 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  er==SQLITE_SO_AS
8a20: 43 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69  C ){.    pTab->i
8a30: 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  PKey = iCol;.   
8a40: 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d   pTab->keyConf =
8a50: 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 70 54   onError;.    pT
8a60: 61 62 2d 3e 61 75 74 6f 49 6e 63 20 3d 20 61 75  ab->autoInc = au
8a70: 74 6f 49 6e 63 3b 0a 20 20 7d 65 6c 73 65 20 69  toInc;.  }else i
8a80: 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69  f( autoInc ){.#i
8a90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8aa0: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
8ab0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8ac0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41 55 54  Msg(pParse, "AUT
8ad0: 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e  OINCREMENT is on
8ae0: 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e  ly allowed on an
8af0: 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47   ".       "INTEG
8b00: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29  ER PRIMARY KEY")
8b10: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
8b20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65  {.    sqlite3Cre
8b30: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
8b40: 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c   0, 0, 0, pList,
8b50: 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 2c 20   onError, 0, 0, 
8b60: 73 6f 72 74 4f 72 64 65 72 2c 20 30 29 3b 0a 20  sortOrder, 0);. 
8b70: 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20     pList = 0;.  
8b80: 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  }..primary_key_e
8b90: 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  xit:.  sqlite3Ex
8ba0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  prListDelete(pLi
8bb0: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  st);.  return;.}
8bc0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
8bd0: 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  w CHECK constrai
8be0: 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  nt to the table 
8bf0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
8c00: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
8c10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
8c20: 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28  CheckConstraint(
8c30: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8c40: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
8c50: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
8c60: 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f  r *pCheckExpr  /
8c70: 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70 72  * The check expr
8c80: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66  ession */.){.#if
8c90: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8ca0: 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a  _CHECK.  Table *
8cb0: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
8cc0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
8cd0: 70 54 61 62 20 29 7b 0a 20 20 20 20 2f 2a 20 54  pTab ){.    /* T
8ce0: 68 65 20 43 48 45 43 4b 20 65 78 70 72 65 73 73  he CHECK express
8cf0: 69 6f 6e 20 6d 75 73 74 20 62 65 20 64 75 70 6c  ion must be dupl
8d00: 69 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 74  icated so that t
8d10: 6f 6b 65 6e 73 20 72 65 66 65 72 0a 20 20 20 20  okens refer.    
8d20: 2a 2a 20 74 6f 20 6d 61 6c 6c 6f 63 65 64 20 73  ** to malloced s
8d30: 70 61 63 65 20 61 6e 64 20 6e 6f 74 20 74 68 65  pace and not the
8d40: 20 28 65 70 68 65 6d 65 72 61 6c 29 20 74 65 78   (ephemeral) tex
8d50: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
8d60: 54 41 42 4c 45 0a 20 20 20 20 2a 2a 20 73 74 61  TABLE.    ** sta
8d70: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 70 54  tement */.    pT
8d80: 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c  ab->pCheck = sql
8d90: 69 74 65 33 45 78 70 72 41 6e 64 28 70 54 61 62  ite3ExprAnd(pTab
8da0: 2d 3e 70 43 68 65 63 6b 2c 20 73 71 6c 69 74 65  ->pCheck, sqlite
8db0: 33 45 78 70 72 44 75 70 28 70 43 68 65 63 6b 45  3ExprDup(pCheckE
8dc0: 78 70 72 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  xpr));.  }.#endi
8dd0: 66 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  f.  sqlite3ExprD
8de0: 65 6c 65 74 65 28 70 43 68 65 63 6b 45 78 70 72  elete(pCheckExpr
8df0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
8e00: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  the collation fu
8e10: 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nction of the mo
8e20: 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73  st recently pars
8e30: 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a  ed table column.
8e40: 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65  ** to the CollSe
8e50: 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64  q given..*/.void
8e60: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61   sqlite3AddColla
8e70: 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  teType(Parse *pP
8e80: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
8e90: 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79   *zType, int nTy
8ea0: 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  pe){.  Table *p;
8eb0: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
8ec0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
8ed0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
8ee0: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
8ef0: 43 6f 6c 2d 31 3b 0a 0a 20 20 69 66 28 20 73 71  Col-1;..  if( sq
8f00: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
8f10: 65 71 28 70 50 61 72 73 65 2c 20 7a 54 79 70 65  eq(pParse, zType
8f20: 2c 20 6e 54 79 70 65 29 20 29 7b 0a 20 20 20 20  , nType) ){.    
8f30: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
8f40: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
8f50: 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  l = sqliteStrNDu
8f60: 70 28 7a 54 79 70 65 2c 20 6e 54 79 70 65 29 3b  p(zType, nType);
8f70: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
8f80: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c  e column is decl
8f90: 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20  ared as "<name> 
8fa0: 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c  PRIMARY KEY COLL
8fb0: 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20  ATE <type>",.   
8fc0: 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65   ** then an inde
8fd0: 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  x may have been 
8fe0: 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20  created on this 
8ff0: 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68  column before th
9000: 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  e.    ** collati
9010: 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 65  on type was adde
9020: 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 20  d. Correct this 
9030: 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61 73  if it is the cas
9040: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
9050: 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78  r(pIdx=p->pIndex
9060: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
9070: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
9080: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
9090: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
90a0: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
90b0: 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20  olumn[0]==i ){. 
90c0: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
90d0: 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c  oll[0] = p->aCol
90e0: 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [i].zColl;.     
90f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
9100: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
9110: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
9120: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
9130: 63 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ce for database 
9140: 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65  native text.** e
9150: 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69  ncoding identifi
9160: 65 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67  ed by the string
9170: 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e   zName, length n
9180: 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Name..**.** If t
9190: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
91a0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
91b0: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
91c0: 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62  , or not availab
91d0: 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  le.** in the dat
91e0: 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63  abase native enc
91f0: 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61  oding, the colla
9200: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20  tion factory is 
9210: 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65  invoked to.** re
9220: 71 75 65 73 74 20 69 74 2e 20 49 66 20 74 68 65  quest it. If the
9230: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
9240: 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ry does not supp
9250: 6c 79 20 73 75 63 68 20 61 20 73 65 71 75 65 6e  ly such a sequen
9260: 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  ce,.** and the s
9270: 65 71 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c  equence is avail
9280: 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20  able in another 
9290: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74  text encoding, t
92a0: 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72  hen that is.** r
92b0: 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e  eturned instead.
92c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72  .**.** If no ver
92d0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71  sions of the req
92e0: 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  uested collation
92f0: 73 20 73 65 71 75 65 6e 63 65 20 61 72 65 20 61  s sequence are a
9300: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20  vailable, or.** 
9310: 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63  another error oc
9320: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
9330: 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72  turned and an er
9340: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74  ror message writ
9350: 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72  ten into.** pPar
9360: 73 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a  se..*/.CollSeq *
9370: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
9380: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
9390: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
93a0: 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65  zName, int nName
93b0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
93c0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
93d0: 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62   u8 enc = ENC(db
93e0: 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79  );.  u8 initbusy
93f0: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79   = db->init.busy
9400: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
9410: 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73  ll;..  pColl = s
9420: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
9430: 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65  q(db, enc, zName
9440: 2c 20 6e 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73  , nName, initbus
9450: 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62  y);.  if( !initb
9460: 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c  usy && (!pColl |
9470: 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20  | !pColl->xCmp) 
9480: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
9490: 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71  qlite3GetCollSeq
94a0: 28 64 62 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d  (db, pColl, zNam
94b0: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69  e, nName);.    i
94c0: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
94d0: 20 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29     if( nName<0 )
94e0: 7b 0a 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20  {.        nName 
94f0: 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
9500: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
9510: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9520: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
9530: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
9540: 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e 61 6d 65  ce: %.*s", nName
9550: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
9560: 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  pColl = 0;.    }
9570: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
9580: 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Coll;.}.../*.** 
9590: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
95a0: 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e  at will incremen
95b0: 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  t the schema coo
95c0: 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  kie..**.** The s
95d0: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20  chema cookie is 
95e0: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
95f0: 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d  e when the schem
9600: 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74  a for the.** dat
9610: 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
9620: 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d  After each schem
9630: 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f  a change, the co
9640: 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68  okie value.** ch
9650: 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70  anges.  When a p
9660: 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61  rocess first rea
9670: 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74  ds the schema it
9680: 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20   records the.** 
9690: 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66  cookie.  Thereaf
96a0: 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74  ter, whenever it
96b0: 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20   goes to access 
96c0: 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a  the database,.**
96d0: 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63   it checks the c
96e0: 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75  ookie to make su
96f0: 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61  re the schema ha
9700: 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a  s not changed.**
9710: 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61   since it was la
9720: 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  st read..**.** T
9730: 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20  his plan is not 
9740: 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65  completely bulle
9750: 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20  t-proof.  It is 
9760: 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20  possible for.** 
9770: 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68  the schema to ch
9780: 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69  ange multiple ti
9790: 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20  mes and for the 
97a0: 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20  cookie to be.** 
97b0: 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f  set back to prio
97c0: 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63  r value.  But sc
97d0: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65  hema changes are
97e0: 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61   infrequent.** a
97f0: 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  nd the probabili
9800: 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68  ty of hitting th
9810: 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61  e same cookie va
9820: 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31  lue is only.** 1
9830: 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e   chance in 2^32.
9840: 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20    So we're safe 
9850: 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20  enough..*/.void 
9860: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
9870: 6b 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  kie(sqlite3 *db,
9880: 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 44   Vdbe *v, int iD
9890: 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b){.  sqlite3Vdb
98a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
98b0: 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44  eger, db->aDb[iD
98c0: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  b].pSchema->sche
98d0: 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 30 29 3b  ma_cookie+1, 0);
98e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
98f0: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
9900: 6b 69 65 2c 20 69 44 62 2c 20 30 29 3b 0a 7d 0a  kie, iDb, 0);.}.
9910: 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74  ./*.** Measure t
9920: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
9930: 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74  racters needed t
9940: 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76  o output the giv
9950: 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72  en.** identifier
9960: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65  .  The number re
9970: 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20  turned includes 
9980: 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a  any quotes used.
9990: 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  ** but does not 
99a0: 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c  include the null
99b0: 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a   terminator..**.
99c0: 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20  ** The estimate 
99d0: 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e  is conservative.
99e0: 20 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61    It might be la
99f0: 72 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69  rger that what i
9a00: 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64  s.** really need
9a10: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
9a20: 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f  t identLength(co
9a30: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
9a40: 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30  int n;.  for(n=0
9a50: 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b  ; *z; n++, z++){
9a60: 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27  .    if( *z=='"'
9a70: 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20   ){ n++; }.  }. 
9a80: 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d   return n + 2;.}
9a90: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  ../*.** Write an
9aa0: 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f   identifier onto
9ab0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
9ac0: 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41  given string.  A
9ad0: 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72  dd.** quote char
9ae0: 61 63 74 65 72 73 20 61 73 20 6e 65 65 64 65 64  acters as needed
9af0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9b00: 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a   identPut(char *
9b10: 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68  z, int *pIdx, ch
9b20: 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74  ar *zSignedIdent
9b30: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
9b40: 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e  ar *zIdent = (un
9b50: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69  signed char*)zSi
9b60: 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74  gnedIdent;.  int
9b70: 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65   i, j, needQuote
9b80: 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20  ;.  i = *pIdx;. 
9b90: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
9ba0: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  [j]; j++){.    i
9bb0: 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65  f( !isalnum(zIde
9bc0: 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74  nt[j]) && zIdent
9bd0: 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b  [j]!='_' ) break
9be0: 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74  ;.  }.  needQuot
9bf0: 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d  e =  zIdent[j]!=
9c00: 30 20 7c 7c 20 69 73 64 69 67 69 74 28 7a 49 64  0 || isdigit(zId
9c10: 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20  ent[0]).        
9c20: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
9c30: 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28  ite3KeywordCode(
9c40: 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49  zIdent, j)!=TK_I
9c50: 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f  D;.  if( needQuo
9c60: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  te ) z[i++] = '"
9c70: 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  ';.  for(j=0; zI
9c80: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
9c90: 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65     z[i++] = zIde
9ca0: 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a  nt[j];.    if( z
9cb0: 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20  Ident[j]=='"' ) 
9cc0: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
9cd0: 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  }.  if( needQuot
9ce0: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
9cf0: 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20  ;.  z[i] = 0;.  
9d00: 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a  *pIdx = i;.}../*
9d10: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43  .** Generate a C
9d20: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
9d30: 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74  ement appropriat
9d40: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
9d50: 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72  ** table.  Memor
9d60: 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65  y to hold the te
9d70: 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  xt of the statem
9d80: 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ent is obtained.
9d90: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ** from sqliteMa
9da0: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
9db0: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
9dc0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
9dd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
9de0: 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d   *createTableStm
9df0: 74 28 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20  t(Table *p, int 
9e00: 69 73 54 65 6d 70 29 7b 0a 20 20 69 6e 74 20 69  isTemp){.  int i
9e10: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
9e20: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
9e30: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
9e40: 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e  nd, *z;.  Column
9e50: 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b   *pCol;.  n = 0;
9e60: 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d  .  for(pCol = p-
9e70: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
9e80: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
9e90: 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64  ++){.    n += id
9ea0: 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e  entLength(pCol->
9eb0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20  zName);.    z = 
9ec0: 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20  pCol->zType;.   
9ed0: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20   if( z ){.      
9ee0: 6e 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 29 20  n += (strlen(z) 
9ef0: 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  + 1);.    }.  }.
9f00: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
9f10: 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  th(p->zName);.  
9f20: 69 66 28 20 6e 3c 35 30 20 29 7b 0a 20 20 20 20  if( n<50 ){.    
9f30: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a  zSep = "";.    z
9f40: 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20  Sep2 = ",";.    
9f50: 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65  zEnd = ")";.  }e
9f60: 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20  lse{.    zSep = 
9f70: 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70  "\n  ";.    zSep
9f80: 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20  2 = ",\n  ";.   
9f90: 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20   zEnd = "\n)";. 
9fa0: 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36   }.  n += 35 + 6
9fb0: 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d  *p->nCol;.  zStm
9fc0: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
9fd0: 52 61 77 28 20 6e 20 29 3b 0a 20 20 69 66 28 20  Raw( n );.  if( 
9fe0: 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72  zStmt==0 ) retur
9ff0: 6e 20 30 3b 0a 20 20 73 74 72 63 70 79 28 7a 53  n 0;.  strcpy(zS
a000: 74 6d 74 2c 20 21 4f 4d 49 54 5f 54 45 4d 50 44  tmt, !OMIT_TEMPD
a010: 42 26 26 69 73 54 65 6d 70 20 3f 20 22 43 52 45  B&&isTemp ? "CRE
a020: 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 22  ATE TEMP TABLE "
a030: 3a 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22  :"CREATE TABLE "
a040: 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28  );.  k = strlen(
a050: 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50  zStmt);.  identP
a060: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d  ut(zStmt, &k, p-
a070: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74  >zName);.  zStmt
a080: 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66  [k++] = '(';.  f
a090: 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c  or(pCol=p->aCol,
a0a0: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
a0b0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
a0c0: 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74     strcpy(&zStmt
a0d0: 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20  [k], zSep);.    
a0e0: 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74  k += strlen(&zSt
a0f0: 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70  mt[k]);.    zSep
a100: 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64   = zSep2;.    id
a110: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
a120: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCol->zName);.
a130: 20 20 20 20 69 66 28 20 28 7a 20 3d 20 70 43 6f      if( (z = pCo
a140: 6c 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29 7b 0a  l->zType)!=0 ){.
a150: 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d        zStmt[k++]
a160: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 73 74   = ' ';.      st
a170: 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20  rcpy(&zStmt[k], 
a180: 7a 29 3b 0a 20 20 20 20 20 20 6b 20 2b 3d 20 73  z);.      k += s
a190: 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 7d 0a  trlen(z);.    }.
a1a0: 20 20 7d 0a 20 20 73 74 72 63 70 79 28 26 7a 53    }.  strcpy(&zS
a1b0: 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20  tmt[k], zEnd);. 
a1c0: 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d   return zStmt;.}
a1d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
a1e0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
a1f0: 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e  o report the fin
a200: 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d  al ")" that term
a210: 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41  inates.** a CREA
a220: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
a230: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  nt..**.** The ta
a240: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
a250: 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20  at other action 
a260: 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65  routines have be
a270: 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69  en building.** i
a280: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  s added to the i
a290: 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62  nternal hash tab
a2a0: 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f  les, assuming no
a2b0: 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20   errors have.** 
a2c0: 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  occurred..**.** 
a2d0: 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  An entry for the
a2e0: 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69   table is made i
a2f0: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  n the master tab
a300: 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65  le on disk, unle
a310: 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20  ss.** this is a 
a320: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
a330: 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  or db->init.busy
a340: 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69  ==1.  When db->i
a350: 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69  nit.busy==1.** i
a360: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
a370: 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74  eading the sqlit
a380: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62  e_master table b
a390: 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a  ecause we just.*
a3a0: 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74  * connected to t
a3b0: 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62  he database or b
a3c0: 65 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74  ecause the sqlit
a3d0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68  e_master table h
a3e0: 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63  as.** recently c
a3f0: 68 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65  hanged, so the e
a400: 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61  ntry for this ta
a410: 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ble already exis
a420: 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c  ts in.** the sql
a430: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
a440: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e  .  We do not wan
a450: 74 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61  t to create it a
a460: 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  gain..**.** If t
a470: 68 65 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d  he pSelect argum
a480: 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ent is not NULL,
a490: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
a4a0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77  his routine.** w
a4b0: 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  as called to cre
a4c0: 61 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65  ate a table gene
a4d0: 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a  rated from a .**
a4e0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e   "CREATE TABLE .
a4f0: 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  .. AS SELECT ...
a500: 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  " statement.  Th
a510: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f  e column names o
a520: 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62  f.** the new tab
a530: 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68  le will match th
a540: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
a550: 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
a560: 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61  oid sqlite3EndTa
a570: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
a580: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
a590: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
a5a0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e  */.  Token *pCon
a5b0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
a5c0: 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66  The ',' token af
a5d0: 74 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c  ter the last col
a5e0: 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54  umn defn. */.  T
a5f0: 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20  oken *pEnd,     
a600: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
a610: 6e 61 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69 6e  nal ')' token in
a620: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
a630: 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  E */.  Select *p
a640: 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f  Select         /
a650: 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20  * Select from a 
a660: 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53  "CREATE ... AS S
a670: 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54  ELECT" */.){.  T
a680: 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74  able *p;.  sqlit
a690: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
a6a0: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
a6b0: 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20  .  if( (pEnd==0 
a6c0: 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c  && pSelect==0) |
a6d0: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
a6e0: 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  | sqlite3MallocF
a6f0: 61 69 6c 65 64 28 29 20 29 20 7b 0a 20 20 20 20  ailed() ) {.    
a700: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20  return;.  }.  p 
a710: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
a720: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
a730: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
a740: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
a750: 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20  usy || !pSelect 
a760: 29 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  );..  iDb = sqli
a770: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
a780: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
a790: 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64  pSchema);..#ifnd
a7a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
a7b0: 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76  HECK.  /* Resolv
a7c0: 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43  e names in all C
a7d0: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
a7e0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a  expressions..  *
a7f0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63  /.  if( p->pChec
a800: 6b 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  k ){.    SrcList
a810: 20 73 53 72 63 3b 20 20 20 20 20 20 20 20 20 20   sSrc;          
a820: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65           /* Fake
a830: 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70 50 61   SrcList for pPa
a840: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a  rse->pNewTable *
a850: 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  /.    NameContex
a860: 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20  t sNC;          
a870: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f        /* Name co
a880: 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72 73 65  ntext for pParse
a890: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 0a  ->pNewTable */..
a8a0: 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c      memset(&sNC,
a8b0: 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
a8c0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 53  ;.    memset(&sS
a8d0: 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  rc, 0, sizeof(sS
a8e0: 72 63 29 29 3b 0a 20 20 20 20 73 53 72 63 2e 6e  rc));.    sSrc.n
a8f0: 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 53 72  Src = 1;.    sSr
a900: 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70  c.a[0].zName = p
a910: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 53 72  ->zName;.    sSr
a920: 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70 3b  c.a[0].pTab = p;
a930: 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69  .    sSrc.a[0].i
a940: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 20  Cursor = -1;.   
a950: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
a960: 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
a970: 72 63 4c 69 73 74 20 3d 20 26 73 53 72 63 3b 0a  rcList = &sSrc;.
a980: 20 20 20 20 73 4e 43 2e 69 73 43 68 65 63 6b 20      sNC.isCheck 
a990: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 1;.    if( sql
a9a0: 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
a9b0: 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 43  ames(&sNC, p->pC
a9c0: 68 65 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72  heck) ){.      r
a9d0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
a9e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
a9f0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
aa00: 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20  CHECK) */..  /* 
aa10: 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  If the db->init.
aa20: 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61  busy is 1 it mea
aa30: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
aa40: 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68  g the SQL off th
aa50: 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d  e.  ** "sqlite_m
aa60: 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74  aster" or "sqlit
aa70: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74  e_temp_master" t
aa80: 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b  able on the disk
aa90: 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74  ..  ** So do not
aaa0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69   write to the di
aab0: 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61  sk again.  Extra
aac0: 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ct the root page
aad0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72   number.  ** for
aae0: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
aaf0: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  the db->init.new
ab00: 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68  Tnum field.  (Th
ab10: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  e page number.  
ab20: 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  ** should have b
ab30: 65 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79  een put there by
ab40: 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43   the sqliteOpenC
ab50: 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f  b routine.).  */
ab60: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
ab70: 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74  busy ){.    p->t
ab80: 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
ab90: 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f  ewTnum;.  }..  /
aba0: 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c  * If not initial
abb0: 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61  izing, then crea
abc0: 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20  te a record for 
abd0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20  the new table.  
abe0: 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  ** in the SQLITE
abf0: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66  _MASTER table of
ac00: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
ac10: 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  The record numbe
ac20: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e  r.  ** for the n
ac30: 65 77 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73  ew table entry s
ac40: 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65  hould already be
ac50: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   on the stack.. 
ac60: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   **.  ** If this
ac70: 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20   is a TEMPORARY 
ac80: 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65  table, write the
ac90: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
aca0: 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66  auxiliary.  ** f
acb0: 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ile instead of i
acc0: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
acd0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
ace0: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
acf0: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74  .busy ){.    int
ad00: 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   n;.    Vdbe *v;
ad10: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
ad20: 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f  ;    /* "view" o
ad30: 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20  r "table" */.   
ad40: 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20   char *zType2;  
ad50: 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54   /* "VIEW" or "T
ad60: 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61  ABLE" */.    cha
ad70: 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20  r *zStmt;    /* 
ad80: 54 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  Text of the CREA
ad90: 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41  TE TABLE or CREA
ada0: 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
adb0: 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71  t */..    v = sq
adc0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
add0: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
ade0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
adf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ae00: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
ae10: 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  0, 0);..    /* C
ae20: 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61  reate the rootpa
ae30: 67 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  ge for the new t
ae40: 61 62 6c 65 20 61 6e 64 20 70 75 73 68 20 69 74  able and push it
ae50: 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e   onto the stack.
ae60: 0a 20 20 20 20 2a 2a 20 41 20 76 69 65 77 20 68  .    ** A view h
ae70: 61 73 20 6e 6f 20 72 6f 6f 74 70 61 67 65 2c 20  as no rootpage, 
ae80: 73 6f 20 6a 75 73 74 20 70 75 73 68 20 61 20 7a  so just push a z
ae90: 65 72 6f 20 6f 6e 74 6f 20 74 68 65 20 73 74 61  ero onto the sta
aea0: 63 6b 20 66 6f 72 0a 20 20 20 20 2a 2a 20 76 69  ck for.    ** vi
aeb0: 65 77 73 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65  ews.  Initialize
aec0: 20 7a 54 79 70 65 20 61 74 20 74 68 65 20 73 61   zType at the sa
aed0: 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a  me time..    */.
aee0: 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65      if( p->pSele
aef0: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ct==0 ){.      /
af00: 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c  * A regular tabl
af10: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65  e */.      zType
af20: 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20   = "table";.    
af30: 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c    zType2 = "TABL
af40: 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  E";.#ifndef SQLI
af50: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20  TE_OMIT_VIEW.   
af60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
af70: 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20   A view */.     
af80: 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b   zType = "view";
af90: 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20  .      zType2 = 
afa0: 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20  "VIEW";.#endif. 
afb0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
afc0: 74 68 69 73 20 69 73 20 61 20 43 52 45 41 54 45  this is a CREATE
afd0: 20 54 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c   TABLE xx AS SEL
afe0: 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65  ECT ..., execute
aff0: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
b000: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  ** statement to 
b010: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77  populate the new
b020: 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74   table. The root
b030: 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72  -page number for
b040: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20   the.    ** new 
b050: 74 61 62 6c 65 20 69 73 20 6f 6e 20 74 68 65 20  table is on the 
b060: 74 6f 70 20 6f 66 20 74 68 65 20 76 64 62 65 20  top of the vdbe 
b070: 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20  stack..    **.  
b080: 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45    ** Once the SE
b090: 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f  LECT has been co
b0a0: 64 65 64 20 62 79 20 73 71 6c 69 74 65 33 53 65  ded by sqlite3Se
b0b0: 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e  lect(), it is in
b0c0: 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62   a.    ** suitab
b0d0: 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75 65 72  le state to quer
b0e0: 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  y for the column
b0f0: 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73   names and types
b100: 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20   to be used.    
b110: 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74 61  ** by the new ta
b120: 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ble..    **.    
b130: 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63 68  ** A shared-cach
b140: 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20  e write-lock is 
b150: 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20  not required to 
b160: 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77  write to the new
b170: 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61   table,.    ** a
b180: 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20  s a schema-lock 
b190: 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
b1a0: 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  y been obtained 
b1b0: 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53 69  to create it. Si
b1c0: 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68  nce.    ** a sch
b1d0: 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65  ema-lock exclude
b1e0: 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61  s all other data
b1f0: 62 61 73 65 20 75 73 65 72 73 2c 20 74 68 65 20  base users, the 
b200: 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64  write-lock would
b210: 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e  .    ** be redun
b220: 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  dant..    */.   
b230: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
b240: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65        Table *pSe
b250: 6c 54 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69  lTab;.      sqli
b260: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b270: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
b280: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b290: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
b2a0: 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  ger, iDb, 0);.  
b2b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b2c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  ddOp(v, OP_OpenW
b2d0: 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  rite, 1, 0);.   
b2e0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
b2f0: 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 2;.      sqlit
b300: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
b310: 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 61   pSelect, SRT_Ta
b320: 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c  ble, 1, 0, 0, 0,
b330: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
b340: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b350: 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a  P_Close, 1, 0);.
b360: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
b370: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
b380: 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73       pSelTab = s
b390: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
b3a0: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
b3b0: 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  0, pSelect);.   
b3c0: 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62       if( pSelTab
b3d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
b3e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
b3f0: 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
b400: 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53      p->nCol = pS
b410: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
b420: 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70       p->aCol = p
b430: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
b440: 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e        pSelTab->n
b450: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
b460: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
b470: 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
b480: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30  te3DeleteTable(0
b490: 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
b4a0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
b4b0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
b4c0: 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
b4d0: 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
b4e0: 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ent */.    if( p
b4f0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
b500: 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61  zStmt = createTa
b510: 62 6c 65 53 74 6d 74 28 70 2c 20 70 2d 3e 70 53  bleStmt(p, p->pS
b520: 63 68 65 6d 61 3d 3d 70 50 61 72 73 65 2d 3e 64  chema==pParse->d
b530: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
b540: 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  a);.    }else{. 
b550: 20 20 20 20 20 6e 20 3d 20 70 45 6e 64 2d 3e 7a       n = pEnd->z
b560: 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65   - pParse->sName
b570: 54 6f 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20 20 20  Token.z + 1;.   
b580: 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
b590: 65 33 4d 50 72 69 6e 74 66 28 22 43 52 45 41 54  e3MPrintf("CREAT
b5a0: 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70  E %s %.*s", zTyp
b5b0: 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73  e2, n, pParse->s
b5c0: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20  NameToken.z);.  
b5d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c    }..    /* A sl
b5e0: 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72  ot for the recor
b5f0: 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  d has already be
b600: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  en allocated in 
b610: 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49  the .    ** SQLI
b620: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
b630: 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74    We just need t
b640: 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c  o update that sl
b650: 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20  ot with all.    
b660: 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  ** the informati
b670: 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74  on we've collect
b680: 65 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 66  ed.  The rowid f
b690: 6f 72 20 74 68 65 20 70 72 65 61 6c 6c 6f 63 61  or the prealloca
b6a0: 74 65 64 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20  ted.    ** slot 
b6b0: 69 73 20 74 68 65 20 32 6e 64 20 69 74 65 6d 20  is the 2nd item 
b6c0: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54  on the stack.  T
b6d0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
b6e0: 61 63 6b 20 69 73 20 74 68 65 0a 20 20 20 20 2a  ack is the.    *
b6f0: 2a 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20  * root page for 
b700: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28 6f  the new table (o
b710: 72 20 61 20 30 20 69 66 20 74 68 69 73 20 69 73  r a 0 if this is
b720: 20 61 20 76 69 65 77 29 2e 0a 20 20 20 20 2a 2f   a view)..    */
b730: 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
b740: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
b750: 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51        "UPDATE %Q
b760: 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22  .%s ".         "
b770: 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e  SET type='%s', n
b780: 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65  ame=%Q, tbl_name
b790: 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 30  =%Q, rootpage=#0
b7a0: 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20  , sql=%Q ".     
b7b0: 20 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23    "WHERE rowid=#
b7c0: 31 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44  1",.      db->aD
b7d0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
b7e0: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
b7f0: 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20  .      zType,.  
b800: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20      p->zName,.  
b810: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20      p->zName,.  
b820: 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b      zStmt.    );
b830: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
b840: 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  zStmt);.    sqli
b850: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
b860: 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 0a 23 69  db, v, iDb);..#i
b870: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b880: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
b890: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
b8a0: 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  see if we need t
b8b0: 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  o create an sqli
b8c0: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
b8d0: 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65  e for.    ** kee
b8e0: 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75  ping track of au
b8f0: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73  toincrement keys
b900: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
b910: 20 70 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20   p->autoInc ){. 
b920: 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26       Db *pDb = &
b930: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
b940: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63      if( pDb->pSc
b950: 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30  hema->pSeqTab==0
b960: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
b970: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
b980: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
b990: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25   "CREATE TABLE %
b9a0: 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  Q.sqlite_sequenc
b9b0: 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20  e(name,seq)",.  
b9c0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61          pDb->zNa
b9d0: 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  me.        );.  
b9e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
b9f0: 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72  if..    /* Repar
ba00: 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f  se everything to
ba10: 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65   update our inte
ba20: 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74  rnal data struct
ba30: 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ures */.    sqli
ba40: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
ba50: 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44  _ParseSchema, iD
ba60: 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 73 71  b, 0,.        sq
ba70: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 74 62  lite3MPrintf("tb
ba80: 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e  l_name='%q'",p->
ba90: 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d  zName), P3_DYNAM
baa0: 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  IC);.  }...  /* 
bab0: 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f  Add the table to
bac0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
bad0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
bae0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
baf0: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
bb00: 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73  it.busy && pPars
bb10: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
bb20: 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20    Table *pOld;. 
bb30: 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20     FKey *pFKey; 
bb40: 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63  .    Schema *pSc
bb50: 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d  hema = p->pSchem
bb60: 61 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71  a;.    pOld = sq
bb70: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
bb80: 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  &pSchema->tblHas
bb90: 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72  h, p->zName, str
bba0: 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  len(p->zName)+1,
bbb0: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  p);.    if( pOld
bbc0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
bbd0: 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a  ( p==pOld );  /*
bbe0: 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
bbf0: 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20  e failed inside 
bc00: 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a  HashInsert() */.
bc10: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
bc20: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
bc30: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
bc40: 4b 45 59 0a 20 20 20 20 66 6f 72 28 70 46 4b 65  KEY.    for(pFKe
bc50: 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65  y=p->pFKey; pFKe
bc60: 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e  y; pFKey=pFKey->
bc70: 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20  pNextFrom){.    
bc80: 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c    int nTo = strl
bc90: 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b  en(pFKey->zTo) +
bca0: 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d   1;.      pFKey-
bcb0: 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74  >pNextTo = sqlit
bcc0: 65 33 48 61 73 68 46 69 6e 64 28 26 70 53 63 68  e3HashFind(&pSch
bcd0: 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65  ema->aFKey, pFKe
bce0: 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20  y->zTo, nTo);.  
bcf0: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
bd00: 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e  nsert(&pSchema->
bd10: 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54  aFKey, pFKey->zT
bd20: 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a  o, nTo, pFKey);.
bd30: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
bd40: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
bd50: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  le = 0;.    db->
bd60: 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62  nTable++;.    db
bd70: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
bd80: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
bd90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
bda0: 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45  _OMIT_ALTERTABLE
bdb0: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65  .    if( !p->pSe
bdc0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f  lect ){.      co
bdd0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
bde0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
bdf0: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
be00: 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20  en.z;.      int 
be10: 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73  nName;.      ass
be20: 65 72 74 28 20 21 70 53 65 6c 65 63 74 20 26 26  ert( !pSelect &&
be30: 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29   pCons && pEnd )
be40: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e  ;.      if( pCon
be50: 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  s->z==0 ){.     
be60: 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b     pCons = pEnd;
be70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
be80: 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
be90: 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20  ar *)pCons->z - 
bea0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70 2d 3e  zName;.      p->
beb0: 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31  addColOffset = 1
bec0: 33 20 2b 20 73 71 6c 69 74 65 33 75 74 66 38 43  3 + sqlite3utf8C
bed0: 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e  harLen(zName, nN
bee0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ame);.    }.#end
bef0: 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  if.  }.}..#ifnde
bf00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
bf10: 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72  EW./*.** The par
bf20: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
bf30: 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20  outine in order 
bf40: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
bf50: 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  VIEW.*/.void sql
bf60: 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a  ite3CreateView(.
bf70: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
bf80: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
bf90: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
bfa0: 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20   Token *pBegin, 
bfb0: 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
bfc0: 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
bfd0: 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ins the statemen
bfe0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
bff0: 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame1,     /* The
c000: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
c010: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
c020: 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  e view */.  Toke
c030: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
c040: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
c050: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
c060: 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
c070: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
c080: 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20  ,   /* A SELECT 
c090: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77  statement that w
c0a0: 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
c0b0: 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  ew view */.  int
c0c0: 20 69 73 54 65 6d 70 20 20 20 20 20 20 20 20 20   isTemp         
c0d0: 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45  /* TRUE for a TE
c0e0: 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a  MPORARY view */.
c0f0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
c100: 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20   int n;.  const 
c110: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
c120: 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  ;.  Token sEnd;.
c130: 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a    DbFixer sFix;.
c140: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a    Token *pName;.
c150: 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66    int iDb;..  if
c160: 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30  ( pParse->nVar>0
c170: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
c180: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
c190: 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20  "parameters are 
c1a0: 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76  not allowed in v
c1b0: 69 65 77 73 22 29 3b 0a 20 20 20 20 73 71 6c 69  iews");.    sqli
c1c0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
c1d0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
c1e0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
c1f0: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
c200: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
c210: 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c  ame2, isTemp, 1,
c220: 20 30 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73   0);.  p = pPars
c230: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
c240: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
c250: 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
c260: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
c270: 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ete(pSelect);.  
c280: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
c290: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
c2a0: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
c2b0: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
c2c0: 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  e);.  iDb = sqli
c2d0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
c2e0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
c2f0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 69 66 28 20  pSchema);.  if( 
c300: 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
c310: 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
c320: 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65  b, "view", pName
c330: 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  ).    && sqlite3
c340: 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c  FixSelect(&sFix,
c350: 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20   pSelect).  ){. 
c360: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
c370: 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b  Delete(pSelect);
c380: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
c390: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f  ..  /* Make a co
c3a0: 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  py of the entire
c3b0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c3c0: 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
c3d0: 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68  he view..  ** Th
c3e0: 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c  is will force al
c3f0: 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e  l the Expr.token
c400: 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  .z values to be 
c410: 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a  dynamically.  **
c420: 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65   allocated rathe
c430: 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20  r than point to 
c440: 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67  the input string
c450: 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74   - which means t
c460: 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69  hat.  ** they wi
c470: 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65 72  ll persist after
c480: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c   the current sql
c490: 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c  ite3_exec() call
c4a0: 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20   returns..  */. 
c4b0: 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71   p->pSelect = sq
c4c0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
c4d0: 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74  Select);.  sqlit
c4e0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
c4f0: 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 73  Select);.  if( s
c500: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
c510: 65 64 28 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ed() ){.    retu
c520: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  rn;.  }.  if( !p
c530: 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e  Parse->db->init.
c540: 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  busy ){.    sqli
c550: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
c560: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
c570: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
c580: 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
c590: 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
c5a0: 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73  atement.  Make s
c5b0: 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a  End point to.  *
c5c0: 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a  * the end..  */.
c5d0: 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d    sEnd = pParse-
c5e0: 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69  >sLastToken;.  i
c5f0: 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20  f( sEnd.z[0]!=0 
c600: 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b  && sEnd.z[0]!=';
c610: 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20  ' ){.    sEnd.z 
c620: 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20  += sEnd.n;.  }. 
c630: 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e   sEnd.n = 0;.  n
c640: 20 3d 20 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67   = sEnd.z - pBeg
c650: 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 28 63 6f  in->z;.  z = (co
c660: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
c670: 72 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20  r*)pBegin->z;.  
c680: 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a  while( n>0 && (z
c690: 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73  [n-1]==';' || is
c6a0: 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29  space(z[n-1])) )
c6b0: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e  { n--; }.  sEnd.
c6c0: 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73  z = &z[n-1];.  s
c6d0: 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a  End.n = 1;..  /*
c6e0: 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54   Use sqlite3EndT
c6f0: 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68  able() to add th
c700: 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51  e view to the SQ
c710: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
c720: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e  e */.  sqlite3En
c730: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30  dTable(pParse, 0
c740: 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72  , &sEnd, 0);.  r
c750: 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  eturn;.}.#endif 
c760: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
c770: 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  IEW */..#ifndef 
c780: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
c790: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  ./*.** The Table
c7a0: 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c   structure pTabl
c7b0: 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49  e is really a VI
c7c0: 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  EW.  Fill in the
c7d0: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
c7e0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
c7f0: 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62  view in the pTab
c800: 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  le structure.  R
c810: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
c820: 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  .** of errors.  
c830: 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73  If an error is s
c840: 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72  een leave an err
c850: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
c860: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
c870: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65  /.int sqlite3Vie
c880: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
c890: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
c8a0: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
c8b0: 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
c8c0: 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62     /* A fake tab
c8d0: 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65  le from which we
c8e0: 20 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   get the result 
c8f0: 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  set */.  Select 
c900: 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f  *pSel;     /* Co
c910: 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
c920: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
c930: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69   the view */.  i
c940: 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20  nt nErr = 0;    
c950: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
c960: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
c970: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
c980: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
c990: 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65  rarily holds the
c9a0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   number of curso
c9b0: 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 0a  rs assigned */..
c9c0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
c9d0: 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69   );..  /* A posi
c9e0: 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20  tive nCol means 
c9f0: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65  the columns name
ca00: 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20  s for this view 
ca10: 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  are.  ** already
ca20: 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69   known..  */.  i
ca30: 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  f( pTable->nCol>
ca40: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
ca50: 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e   /* A negative n
ca60: 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c  Col is a special
ca70: 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20   marker meaning 
ca80: 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72  that we are curr
ca90: 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e  ently.  ** tryin
caa0: 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  g to compute the
cab0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20   column names.  
cac0: 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73  If we enter this
cad0: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20   routine with.  
cae0: 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43  ** a negative nC
caf0: 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f  ol, it means two
cb00: 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66   or more views f
cb10: 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65  orm a loop, like
cb20: 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
cb30: 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
cb40: 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a   one AS SELECT *
cb50: 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20   FROM two;.  ** 
cb60: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
cb70: 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20  two AS SELECT * 
cb80: 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20  FROM one;.  **. 
cb90: 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
cba0: 69 73 20 65 72 72 6f 72 20 69 73 20 63 61 75 67  is error is caug
cbb0: 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e  ht previously an
cbc0: 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d so the followi
cbd0: 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f  ng test.  ** sho
cbe0: 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e  uld always fail.
cbf0: 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65    But we will le
cc00: 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20  ave it in place 
cc10: 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
cc20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
cc30: 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20  le->nCol<0 ){.  
cc40: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
cc50: 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20  g(pParse, "view 
cc60: 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79  %s is circularly
cc70: 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c   defined", pTabl
cc80: 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  e->zName);.    r
cc90: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61  eturn 1;.  }.  a
cca0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e  ssert( pTable->n
ccb0: 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Col>=0 );..  /* 
ccc0: 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
ccd0: 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20  ar, it means we 
cce0: 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
ccf0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e  the table names.
cd00: 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
cd10: 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
cd20: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
cd30: 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61  lect() will expa
cd40: 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20  nd any.  ** "*" 
cd50: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
cd60: 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74  results set of t
cd70: 68 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c  he view and will
cd80: 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a   assign cursors.
cd90: 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d    ** to the elem
cda0: 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d  ents of the FROM
cdb0: 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65   clause.  But we
cdc0: 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65   do not want the
cdd0: 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20  se changes.  ** 
cde0: 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e  to be permanent.
cdf0: 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61    So the computa
ce00: 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20  tion is done on 
ce10: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
ce20: 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d  LECT.  ** statem
ce30: 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
ce40: 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a   the view..  */.
ce50: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
ce60: 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70  ->pSelect );.  p
ce70: 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  Sel = sqlite3Sel
ce80: 65 63 74 44 75 70 28 70 54 61 62 6c 65 2d 3e 70  ectDup(pTable->p
ce90: 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 70  Select);.  if( p
cea0: 53 65 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  Sel ){.    n = p
ceb0: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20  Parse->nTab;.   
cec0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
ced0: 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
cee0: 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29  rse, pSel->pSrc)
cef0: 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43  ;.    pTable->nC
cf00: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 70 53 65  ol = -1;.    pSe
cf10: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
cf20: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
cf30: 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29  pParse, 0, pSel)
cf40: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54  ;.    pParse->nT
cf50: 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  ab = n;.    if( 
cf60: 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20  pSelTab ){.     
cf70: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
cf80: 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
cf90: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
cfa0: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
cfb0: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43        pTable->aC
cfc0: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
cfd0: 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61  ol;.      pSelTa
cfe0: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
cff0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
d000: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
d010: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30  te3DeleteTable(0
d020: 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
d030: 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
d040: 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55  a->flags |= DB_U
d050: 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20 20  nresetViews;.   
d060: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
d070: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
d080: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
d090: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53    }.    sqlite3S
d0a0: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
d0b0: 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  );.  } else {.  
d0c0: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20    nErr++;.  }.  
d0d0: 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
d0e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
d0f0: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
d100: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d110: 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43  MIT_VIEW./*.** C
d120: 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
d130: 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79  names from every
d140: 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73   VIEW in databas
d150: 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  e idx..*/.static
d160: 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77   void sqliteView
d170: 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33  ResetAll(sqlite3
d180: 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a   *db, int idx){.
d190: 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
d1a0: 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65   if( !DbHasPrope
d1b0: 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
d1c0: 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20  UnresetViews) ) 
d1d0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
d1e0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
d1f0: 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53  &db->aDb[idx].pS
d200: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
d210: 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e   i;i=sqliteHashN
d220: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62  ext(i)){.    Tab
d230: 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
d240: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
d250: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
d260: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
d270: 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iteResetColumnNa
d280: 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d  mes(pTab);.    }
d290: 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72  .  }.  DbClearPr
d2a0: 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20  operty(db, idx, 
d2b0: 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
d2c0: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
d2d0: 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  ne sqliteViewRes
d2e0: 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69  etAll(A,B).#endi
d2f0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
d300: 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VIEW */../*.** 
d310: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
d320: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56   called by the V
d330: 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68  DBE to adjust th
d340: 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  e internal schem
d350: 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c  a.** used by SQL
d360: 69 74 65 20 77 68 65 6e 20 74 68 65 20 62 74 72  ite when the btr
d370: 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61  ee layer moves a
d380: 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65   table root page
d390: 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61  . The.** root-pa
d3a0: 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  ge of a table or
d3b0: 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61   index in databa
d3c0: 73 65 20 69 44 62 20 68 61 73 20 63 68 61 6e 67  se iDb has chang
d3d0: 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a  ed from iFrom.**
d3e0: 20 74 6f 20 69 54 6f 2e 0a 2a 2f 0a 23 69 66 6e   to iTo..*/.#ifn
d3f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d400: 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20  AUTOVACUUM.void 
d410: 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d  sqlite3RootPageM
d420: 6f 76 65 64 28 44 62 20 2a 70 44 62 2c 20 69 6e  oved(Db *pDb, in
d430: 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
d440: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  ){.  HashElem *p
d450: 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48  Elem;.  Hash *pH
d460: 61 73 68 3b 0a 0a 20 20 70 48 61 73 68 20 3d 20  ash;..  pHash = 
d470: 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
d480: 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45  blHash;.  for(pE
d490: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
d4a0: 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
d4b0: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
d4c0: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
d4d0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
d4e0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
d4f0: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
d500: 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pTab->tnum==iF
d510: 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61  rom ){.      pTa
d520: 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  b->tnum = iTo;. 
d530: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
d540: 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d   }.  }.  pHash =
d550: 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e   &pDb->pSchema->
d560: 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  idxHash;.  for(p
d570: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
d580: 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c  irst(pHash); pEl
d590: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
d5a0: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
d5b0: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
d5c0: 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  x = sqliteHashDa
d5d0: 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69  ta(pElem);.    i
d5e0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69  f( pIdx->tnum==i
d5f0: 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49  From ){.      pI
d600: 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a  dx->tnum = iTo;.
d610: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
d620: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
d630: 28 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  (0);.}.#endif../
d640: 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20  *.** Write code 
d650: 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62  to erase the tab
d660: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
d670: 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61  e iTable from da
d680: 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41  tabase iDb..** A
d690: 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74  lso write code t
d6a0: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c  o modify the sql
d6b0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
d6c0: 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63   and internal sc
d6d0: 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f  hema.** if a roo
d6e0: 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65  t-page of anothe
d6f0: 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64  r table is moved
d700: 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61   by the btree-la
d710: 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72  yer whilst.** er
d720: 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68  asing iTable (th
d730: 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69  is can happen wi
d740: 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  th an auto-vacuu
d750: 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20  m database)..*/ 
d760: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
d770: 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72  troyRootPage(Par
d780: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
d790: 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29  iTable, int iDb)
d7a0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
d7b0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
d7c0: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
d7d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
d7e0: 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20  estroy, iTable, 
d7f0: 69 44 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  iDb);.#ifndef SQ
d800: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
d810: 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73  CUUM.  /* OP_Des
d820: 74 72 6f 79 20 70 75 73 68 65 73 20 61 6e 20 69  troy pushes an i
d830: 6e 74 65 67 65 72 20 6f 6e 74 6f 20 74 68 65 20  nteger onto the 
d840: 73 74 61 63 6b 2e 20 49 66 20 74 68 69 73 20 69  stack. If this i
d850: 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e  nteger.  ** is n
d860: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74  on-zero, then it
d870: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
d880: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61  e number of a ta
d890: 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a  ble moved to.  *
d8a0: 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c  * location iTabl
d8b0: 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e. The following
d8c0: 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74   code modifies t
d8d0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
d8e0: 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72   table to.  ** r
d8f0: 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a  eflect this..  *
d900: 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 30 22 20  *.  ** The "#0" 
d910: 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61 20  in the SQL is a 
d920: 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74  special constant
d930: 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74   that means what
d940: 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20  ever value.  ** 
d950: 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  is on the top of
d960: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 53 65 65   the stack.  See
d970: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
d980: 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 73  Expr()..  */.  s
d990: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
d9a0: 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
d9b0: 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45  "UPDATE %Q.%s SE
d9c0: 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48  T rootpage=%d WH
d9d0: 45 52 45 20 23 30 20 41 4e 44 20 72 6f 6f 74 70  ERE #0 AND rootp
d9e0: 61 67 65 3d 23 30 22 2c 0a 20 20 20 20 20 70 50  age=#0",.     pP
d9f0: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
da00: 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
da10: 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54 61  _TABLE(iDb), iTa
da20: 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ble);.#endif.}..
da30: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45  /*.** Write VDBE
da40: 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74   code to erase t
da50: 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c  able pTab and al
da60: 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64  l associated ind
da70: 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a  ices on disk..**
da80: 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20   Code to update 
da90: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
daa0: 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74  r tables and int
dab0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66  ernal schema def
dac0: 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63  initions.** in c
dad0: 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20  ase a root-page 
dae0: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f  belonging to ano
daf0: 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
db00: 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
db10: 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73   layer.** is als
db20: 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61  o added (this ca
db30: 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e  n happen with an
db40: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
db50: 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  abase)..*/.stati
db60: 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61  c void destroyTa
db70: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
db80: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  e, Table *pTab){
db90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
dba0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
dbb0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
dbc0: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
dbd0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
dbe0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
dbf0: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73  >pSchema);.  des
dc00: 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
dc10: 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  rse, pTab->tnum,
dc20: 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64   iDb);.  for(pId
dc30: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
dc40: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
dc50: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73  >pNext){.    des
dc60: 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
dc70: 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  rse, pIdx->tnum,
dc80: 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65   iDb);.  }.#else
dc90: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
dca0: 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74  abase may be aut
dcb0: 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65  o-vacuum capable
dcc0: 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54   (if SQLITE_OMIT
dcd0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a  _AUTOVACUUM.  **
dce0: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29   is not defined)
dcf0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70  , then it is imp
dd00: 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f  ortant to call O
dd10: 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65  P_Destroy on the
dd20: 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  .  ** table and 
dd30: 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73  index root-pages
dd40: 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74   in order, start
dd50: 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d  ing with the num
dd60: 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c  erically .  ** l
dd70: 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
dd80: 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75   number. This gu
dd90: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f  arantees that no
dda0: 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70  ne of the root-p
ddb0: 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  ages.  ** to be 
ddc0: 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c  destroyed is rel
ddd0: 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72  ocated by an ear
dde0: 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e  lier OP_Destroy.
ddf0: 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a   i.e. if the.  *
de00: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65  * following were
de10: 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a   coded:.  **.  *
de20: 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30  * OP_Destroy 4 0
de30: 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f  .  ** ....  ** O
de40: 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20  P_Destroy 5 0.  
de50: 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74  **.  ** and root
de60: 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64   page 5 happened
de70: 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65   to be the large
de80: 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  st root-page num
de90: 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ber in the.  ** 
dea0: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72  database, then r
deb0: 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64  oot page 5 would
dec0: 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67   be moved to pag
ded0: 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a  e 4 by the .  **
dee0: 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30   "OP_Destroy 4 0
def0: 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75  " opcode. The su
df00: 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73  bsequent "OP_Des
df10: 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20  troy 5 0" would 
df20: 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d  hit.  ** a free-
df30: 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  list page..  */.
df40: 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61    int iTab = pTa
df50: 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69  b->tnum;.  int i
df60: 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a  Destroyed = 0;..
df70: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
df80: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
df90: 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20     int iLargest 
dfa0: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44  = 0;..    if( iD
dfb0: 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69  estroyed==0 || i
dfc0: 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29  Tab<iDestroyed )
dfd0: 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74  {.      iLargest
dfe0: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20   = iTab;.    }. 
dff0: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
e000: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
e010: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
e020: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64  ){.      int iId
e030: 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a  x = pIdx->tnum;.
e040: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
e050: 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  dx->pSchema==pTa
e060: 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
e070: 20 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f      if( (iDestro
e080: 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c  yed==0 || (iIdx<
e090: 69 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20  iDestroyed)) && 
e0a0: 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b  iIdx>iLargest ){
e0b0: 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73  .        iLarges
e0c0: 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20  t = iIdx;.      
e0d0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
e0e0: 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20  iLargest==0 ){. 
e0f0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
e100: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
e110: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
e120: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
e130: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
e140: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 64  Schema);.      d
e150: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
e160: 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c  Parse, iLargest,
e170: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65   iDb);.      iDe
e180: 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65  stroyed = iLarge
e190: 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  st;.    }.  }.#e
e1a0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif.}../*.** Th
e1b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
e1c0: 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77  lled to do the w
e1d0: 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41  ork of a DROP TA
e1e0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
e1f0: 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e  * pName is the n
e200: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
e210: 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a   to be dropped..
e220: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
e230: 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  ropTable(Parse *
e240: 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
e250: 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69  *pName, int isVi
e260: 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a  ew, int noErr){.
e270: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
e280: 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
e290: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
e2a0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
e2b0: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
e2c0: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d  nErr || sqlite3M
e2d0: 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b  allocFailed() ){
e2e0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
e2f0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
e300: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
e310: 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61  nSrc==1 );.  pTa
e320: 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
e330: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  eTable(pParse, p
e340: 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
e350: 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
e360: 61 74 61 62 61 73 65 29 3b 0a 0a 20 20 69 66 28  atabase);..  if(
e370: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
e380: 69 66 28 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20  if( noErr ){.   
e390: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 43     sqlite3ErrorC
e3a0: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
e3b0: 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 65 78 69    }.    goto exi
e3c0: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
e3d0: 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
e3e0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
e3f0: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
e400: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
e410: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
e420: 44 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Db );.#ifndef SQ
e430: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
e440: 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
e450: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f  int code;.    co
e460: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
e470: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
e480: 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  b);.    const ch
e490: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
e4a0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
e4b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
e4c0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
e4d0: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54  QLITE_DELETE, zT
e4e0: 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20  ab, 0, zDb)){.  
e4f0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
e500: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
e510: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
e520: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
e530: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
e540: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
e550: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
e560: 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20  _TEMP_VIEW;.    
e570: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e580: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
e590: 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  ROP_VIEW;.      
e5a0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
e5b0: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
e5c0: 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
e5d0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
e5e0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
e5f0: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65  _TABLE;.      }e
e600: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
e610: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
e620: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20  TABLE;.      }. 
e630: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
e640: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
e650: 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62  arse, code, pTab
e660: 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
e670: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
e680: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
e690: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
e6a0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
e6b0: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
e6c0: 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  LETE, 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 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
e710: 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20   pTab->readOnly 
e720: 7c 7c 20 70 54 61 62 3d 3d 64 62 2d 3e 61 44 62  || pTab==db->aDb
e730: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 70  [iDb].pSchema->p
e740: 53 65 71 54 61 62 20 29 7b 0a 20 20 20 20 73 71  SeqTab ){.    sq
e750: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
e760: 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
e770: 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70  may not be dropp
e780: 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
e790: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
e7a0: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
e7b0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e7c0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20  _OMIT_VIEW.  /* 
e7d0: 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c  Ensure DROP TABL
e7e0: 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e  E is not used on
e7f0: 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f   a view, and DRO
e800: 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73  P VIEW is not us
e810: 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62  ed.  ** on a tab
e820: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  le..  */.  if( i
e830: 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
e840: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
e850: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
e860: 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
e870: 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65  OP TABLE to dele
e880: 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54  te table %s", pT
e890: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
e8a0: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
e8b0: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
e8c0: 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d  !isView && pTab-
e8d0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
e8e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
e8f0: 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
e900: 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65  P VIEW to delete
e910: 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d   view %s", pTab-
e920: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
e930: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
e940: 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
e950: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
e960: 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
e970: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d  table from the m
e980: 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a  aster table.  **
e990: 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
e9a0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
e9b0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
e9c0: 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72 69 67  f( v ){.    Trig
e9d0: 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20  ger *pTrigger;. 
e9e0: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
e9f0: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20  ->aDb[iDb];.    
ea00: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
ea10: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
ea20: 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 20 20 20  e, 0, iDb);..   
ea30: 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69   /* Drop all tri
ea40: 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64  ggers associated
ea50: 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
ea60: 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43  being dropped. C
ea70: 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73 20 67 65  ode.    ** is ge
ea80: 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76  nerated to remov
ea90: 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73  e entries from s
eaa0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64  qlite_master and
eab0: 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  /or.    ** sqlit
eac0: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66  e_temp_master if
ead0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
eae0: 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  /.    pTrigger =
eaf0: 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b   pTab->pTrigger;
eb00: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54 72 69  .    while( pTri
eb10: 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73  gger ){.      as
eb20: 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e  sert( pTrigger->
eb30: 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
eb40: 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20  Schema || .     
eb50: 20 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70       pTrigger->p
eb60: 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b  Schema==db->aDb[
eb70: 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  1].pSchema );.  
eb80: 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54      sqlite3DropT
eb90: 72 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65  riggerPtr(pParse
eba0: 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20  , pTrigger);.   
ebb0: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
ebc0: 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  rigger->pNext;. 
ebd0: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
ebe0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
ebf0: 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52  CREMENT.    /* R
ec00: 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65  emove any entrie
ec10: 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  s of the sqlite_
ec20: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61  sequence table a
ec30: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20  ssociated with. 
ec40: 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20     ** the table 
ec50: 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54  being dropped. T
ec60: 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f  his is done befo
ec70: 72 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  re the table is 
ec80: 64 72 6f 70 70 65 64 0a 20 20 20 20 2a 2a 20 61  dropped.    ** a
ec90: 74 20 74 68 65 20 62 74 72 65 65 20 6c 65 76 65  t the btree leve
eca0: 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  l, in case the s
ecb0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
ecc0: 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20  able needs to.  
ecd0: 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72    ** move as a r
ece0: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f  esult of the dro
ecf0: 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e  p (can happen in
ed00: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
ed10: 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  e)..    */.    i
ed20: 66 28 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63  f( pTab->autoInc
ed30: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ed40: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
ed50: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45  rse,.        "DE
ed60: 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c  LETE FROM %s.sql
ed70: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45  ite_sequence WHE
ed80: 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20  RE name=%Q",.   
ed90: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c       pDb->zName,
eda0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20   pTab->zName.   
edb0: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64     );.    }.#end
edc0: 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20  if..    /* Drop 
edd0: 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  all SQLITE_MASTE
ede0: 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  R table and inde
edf0: 78 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72  x entries that r
ee00: 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20  efer to the.    
ee10: 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72  ** table. The pr
ee20: 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73  ogram name loops
ee30: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73   through the mas
ee40: 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65  ter table and de
ee50: 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65  letes.    ** eve
ee60: 72 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65  ry row that refe
ee70: 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66  rs to a table of
ee80: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
ee90: 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a  s the one being.
eea0: 20 20 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20      ** dropped. 
eeb0: 54 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e  Triggers are han
eec0: 64 6c 65 64 20 73 65 70 65 72 61 74 65 6c 79 20  dled seperately 
eed0: 62 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65  because a trigge
eee0: 72 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20  r can be.    ** 
eef0: 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74  created in the t
ef00: 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61  emp database tha
ef10: 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
ef20: 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20  ble in another. 
ef30: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a     ** database..
ef40: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
ef50: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
ef60: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22  arse, .        "
ef70: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
ef80: 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65  s WHERE tbl_name
ef90: 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74  =%Q and type!='t
efa0: 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20  rigger'",.      
efb0: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43    pDb->zName, SC
efc0: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
efd0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
efe0: 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29     if( !isView )
eff0: 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 54  {.      destroyT
f000: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
f010: 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  b);.    }..    /
f020: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62  * Remove the tab
f030: 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51  le entry from SQ
f040: 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20  Lite's internal 
f050: 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66  schema and modif
f060: 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68  y.    ** the sch
f070: 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20 20  ema cookie..    
f080: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
f090: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70  beOp3(v, OP_Drop
f0a0: 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 70  Table, iDb, 0, p
f0b0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
f0c0: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
f0d0: 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69  eCookie(db, v, i
f0e0: 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  Db);.  }.  sqlit
f0f0: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62  eViewResetAll(db
f100: 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72  , iDb);..exit_dr
f110: 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69  op_table:.  sqli
f120: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
f130: 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pName);.}../*.*
f140: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
f150: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
f160: 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e  te a new foreign
f170: 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c   key on the tabl
f180: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  e.** currently u
f190: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
f1a0: 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74  n.  pFromCol det
f1b0: 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f  ermines which co
f1c0: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
f1d0: 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f  current table po
f1e0: 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69  int to the forei
f1f0: 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f  gn key.  If pFro
f200: 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  mCol==0 then.** 
f210: 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20  connect the key 
f220: 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  to the last colu
f230: 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54  mn inserted.  pT
f240: 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
f250: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65  .** the table re
f260: 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43  ferred to.  pToC
f270: 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ol is a list of 
f280: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74  tables in the ot
f290: 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65  her.** pTo table
f2a0: 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67   that the foreig
f2b0: 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e  n key points to.
f2c0: 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
f2d0: 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
f2e0: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
f2f0: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
f300: 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
f310: 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
f320: 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
f330: 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
f340: 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
f350: 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
f360: 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
f370: 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
f380: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
f390: 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
f3a0: 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
f3b0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
f3c0: 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20  field.  The new 
f3d0: 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c  FKey.** is not l
f3e0: 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61  inked into db->a
f3f0: 46 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f 69  FKey at this poi
f400: 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e  nt - that does n
f410: 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74  ot happen.** unt
f420: 69 6c 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  il sqlite3EndTab
f430: 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  le()..**.** The 
f440: 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73  foreign key is s
f450: 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45  et for IMMEDIATE
f460: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20   processing.  A 
f470: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a  subsequent call.
f480: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66  ** to sqlite3Def
f490: 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d  erForeignKey() m
f4a0: 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73  ight change this
f4b0: 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f   to DEFERRED..*/
f4c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
f4d0: 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20  ateForeignKey(. 
f4e0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
f4f0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
f500: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
f510: 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c  prList *pFromCol
f520: 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e  ,  /* Columns in
f530: 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74   this table that
f540: 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20   point to other 
f550: 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  table */.  Token
f560: 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20   *pTo,          
f570: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
f580: 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
f590: 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c  ExprList *pToCol
f5a0: 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ,    /* Columns 
f5b0: 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  in the other tab
f5c0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
f5d0: 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
f5e0: 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  Conflict resolut
f5f0: 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20  ion algorithms. 
f600: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
f610: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
f620: 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46  N_KEY.  FKey *pF
f630: 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65  Key = 0;.  Table
f640: 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   *p = pParse->pN
f650: 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e  ewTable;.  int n
f660: 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Byte;.  int i;. 
f670: 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61   int nCol;.  cha
f680: 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28  r *z;..  assert(
f690: 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28   pTo!=0 );.  if(
f6a0: 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
f6b0: 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f  >nErr ) goto fk_
f6c0: 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  end;.  if( pFrom
f6d0: 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Col==0 ){.    in
f6e0: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c  t iCol = p->nCol
f6f0: 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  -1;.    if( iCol
f700: 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  <0 ) goto fk_end
f710: 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c  ;.    if( pToCol
f720: 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
f730: 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  r!=1 ){.      sq
f740: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
f750: 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b  arse, "foreign k
f760: 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20  ey on %s".      
f770: 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65     " should refe
f780: 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63  rence only one c
f790: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25  olumn of table %
f7a0: 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e  T",.         p->
f7b0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
f7c0: 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f  , pTo);.      go
f7d0: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d  to fk_end;.    }
f7e0: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20  .    nCol = 1;. 
f7f0: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f   }else if( pToCo
f800: 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
f810: 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  pr!=pFromCol->nE
f820: 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
f830: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
f840: 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62  e,.        "numb
f850: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
f860: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65   foreign key doe
f870: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
f880: 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20  number of ".    
f890: 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20      "columns in 
f8a0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
f8b0: 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f  able");.    goto
f8c0: 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65   fk_end;.  }else
f8d0: 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72  {.    nCol = pFr
f8e0: 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20  omCol->nExpr;.  
f8f0: 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  }.  nByte = size
f900: 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f  of(*pFKey) + nCo
f910: 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e  l*sizeof(pFKey->
f920: 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e  aCol[0]) + pTo->
f930: 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f  n + 1;.  if( pTo
f940: 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
f950: 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45  =0; i<pToCol->nE
f960: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
f970: 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e   nByte += strlen
f980: 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
f990: 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a  ame) + 1;.    }.
f9a0: 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71    }.  pFKey = sq
f9b0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74  liteMalloc( nByt
f9c0: 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79  e );.  if( pFKey
f9d0: 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  ==0 ) goto fk_en
f9e0: 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f  d;.  pFKey->pFro
f9f0: 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e  m = p;.  pFKey->
fa00: 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70  pNextFrom = p->p
fa10: 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61  FKey;.  z = (cha
fa20: 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20  r*)&pFKey[1];.  
fa30: 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73  pFKey->aCol = (s
fa40: 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a  truct sColMap*)z
fa50: 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28  ;.  z += sizeof(
fa60: 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a  struct sColMap)*
fa70: 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a  nCol;.  pFKey->z
fa80: 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79  To = z;.  memcpy
fa90: 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d  (z, pTo->z, pTo-
faa0: 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d  >n);.  z[pTo->n]
fab0: 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f   = 0;.  z += pTo
fac0: 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e  ->n+1;.  pFKey->
fad0: 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70  pNextTo = 0;.  p
fae0: 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  FKey->nCol = nCo
faf0: 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  l;.  if( pFromCo
fb00: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65  l==0 ){.    pFKe
fb10: 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d  y->aCol[0].iFrom
fb20: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
fb30: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
fb40: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
fb50: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  {.      int j;. 
fb60: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
fb70: 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  p->nCol; j++){. 
fb80: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
fb90: 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f  e3StrICmp(p->aCo
fba0: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f  l[j].zName, pFro
fbb0: 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
fbc0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
fbd0: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
fbe0: 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20  .iFrom = j;.    
fbf0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fc00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
fc10: 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e       if( j>=p->n
fc20: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Col ){.        s
fc30: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
fc40: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
fc50: 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d    "unknown colum
fc60: 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65  n \"%s\" in fore
fc70: 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
fc80: 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  on", .          
fc90: 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
fca0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
fcb0: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
fcc0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
fcd0: 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
fce0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
fcf0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
fd00: 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54  nt n = strlen(pT
fd10: 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
fd20: 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  );.      pFKey->
fd30: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a  aCol[i].zCol = z
fd40: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
fd50: 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  , pToCol->a[i].z
fd60: 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  Name, n);.      
fd70: 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[n] = 0;.      
fd80: 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a  z += n+1;.    }.
fd90: 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44    }.  pFKey->isD
fda0: 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70  eferred = 0;.  p
fdb0: 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66  FKey->deleteConf
fdc0: 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66 66 3b   = flags & 0xff;
fdd0: 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61 74 65  .  pFKey->update
fde0: 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e  Conf = (flags >>
fdf0: 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20 20 70   8 ) & 0xff;.  p
fe00: 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66  FKey->insertConf
fe10: 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31 36 20   = (flags >> 16 
fe20: 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20  ) & 0xff;..  /* 
fe30: 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e  Link the foreign
fe40: 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c   key to the tabl
fe50: 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74  e as the last st
fe60: 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46  ep..  */.  p->pF
fe70: 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70  Key = pFKey;.  p
fe80: 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e  FKey = 0;..fk_en
fe90: 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  d:.  sqliteFree(
fea0: 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f  pFKey);.#endif /
feb0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
fec0: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
fed0: 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  EY) */.  sqlite3
fee0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
fef0: 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  FromCol);.  sqli
ff00: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
ff10: 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a  e(pToCol);.}../*
ff20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ff30: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
ff40: 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  an INITIALLY IMM
ff50: 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41  EDIATE or INITIA
ff60: 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20  LLY DEFERRED.** 
ff70: 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61  clause is seen a
ff80: 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65  s part of a fore
ff90: 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
ffa0: 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72  on.  The isDefer
ffb0: 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  red.** parameter
ffc0: 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41   is 1 for INITIA
ffd0: 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64  LLY DEFERRED and
ffe0: 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   0 for INITIALLY
fff0: 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54   IMMEDIATE..** T
10000 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
10010 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
10020 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e   created foreign
10030 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64   key is adjusted
10040 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  .** accordingly.
10050 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10060 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
10070 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
10080 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a  nt isDeferred){.
10090 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
100a0 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
100b0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
100c0 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20   FKey *pFKey;.  
100d0 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72  if( (pTab = pPar
100e0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
100f0 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54  0 || (pFKey = pT
10100 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20  ab->pFKey)==0 ) 
10110 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d  return;.  pFKey-
10120 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 69 73  >isDeferred = is
10130 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66  Deferred;.#endif
10140 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
10150 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
10160 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69  l erase and refi
10170 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20  ll index *pIdx. 
10180 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64   This is.** used
10190 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   to initialize a
101a0 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69   newly created i
101b0 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d  ndex or to recom
101c0 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  pute the.** cont
101d0 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  ent of an index 
101e0 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61  in response to a
101f0 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
10200 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f  ..**.** if memRo
10210 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65  otPage is not ne
10220 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73  gative, it means
10230 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
10240 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61  is newly.** crea
10250 74 65 64 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79  ted.  The memory
10260 20 63 65 6c 6c 20 73 70 65 63 69 66 69 65 64 20   cell specified 
10270 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63  by memRootPage c
10280 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72  ontains the.** r
10290 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
102a0 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49  of the index.  I
102b0 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73  f memRootPage is
102c0 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a   negative, then.
102d0 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72  ** the index alr
102e0 65 61 64 79 20 65 78 69 73 74 73 20 61 6e 64 20  eady exists and 
102f0 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65 64 20  must be cleared 
10300 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66  before being ref
10310 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65  illed and.** the
10320 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
10330 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69  r of the index i
10340 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e  s taken from pIn
10350 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74  dex->tnum..*/.st
10360 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
10370 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72  3RefillIndex(Par
10380 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
10390 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d  x *pIndex, int m
103a0 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54  emRootPage){.  T
103b0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
103c0 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a  dex->pTable;  /*
103d0 20 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   The table that 
103e0 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  is indexed */.  
103f0 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73  int iTab = pPars
10400 65 2d 3e 6e 54 61 62 3b 20 20 20 20 20 20 20 2f  e->nTab;       /
10410 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75  * Btree cursor u
10420 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  sed for pTab */.
10430 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61    int iIdx = pPa
10440 72 73 65 2d 3e 6e 54 61 62 2b 31 3b 20 20 20 20  rse->nTab+1;    
10450 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72   /* Btree cursor
10460 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78   used for pIndex
10470 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b   */.  int addr1;
10480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10490 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
104a0 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a  of top of loop *
104b0 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20  /.  int tnum;   
104c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104d0 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
104e0 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64  of index */.  Vd
104f0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
10500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10510 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
10520 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  to this virtual 
10530 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79  machine */.  Key
10540 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20  Info *pKey;     
10550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
10560 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78  eyInfo for index
10570 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20   */.  int iDb = 
10580 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
10590 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
105a0 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
105b0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
105c0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
105d0 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69  ATION.  if( sqli
105e0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
105f0 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e  rse, SQLITE_REIN
10600 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  DEX, pIndex->zNa
10610 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 70 50 61  me, 0,.      pPa
10620 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
10630 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20  ].zName ) ){.   
10640 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
10650 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72  dif..  /* Requir
10660 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  e a write-lock o
10670 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 70  n the table to p
10680 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70 65 72  erform this oper
10690 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ation */.  sqlit
106a0 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
106b0 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
106c0 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e  num, 1, pTab->zN
106d0 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  ame);..  v = sql
106e0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
106f0 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
10700 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
10710 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29  memRootPage>=0 )
10720 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
10730 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
10740 4c 6f 61 64 2c 20 6d 65 6d 52 6f 6f 74 50 61 67  Load, memRootPag
10750 65 2c 20 30 29 3b 0a 20 20 20 20 74 6e 75 6d 20  e, 0);.    tnum 
10760 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
10770 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d    tnum = pIndex-
10780 3e 74 6e 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >tnum;.    sqlit
10790 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
107a0 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69  P_Clear, tnum, i
107b0 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  Db);.  }.  sqlit
107c0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
107d0 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20  P_Integer, iDb, 
107e0 30 29 3b 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c  0);.  pKey = sql
107f0 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
10800 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29  (pParse, pIndex)
10810 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f  ;.  sqlite3VdbeO
10820 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p3(v, OP_OpenWri
10830 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20  te, iIdx, tnum, 
10840 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 33  (char *)pKey, P3
10850 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
10860 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  );.  sqlite3Open
10870 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54  Table(pParse, iT
10880 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ab, iDb, pTab, O
10890 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61  P_OpenRead);.  a
108a0 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
108b0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
108c0 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a  wind, iTab, 0);.
108d0 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74    sqlite3Generat
108e0 65 49 6e 64 65 78 4b 65 79 28 76 2c 20 70 49 6e  eIndexKey(v, pIn
108f0 64 65 78 2c 20 69 54 61 62 29 3b 0a 20 20 69 66  dex, iTab);.  if
10900 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ( pIndex->onErro
10910 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20  r!=OE_None ){.  
10920 20 20 69 6e 74 20 63 75 72 61 64 64 72 20 3d 20    int curaddr = 
10930 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
10940 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 69  ntAddr(v);.    i
10950 6e 74 20 61 64 64 72 32 20 3d 20 63 75 72 61 64  nt addr2 = curad
10960 64 72 2b 34 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr+4;.    sqlite
10970 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
10980 20 63 75 72 61 64 64 72 2d 31 2c 20 61 64 64 72   curaddr-1, addr
10990 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  2);.    sqlite3V
109a0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
109b0 6f 77 69 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a  owid, iTab, 0);.
109c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
109d0 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d  ddOp(v, OP_AddIm
109e0 6d 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  m, 1, 0);.    sq
109f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10a00 2c 20 4f 50 5f 49 73 55 6e 69 71 75 65 2c 20 69  , OP_IsUnique, i
10a10 49 64 78 2c 20 61 64 64 72 32 29 3b 0a 20 20 20  Idx, addr2);.   
10a20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
10a30 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49  v, OP_Halt, SQLI
10a40 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 4f  TE_CONSTRAINT, O
10a50 45 5f 41 62 6f 72 74 2c 0a 20 20 20 20 20 20 20  E_Abort,.       
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 22 69 6e               "in
10a70 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  dexed columns ar
10a80 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50  e not unique", P
10a90 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 61  3_STATIC);.    a
10aa0 73 73 65 72 74 28 20 61 64 64 72 32 3d 3d 73 71  ssert( addr2==sq
10ab0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
10ac0 41 64 64 72 28 76 29 20 29 3b 0a 20 20 7d 0a 20  Addr(v) );.  }. 
10ad0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10ae0 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  p(v, OP_IdxInser
10af0 74 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 73  t, iIdx, 0);.  s
10b00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10b10 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62  v, OP_Next, iTab
10b20 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20 20 73 71  , addr1+1);.  sq
10b30 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
10b40 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 73  e(v, addr1);.  s
10b50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10b60 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61  v, OP_Close, iTa
10b70 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  b, 0);.  sqlite3
10b80 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10b90 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30 29 3b  Close, iIdx, 0);
10ba0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
10bb0 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72   a new index for
10bc0 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20   an SQL table.  
10bd0 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73  pName1.pName2 is
10be0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
10bf0 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70   index .** and p
10c00 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e  TblList is the n
10c10 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
10c20 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
10c30 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69  ndexed.  Both wi
10c40 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66  ll .** be NULL f
10c50 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  or a primary key
10c60 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61   or an index tha
10c70 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20  t is created to 
10c80 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49  satisfy a.** UNI
10c90 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
10ca0 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70   If pTable and p
10cb0 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20  Index are NULL, 
10cc0 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  use pParse->pNew
10cd0 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20  Table.** as the 
10ce0 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
10cf0 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e  xed.  pParse->pN
10d00 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62  ewTable is a tab
10d10 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75  le that is.** cu
10d20 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
10d30 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43  nstructed by a C
10d40 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
10d50 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69  ement..**.** pLi
10d60 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
10d70 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
10d80 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69  dexed.  pList wi
10d90 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
10da0 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61  is.** is a prima
10db0 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65  ry key or unique
10dc0 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74  -constraint on t
10dd0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
10de0 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74  olumn added.** t
10df0 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
10e00 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
10e10 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76  truction.  .*/.v
10e20 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
10e30 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  eIndex(.  Parse 
10e40 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
10e50 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  All information 
10e60 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65  about this parse
10e70 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
10e80 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73  me1,     /* Firs
10e90 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20  t part of index 
10ea0 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c  name. May be NUL
10eb0 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  L */.  Token *pN
10ec0 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63  ame2,     /* Sec
10ed0 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65  ond part of inde
10ee0 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
10ef0 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ULL */.  SrcList
10f00 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54   *pTblName, /* T
10f10 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55  able to index. U
10f20 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
10f30 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45  able if 0 */.  E
10f40 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
10f50 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63    /* A list of c
10f60 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
10f70 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
10f80 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20  Error,       /* 
10f90 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e  OE_Abort, OE_Ign
10fa0 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c  ore, OE_Replace,
10fb0 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20   or OE_None */. 
10fc0 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20   Token *pStart, 
10fd0 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
10fe0 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
10ff0 69 6e 73 20 61 20 43 52 45 41 54 45 20 54 41 42  ins a CREATE TAB
11000 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  LE statement */.
11010 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20    Token *pEnd,  
11020 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20       /* The ")" 
11030 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20  that closes the 
11040 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
11050 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
11060 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20 2f  sortOrder,     /
11070 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 20  * Sort order of 
11080 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65 6e  primary key when
11090 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a   pList==NULL */.
110a0 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74    int ifNotExist
110b0 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72       /* Omit err
110c0 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72 65  or if index alre
110d0 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
110e0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
110f0 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65   0;     /* Table
11100 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
11110 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
11120 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  x = 0;   /* The 
11130 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61  index to be crea
11140 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
11150 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Name = 0;     /*
11160 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   Name of the ind
11170 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  ex */.  int nNam
11180 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
11190 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
111a0 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f  ters in zName */
111b0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54  .  int i, j;.  T
111c0 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20  oken nullId;    
111d0 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65      /* Fake toke
111e0 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49  n for an empty I
111f0 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46 69  D list */.  DbFi
11200 78 65 72 20 73 46 69 78 3b 20 20 20 20 20 20 20  xer sFix;       
11210 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e   /* For assignin
11220 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73  g database names
11230 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20   to pTable */.  
11240 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73  int sortOrderMas
11250 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e  k;   /* 1 to hon
11260 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78  or DESC in index
11270 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20  .  0 to ignore. 
11280 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
11290 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
112a0 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
112b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65        /* The spe
112c0 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74  cific table cont
112d0 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78  aining the index
112e0 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ed database */. 
112f0 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
11300 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
11310 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
11320 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69  hat is being wri
11330 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tten */.  Token 
11340 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f  *pName = 0;    /
11350 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * Unqualified na
11360 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
11370 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73  to create */.  s
11380 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
11390 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20  tem *pListItem; 
113a0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
113b0 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69  ver pList */.  i
113c0 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e  nt nCol;.  int n
113d0 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 63 68 61  Extra = 0;.  cha
113e0 72 20 2a 7a 45 78 74 72 61 3b 0a 0a 20 20 69 66  r *zExtra;..  if
113f0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
11400 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  | sqlite3MallocF
11410 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 67  ailed() ){.    g
11420 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
11430 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
11440 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74  .  ** Find the t
11450 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
11460 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74  be indexed.  Ret
11470 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74  urn early if not
11480 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69   found..  */.  i
11490 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
114a0 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  {..    /* Use th
114b0 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78  e two-part index
114c0 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
114d0 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ne the database 
114e0 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63  .    ** to searc
114f0 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  h for the table.
11500 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65   'Fix' the table
11510 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62   name to this db
11520 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c  .    ** before l
11530 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61  ooking up the ta
11540 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
11550 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26  assert( pName1 &
11560 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20  & pName2 );.    
11570 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
11580 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
11590 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
115a0 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66   &pName);.    if
115b0 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65  ( iDb<0 ) goto e
115c0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
115d0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
115e0 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20  E_OMIT_TEMPDB.  
115f0 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65    /* If the inde
11600 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61  x name was unqua
11610 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66  lified, check if
11620 20 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20   the the table. 
11630 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20     ** is a temp 
11640 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65  table. If so, se
11650 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  t the database t
11660 6f 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  o 1..    */.    
11670 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72  pTab = sqlite3Sr
11680 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72  cListLookup(pPar
11690 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  se, pTblName);. 
116a0 20 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26     if( pName2 &&
116b0 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26   pName2->n==0 &&
116c0 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70   pTab && pTab->p
116d0 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b  Schema==db->aDb[
116e0 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  1].pSchema ){.  
116f0 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20      iDb = 1;.   
11700 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69   }.#endif..    i
11710 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
11720 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
11730 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70   iDb, "index", p
11740 4e 61 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20  Name) &&.       
11750 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
11760 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61  st(&sFix, pTblNa
11770 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  me).    ){.     
11780 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   /* Because the 
11790 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74  parser construct
117a0 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20  s pTblName from 
117b0 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66  a single identif
117c0 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71  ier,.      ** sq
117d0 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 20  lite3FixSrcList 
117e0 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20  can never fail. 
117f0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
11800 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  0);.    }.    pT
11810 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
11820 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
11830 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  pTblName->a[0].z
11840 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70  Name, .        p
11850 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  TblName->a[0].zD
11860 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66  atabase);.    if
11870 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65  ( !pTab ) goto e
11880 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
11890 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
118a0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
118b0 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
118c0 61 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  a );.  }else{.  
118d0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d    assert( pName=
118e0 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d  =0 );.    pTab =
118f0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
11900 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61  le;.    if( !pTa
11910 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  b ) goto exit_cr
11920 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
11930 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
11940 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
11950 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
11960 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e   }.  pDb = &db->
11970 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 69 66 28  aDb[iDb];..  if(
11980 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72   pTab==0 || pPar
11990 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
119a0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
119b0 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72  x;.  if( pTab->r
119c0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73  eadOnly ){.    s
119d0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
119e0 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
119f0 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
11a00 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  xed", pTab->zNam
11a10 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
11a20 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11a30 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
11a40 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69  TE_OMIT_VIEW.  i
11a50 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
11a60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
11a70 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11a80 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62  "views may not b
11a90 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20  e indexed");.   
11aa0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
11ab0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e  e_index;.  }.#en
11ac0 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  dif..  /*.  ** F
11ad0 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ind the name of 
11ae0 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65  the index.  Make
11af0 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
11b00 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68  ot already anoth
11b10 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  er.  ** index or
11b20 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
11b30 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a  same name.  .  *
11b40 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e  *.  ** Exception
11b50 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61  :  If we are rea
11b60 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f  ding the names o
11b70 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69  f permanent indi
11b80 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ces from the.  *
11b90 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
11ba0 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73  table (because s
11bb0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
11bc0 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63  s changed the sc
11bd0 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f  hema) and.  ** o
11be0 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ne of the index 
11bf0 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77  names collides w
11c00 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ith the name of 
11c10 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
11c20 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c  e or.  ** index,
11c30 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f   then we will co
11c40 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73  ntinue to proces
11c50 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20  s this index..  
11c60 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65  **.  ** If pName
11c70 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ==0 it means tha
11c80 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65  t we are.  ** de
11c90 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69  aling with a pri
11ca0 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51  mary key or UNIQ
11cb0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
11cc0 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e  We have to inven
11cd0 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e  t our.  ** own n
11ce0 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ame..  */.  if( 
11cf0 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  pName ){.    zNa
11d00 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
11d10 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
11d20 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
11d30 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
11d40 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
11d50 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
11d60 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
11d70 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f   zName==0 ) goto
11d80 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
11d90 65 78 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  ex;.    if( SQLI
11da0 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
11db0 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
11dc0 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
11dd0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
11de0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11df0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d    }.    if( !db-
11e00 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
11e10 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
11e20 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
11e30 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67  hema(pParse) ) g
11e40 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
11e50 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 66 28  index;.      if(
11e60 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
11e70 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62  x(db, zName, pDb
11e80 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ->zName)!=0 ){. 
11e90 20 20 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f         if( !ifNo
11ea0 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20  tExist ){.      
11eb0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11ec0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
11ed0 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78  ex %s already ex
11ee0 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ists", zName);. 
11ef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11f00 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
11f10 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
11f20 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
11f30 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
11f40 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a  zName, 0)!=0 ){.
11f50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
11f60 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11f70 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
11f80 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  y a table named 
11f90 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
11fa0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
11fb0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
11fc0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
11fd0 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75  se{.    char zBu
11fe0 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  f[30];.    int n
11ff0 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f  ;.    Index *pLo
12000 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f  op;.    for(pLoo
12010 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20  p=pTab->pIndex, 
12020 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  n=1; pLoop; pLoo
12030 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20  p=pLoop->pNext, 
12040 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e  n++){}.    sprin
12050 74 66 28 7a 42 75 66 2c 22 5f 25 64 22 2c 6e 29  tf(zBuf,"_%d",n)
12060 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  ;.    zName = 0;
12070 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
12080 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 73  tring(&zName, "s
12090 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
120a0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
120b0 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b  zBuf, (char*)0);
120c0 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
120d0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
120e0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
120f0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
12100 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f  authorization to
12110 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78   create an index
12120 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
12130 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
12140 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
12150 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
12160 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20   = pDb->zName;. 
12170 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
12180 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
12190 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
121a0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
121b0 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
121c0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
121d0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
121e0 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f  .    i = SQLITE_
121f0 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20  CREATE_INDEX;.  
12200 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
12210 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69  DB && iDb==1 ) i
12220 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
12230 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
12240 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
12250 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c  Check(pParse, i,
12260 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e   zName, pTab->zN
12270 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
12280 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
12290 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
122a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
122b0 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69  * If pList==0, i
122c0 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75  t means this rou
122d0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20  tine was called 
122e0 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72  to make a primar
122f0 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f  y.  ** key out o
12300 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  f the last colum
12310 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  n added to the t
12320 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
12330 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f  ruction..  ** So
12340 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c   create a fake l
12350 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  ist to simulate 
12360 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  this..  */.  if(
12370 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
12380 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 28 75 38 2a   nullId.z = (u8*
12390 29 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62  )pTab->aCol[pTab
123a0 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b  ->nCol-1].zName;
123b0 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20  .    nullId.n = 
123c0 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 6e 75  strlen((char*)nu
123d0 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69  llId.z);.    pLi
123e0 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
123f0 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 30 2c  ListAppend(0, 0,
12400 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69   &nullId);.    i
12410 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f  f( pList==0 ) go
12420 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
12430 6e 64 65 78 3b 0a 20 20 20 20 70 4c 69 73 74 2d  ndex;.    pList-
12440 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
12450 3d 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  = sortOrder;.  }
12460 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
12470 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73  t how many bytes
12480 20 6f 66 20 73 70 61 63 65 20 61 72 65 20 72 65   of space are re
12490 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
124a0 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20  explicitly.  ** 
124b0 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74  specified collat
124c0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
124d0 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
124e0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
124f0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
12500 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73  pr *pExpr = pLis
12510 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
12520 20 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a     if( pExpr ){.
12530 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20        nExtra += 
12540 28 31 20 2b 20 73 74 72 6c 65 6e 28 70 45 78 70  (1 + strlen(pExp
12550 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  r->pColl->zName)
12560 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
12570 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74  /* .  ** Allocat
12580 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  e the index stru
12590 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e  cture. .  */.  n
125a0 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e  Name = strlen(zN
125b0 61 6d 65 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70  ame);.  nCol = p
125c0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
125d0 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 4d 61  Index = sqliteMa
125e0 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 73 69 7a  lloc( .      siz
125f0 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 20 20 20  eof(Index) +    
12600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
12610 65 78 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f  ex structure  */
12620 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e  .      sizeof(in
12630 74 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20  t)*nCol +       
12640 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43      /* Index.aiC
12650 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20  olumn   */.     
12660 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 43   sizeof(int)*(nC
12670 6f 6c 2b 31 29 20 2b 20 20 20 20 20 20 20 2f 2a  ol+1) +       /*
12680 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 20   Index.aiRowEst 
12690 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f    */.      sizeo
126a0 66 28 63 68 61 72 20 2a 29 2a 6e 43 6f 6c 20 2b  f(char *)*nCol +
126b0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
126c0 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20  .azColl     */. 
126d0 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a       sizeof(u8)*
126e0 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20  nCol +          
126f0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74    /* Index.aSort
12700 4f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 6e  Order */.      n
12710 4e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20  Name + 1 +      
12720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
12730 6e 64 65 78 2e 7a 4e 61 6d 65 20 20 20 20 20 20  ndex.zName      
12740 2a 2f 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  */.      nExtra 
12750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12760 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
12770 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
12780 73 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20  s */.  );.  if( 
12790 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
127a0 6c 65 64 28 29 20 29 20 67 6f 74 6f 20 65 78 69  led() ) goto exi
127b0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
127c0 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c    pIndex->azColl
127d0 20 3d 20 28 63 68 61 72 2a 2a 29 28 26 70 49 6e   = (char**)(&pIn
127e0 64 65 78 5b 31 5d 29 3b 0a 20 20 70 49 6e 64 65  dex[1]);.  pInde
127f0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69  x->aiColumn = (i
12800 6e 74 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61  nt *)(&pIndex->a
12810 7a 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20  zColl[nCol]);.  
12820 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74  pIndex->aiRowEst
12830 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 2a 29 28   = (unsigned *)(
12840 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  &pIndex->aiColum
12850 6e 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64  n[nCol]);.  pInd
12860 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  ex->aSortOrder =
12870 20 28 75 38 20 2a 29 28 26 70 49 6e 64 65 78 2d   (u8 *)(&pIndex-
12880 3e 61 69 52 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31  >aiRowEst[nCol+1
12890 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e  ]);.  pIndex->zN
128a0 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 28 26  ame = (char *)(&
128b0 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
128c0 65 72 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78  er[nCol]);.  zEx
128d0 74 72 61 20 3d 20 28 63 68 61 72 20 2a 29 28 26  tra = (char *)(&
128e0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e  pIndex->zName[nN
128f0 61 6d 65 2b 31 5d 29 3b 0a 20 20 73 74 72 63 70  ame+1]);.  strcp
12900 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  y(pIndex->zName,
12910 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65   zName);.  pInde
12920 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
12930 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ;.  pIndex->nCol
12940 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  umn = pList->nEx
12950 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e  pr;.  pIndex->on
12960 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b  Error = onError;
12970 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49  .  pIndex->autoI
12980 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b  ndex = pName==0;
12990 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  .  pIndex->pSche
129a0 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
129b0 5d 2e 70 53 63 68 65 6d 61 3b 0a 0a 20 20 2f 2a  ].pSchema;..  /*
129c0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
129d0 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72   we should honor
129e0 20 44 45 53 43 20 72 65 71 75 65 73 74 73 20 6f   DESC requests o
129f0 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a  n index columns.
12a00 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e    */.  if( pDb->
12a10 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f  pSchema->file_fo
12a20 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73  rmat>=4 ){.    s
12a30 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d  ortOrderMask = -
12a40 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45  1;   /* Honor DE
12a50 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  SC */.  }else{. 
12a60 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b     sortOrderMask
12a70 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f   = 0;    /* Igno
12a80 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a  re DESC */.  }..
12a90 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61    /* Scan the na
12aa0 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  mes of the colum
12ab0 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ns of the table 
12ac0 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e  to be indexed an
12ad0 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20  d.  ** load the 
12ae0 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69  column indices i
12af0 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74  nto the Index st
12b00 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74  ructure.  Report
12b10 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69   an error.  ** i
12b20 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20  f any column is 
12b30 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a  not found..  */.
12b40 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74    for(i=0, pList
12b50 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
12b60 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
12b70 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29  ++, pListItem++)
12b80 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
12b90 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69   *zColName = pLi
12ba0 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  stItem->zName;. 
12bb0 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43     Column *pTabC
12bc0 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 72 65 71 75  ol;.    int requ
12bd0 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a  estedSortOrder;.
12be0 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b      char *zColl;
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c00 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20     /* Collation 
12c10 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20  sequence */..   
12c20 20 66 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f   for(j=0, pTabCo
12c30 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c  l=pTab->aCol; j<
12c40 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c  pTab->nCol; j++,
12c50 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20   pTabCol++){.   
12c60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
12c70 72 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20  rICmp(zColName, 
12c80 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d  pTabCol->zName)=
12c90 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
12ca0 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61  }.    if( j>=pTa
12cb0 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
12cc0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12cd0 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
12ce0 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e  %s has no column
12cf0 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20   named %s",.    
12d00 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
12d10 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20   zColName);.    
12d20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
12d30 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
12d40 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
12d50 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20  lumn[i] = j;.   
12d60 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e   if( pListItem->
12d70 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 61  pExpr ){.      a
12d80 73 73 65 72 74 28 20 70 4c 69 73 74 49 74 65 6d  ssert( pListItem
12d90 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29  ->pExpr->pColl )
12da0 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
12db0 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20 73 74  zExtra;.      st
12dc0 72 63 70 79 28 7a 45 78 74 72 61 2c 20 70 4c 69  rcpy(zExtra, pLi
12dd0 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70  stItem->pExpr->p
12de0 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
12df0 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 28 73      zExtra += (s
12e00 74 72 6c 65 6e 28 7a 43 6f 6c 6c 29 20 2b 20 31  trlen(zColl) + 1
12e10 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12e20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62      zColl = pTab
12e30 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[j].zColl;
12e40 0a 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6c  .      if( !zCol
12e50 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  l ){.        zCo
12e60 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
12e70 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ll->zName;.     
12e80 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
12e90 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
12ea0 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74  && !sqlite3Locat
12eb0 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
12ec0 20 7a 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20   zColl, -1) ){. 
12ed0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
12ee0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
12ef0 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61   }.    pIndex->a
12f00 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c  zColl[i] = zColl
12f10 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65 64 53  ;.    requestedS
12f20 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74  ortOrder = pList
12f30 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
12f40 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b  & sortOrderMask;
12f50 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f  .    pIndex->aSo
12f60 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 72 65 71  rtOrder[i] = req
12f70 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b  uestedSortOrder;
12f80 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
12f90 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64  faultRowEst(pInd
12fa0 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  ex);..  if( pTab
12fb0 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ==pParse->pNewTa
12fc0 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ble ){.    /* Th
12fd0 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62  is routine has b
12fe0 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  een called to cr
12ff0 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69  eate an automati
13000 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20  c index as a.   
13010 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20   ** result of a 
13020 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
13030 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20  NIQUE clause on 
13040 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  a column definit
13050 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  ion, or.    ** a
13060 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
13070 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f  UNIQUE clause fo
13080 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75  llowing the colu
13090 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a  mn definitions..
130a0 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20      ** i.e. one 
130b0 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
130c0 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
130d0 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
130e0 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54  y);.    ** CREAT
130f0 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20  E TABLE t(x, y, 
13100 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20  UNIQUE(x, y));. 
13110 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74     **.    ** Eit
13120 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74  her way, check t
13130 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62  o see if the tab
13140 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73  le already has s
13150 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66  uch an index. If
13160 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27  .    ** so, don'
13170 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e  t bother creatin
13180 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73  g this one. This
13190 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f   only applies to
131a0 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  .    ** automati
131b0 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e  cally created in
131c0 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e  dices. Users can
131d0 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68   do as they wish
131e0 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70   with.    ** exp
131f0 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20  licit indices.. 
13200 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20     */.    Index 
13210 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
13220 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
13230 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
13240 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
13250 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73   int k;.      as
13260 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72  sert( pIdx->onEr
13270 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
13280 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
13290 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b  dx->autoIndex );
132a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
132b0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
132c0 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20  OE_None );..    
132d0 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
132e0 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f  umn!=pIndex->nCo
132f0 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
13300 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  .      for(k=0; 
13310 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  k<pIdx->nColumn;
13320 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   k++){.        c
13330 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 20 3d 20  onst char *z1 = 
13340 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b  pIdx->azColl[k];
13350 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
13360 68 61 72 20 2a 7a 32 20 3d 20 70 49 6e 64 65 78  har *z2 = pIndex
13370 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20  ->azColl[k];.   
13380 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
13390 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64  iColumn[k]!=pInd
133a0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20  ex->aiColumn[k] 
133b0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
133c0 20 69 66 28 20 70 49 64 78 2d 3e 61 53 6f 72 74   if( pIdx->aSort
133d0 4f 72 64 65 72 5b 6b 5d 21 3d 70 49 6e 64 65 78  Order[k]!=pIndex
133e0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 20  ->aSortOrder[k] 
133f0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
13400 20 69 66 28 20 7a 31 21 3d 7a 32 20 26 26 20 73   if( z1!=z2 && s
13410 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31  qlite3StrICmp(z1
13420 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20  , z2) ) break;. 
13430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
13440 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   k==pIdx->nColum
13450 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  n ){.        if(
13460 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
13470 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
13480 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
13490 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  This constraint 
134a0 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65  creates the same
134b0 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76   index as a prev
134c0 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ious.          *
134d0 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65  * constraint spe
134e0 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65  cified somewhere
134f0 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
13500 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
13510 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77            ** How
13520 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46  ever the ON CONF
13530 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65  LICT clauses are
13540 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62   different. If b
13550 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20  oth this .      
13560 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
13570 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f  t and the previo
13580 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  us equivalent co
13590 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78  nstraint have ex
135a0 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20  plicit.         
135b0 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20   ** ON CONFLICT 
135c0 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20  clauses this is 
135d0 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77  an error. Otherw
135e0 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20  ise, use the.   
135f0 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63         ** explic
13600 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62  itly specified b
13610 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65  ehaviour for the
13620 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
13630 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
13640 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72  f( !(pIdx->onErr
13650 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c  or==OE_Default |
13660 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  | pIndex->onErro
13670 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29  r==OE_Default) )
13680 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
13690 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
136a0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
136b0 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74         "conflict
136c0 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  ing ON CONFLICT 
136d0 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65  clauses specifie
136e0 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  d", 0);.        
136f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
13700 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
13710 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20  =OE_Default ){. 
13720 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
13730 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65  >onError = pInde
13740 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  x->onError;.    
13750 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13760 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  }.        goto e
13770 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13780 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13790 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74    }..  /* Link t
137a0 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72  he new Index str
137b0 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61  ucture to its ta
137c0 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f  ble and to the o
137d0 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d  ther.  ** in-mem
137e0 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72  ory database str
137f0 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20  uctures. .  */. 
13800 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
13810 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  sy ){.    Index 
13820 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  *p;.    p = sqli
13830 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
13840 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e  Index->pSchema->
13850 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20  idxHash, .      
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13870 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
13880 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d  , strlen(pIndex-
13890 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65  >zName)+1, pInde
138a0 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  x);.    if( p ){
138b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
138c0 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20  ==pIndex );  /* 
138d0 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
138e0 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
138f0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
13900 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
13910 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
13920 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
13930 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54  nges;.    if( pT
13940 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
13950 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
13960 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
13970 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  um;.    }.  }.. 
13980 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69   /* If the db->i
13990 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68  nit.busy is 0 th
139a0 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e  en create the in
139b0 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68  dex on disk.  Th
139c0 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73  is.  ** involves
139d0 20 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64   writing the ind
139e0 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74  ex into the mast
139f0 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c  er table and fil
13a00 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a  ling in the.  **
13a10 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20   index with the 
13a20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f  current table co
13a30 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a  ntents..  **.  *
13a40 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  * The db->init.b
13a50 75 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68  usy is 0 when th
13a60 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74  e user first ent
13a70 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44  ers a CREATE IND
13a80 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  EX .  ** command
13a90 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  .  db->init.busy
13aa0 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74   is 1 when a dat
13ab0 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20  abase is opened 
13ac0 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45  and .  ** CREATE
13ad0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
13ae0 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f  s are read out o
13af0 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  f the master tab
13b00 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65  le.  In.  ** the
13b10 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65   latter case the
13b20 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
13b30 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77  xists on disk, w
13b40 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a  hich is why.  **
13b50 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74   we don't want t
13b60 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20  o recreate it.. 
13b70 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c   **.  ** If pTbl
13b80 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
13b90 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67   this index is g
13ba0 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72  enerated as a pr
13bb0 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f  imary key.  ** o
13bc0 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
13bd0 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20  int of a CREATE 
13be0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
13bf0 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c    Since the tabl
13c00 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20  e.  ** has just 
13c10 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74  been created, it
13c20 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
13c30 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  a and the index 
13c40 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
13c50 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20   ** step can be 
13c60 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
13c70 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69  else if( db->ini
13c80 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20  t.busy==0 ){.   
13c90 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68   Vdbe *v;.    ch
13ca0 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69  ar *zStmt;.    i
13cb0 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  nt iMem = pParse
13cc0 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 76  ->nMem++;..    v
13cd0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
13ce0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
13cf0 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65  f( v==0 ) goto e
13d00 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13d10 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  ;...    /* Creat
13d20 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  e the rootpage f
13d30 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  or the index.   
13d40 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
13d50 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
13d60 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
13d70 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
13d80 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
13d90 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c  reateIndex, iDb,
13da0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
13db0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13dc0 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20  MemStore, iMem, 
13dd0 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68  0);..    /* Gath
13de0 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  er the complete 
13df0 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
13e00 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
13e10 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74  nt into.    ** t
13e20 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c  he zStmt variabl
13e30 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
13e40 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64 20   pStart && pEnd 
13e50 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61  ){.      /* A na
13e60 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68 20 61  med index with a
13e70 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45 41 54  n explicit CREAT
13e80 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
13e90 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74  t */.      zStmt
13ea0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
13eb0 66 28 22 43 52 45 41 54 45 25 73 20 49 4e 44 45  f("CREATE%s INDE
13ec0 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20  X %.*s",.       
13ed0 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e   onError==OE_Non
13ee0 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55  e ? "" : " UNIQU
13ef0 45 22 2c 0a 20 20 20 20 20 20 20 20 70 45 6e 64  E",.        pEnd
13f00 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b  ->z - pName->z +
13f10 20 31 2c 0a 20 20 20 20 20 20 20 20 70 4e 61 6d   1,.        pNam
13f20 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e->z);.    }else
13f30 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75  {.      /* An au
13f40 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72  tomatic index cr
13f50 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41  eated by a PRIMA
13f60 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
13f70 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
13f80 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20       /* zStmt = 
13f90 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
13fa0 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  "); */.      zSt
13fb0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  mt = 0;.    }.. 
13fc0 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74     /* Add an ent
13fd0 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73  ry in sqlite_mas
13fe0 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64  ter for this ind
13ff0 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  ex.    */.    sq
14000 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
14010 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
14020 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25    "INSERT INTO %
14030 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64  Q.%s VALUES('ind
14040 65 78 27 2c 25 51 2c 25 51 2c 23 30 2c 25 51 29  ex',%Q,%Q,#0,%Q)
14050 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  ;",.        db->
14060 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
14070 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
14080 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ),.        pInde
14090 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  x->zName,.      
140a0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
140b0 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20         zStmt.   
140c0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
140d0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
140e0 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73  op, 1, 0);.    s
140f0 71 6c 69 74 65 46 72 65 65 28 7a 53 74 6d 74 29  qliteFree(zStmt)
14100 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74  ;..    /* Fill t
14110 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61  he index with da
14120 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74  ta and reparse t
14130 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20  he schema. Code 
14140 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20  an OP_Expire.   
14150 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74   ** to invalidat
14160 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c  e all pre-compil
14170 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
14180 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
14190 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  blName ){.      
141a0 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
141b0 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
141c0 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  x, iMem);.      
141d0 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
141e0 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b  kie(db, v, iDb);
141f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14200 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73  beOp3(v, OP_Pars
14210 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
14220 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
14230 33 4d 50 72 69 6e 74 66 28 22 6e 61 6d 65 3d 27  3MPrintf("name='
14240 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  %q'", pIndex->zN
14250 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43  ame), P3_DYNAMIC
14260 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14270 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14280 45 78 70 69 72 65 2c 20 30 2c 20 30 29 3b 0a 20  Expire, 0, 0);. 
14290 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
142a0 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e  hen adding an in
142b0 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20  dex to the list 
142c0 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61  of indices for a
142d0 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a   table, make.  *
142e0 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63  * sure all indic
142f0 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65  es labeled OE_Re
14300 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72  place come after
14310 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c   all those label
14320 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72  ed.  ** OE_Ignor
14330 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  e.  This is nece
14340 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f  ssary for the co
14350 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
14360 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61  of UPDATE.  ** a
14370 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a  nd INSERT..  */.
14380 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
14390 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d  usy || pTblName=
143a0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e  =0 ){.    if( on
143b0 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
143c0 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
143d0 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  x==0.         ||
143e0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
143f0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
14400 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  ce){.      pInde
14410 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
14420 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70  >pIndex;.      p
14430 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  Tab->pIndex = pI
14440 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ndex;.    }else{
14450 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  .      Index *pO
14460 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e  ther = pTab->pIn
14470 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  dex;.      while
14480 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20  ( pOther->pNext 
14490 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  && pOther->pNext
144a0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ->onError!=OE_Re
144b0 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  place ){.       
144c0 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72   pOther = pOther
144d0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
144e0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
144f0 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
14500 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68  Next;.      pOth
14510 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64  er->pNext = pInd
14520 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
14530 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ndex = 0;.  }.. 
14540 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
14550 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
14560 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
14570 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  :.  if( pIndex )
14580 7b 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28  {.    freeIndex(
14590 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73  pIndex);.  }.  s
145a0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
145b0 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73  lete(pList);.  s
145c0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
145d0 65 74 65 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  ete(pTblName);. 
145e0 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
145f0 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
14600 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
14610 63 6f 64 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  code to make sur
14620 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  e the file forma
14630 74 20 6e 75 6d 62 65 72 20 69 73 20 61 74 20 6c  t number is at l
14640 65 61 73 74 20 6d 69 6e 46 6f 72 6d 61 74 2e 0a  east minFormat..
14650 2a 2a 20 54 68 65 20 67 65 6e 65 72 61 74 65 64  ** The generated
14660 20 63 6f 64 65 20 77 69 6c 6c 20 69 6e 63 72 65   code will incre
14670 61 73 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72  ase the file for
14680 6d 61 74 20 6e 75 6d 62 65 72 20 69 66 20 6e 65  mat number if ne
14690 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 76 6f 69 64  cessary..*/.void
146a0 20 73 71 6c 69 74 65 33 4d 69 6e 69 6d 75 6d 46   sqlite3MinimumF
146b0 69 6c 65 46 6f 72 6d 61 74 28 50 61 72 73 65 20  ileFormat(Parse 
146c0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
146d0 2c 20 69 6e 74 20 6d 69 6e 46 6f 72 6d 61 74 29  , int minFormat)
146e0 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 76  {.  Vdbe *v;.  v
146f0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
14700 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
14710 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
14720 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14730 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
14740 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
14750 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14760 5f 49 6e 74 65 67 65 72 2c 20 6d 69 6e 46 6f 72  _Integer, minFor
14770 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  mat, 0);.    sql
14780 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
14790 20 4f 50 5f 47 65 2c 20 30 2c 20 73 71 6c 69 74   OP_Ge, 0, sqlit
147a0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
147b0 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 73 71 6c  r(v)+3);.    sql
147c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
147d0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d 69 6e   OP_Integer, min
147e0 46 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20  Format, 0);.    
147f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14800 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
14810 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 7d 0a 7d  , iDb, 1);.  }.}
14820 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65  ../*.** Fill the
14830 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b   Index.aiRowEst[
14840 5d 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66  ] array with def
14850 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ault information
14860 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a   - information.*
14870 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65  * to be used whe
14880 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75  n we have not ru
14890 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f  n the ANALYZE co
148a0 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52  mmand..**.** aiR
148b0 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70  owEst[0] is supp
148c0 6f 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ose to contain t
148d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
148e0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64  ments in the ind
148f0 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20  ex..** Since we 
14900 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65  do not know, gue
14910 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61  ss 1 million.  a
14920 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e  iRowEst[1] is an
14930 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
14940 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  .** number of ro
14950 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
14960 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70  that match any p
14970 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20  articular value 
14980 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  of the.** first 
14990 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
149a0 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32  dex.  aiRowEst[2
149b0 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  ] is an estimate
149c0 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a   of the number.*
149d0 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d  * of rows that m
149e0 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
149f0 6c 61 72 20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e  lar combiniation
14a00 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20   of the first 2 
14a10 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68  columns.** of th
14a20 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f  e index.  And so
14a30 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74   forth.  It must
14a40 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63   always be the c
14a50 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20  ase that.*.**   
14a60 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74          aiRowEst
14a70 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d  [N]<=aiRowEst[N-
14a80 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  1].**           
14a90 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a  aiRowEst[N]>=1.*
14aa0 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20  *.** Apart from 
14ab0 74 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69  that, we have li
14ac0 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65  ttle to go on be
14ad0 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20  sides intuition 
14ae0 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52  as to.** how aiR
14af0 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62  owEst[] should b
14b00 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  e initialized.  
14b10 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65  The numbers gene
14b20 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72  rated here.** ar
14b30 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63  e based on typic
14b40 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20  al values found 
14b50 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65  in actual indice
14b60 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
14b70 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28  e3DefaultRowEst(
14b80 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
14b90 75 6e 73 69 67 6e 65 64 20 2a 61 20 3d 20 70 49  unsigned *a = pI
14ba0 64 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20  dx->aiRowEst;.  
14bb0 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
14bc0 20 61 21 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20   a!=0 );.  a[0] 
14bd0 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 66 6f 72  = 1000000;.  for
14be0 28 69 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  (i=pIdx->nColumn
14bf0 3b 20 69 3e 3d 31 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=1; i--){.  
14c00 20 20 61 5b 69 5d 20 3d 20 31 30 3b 0a 20 20 7d    a[i] = 10;.  }
14c10 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45  .  if( pIdx->onE
14c20 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b  rror!=OE_None ){
14c30 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e 6e 43 6f  .    a[pIdx->nCo
14c40 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a 7d  lumn] = 1;.  }.}
14c50 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
14c60 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61  tine will drop a
14c70 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64  n existing named
14c80 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f   index.  This ro
14c90 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  utine.** impleme
14ca0 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44  nts the DROP IND
14cb0 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  EX statement..*/
14cc0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
14cd0 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  pIndex(Parse *pP
14ce0 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
14cf0 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73  Name, int ifExis
14d00 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ts){.  Index *pI
14d10 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ndex;.  Vdbe *v;
14d20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
14d30 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
14d40 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70  nt iDb;..  if( p
14d50 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
14d60 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
14d70 65 64 28 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ed() ){.    goto
14d80 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
14d90 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
14da0 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
14db0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
14dc0 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
14dd0 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
14de0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
14df0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
14e00 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
14e10 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e  FindIndex(db, pN
14e20 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
14e30 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
14e40 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
14e50 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Index==0 ){.    
14e60 69 66 28 20 21 69 66 45 78 69 73 74 73 20 29 7b  if( !ifExists ){
14e70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
14e80 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
14e90 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
14ea0 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20  S", pName, 0);. 
14eb0 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
14ec0 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
14ed0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
14ee0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
14ef0 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75    if( pIndex->au
14f00 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73  toIndex ){.    s
14f10 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14f20 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73  Parse, "index as
14f30 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e  sociated with UN
14f40 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72  IQUE ".      "or
14f50 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
14f60 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
14f70 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a  e dropped", 0);.
14f80 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
14f90 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
14fa0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
14fb0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
14fc0 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b  Index->pSchema);
14fd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14fe0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
14ff0 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
15000 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
15010 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62  P_INDEX;.    Tab
15020 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
15030 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63  x->pTable;.    c
15040 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
15050 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
15060 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
15070 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
15080 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
15090 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
150a0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
150b0 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
150c0 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Tab, 0, zDb) ){.
150d0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
150e0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
150f0 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  }.    if( !OMIT_
15100 54 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20  TEMPDB && iDb ) 
15110 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
15120 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  OP_TEMP_INDEX;. 
15130 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
15140 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
15150 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  code, pIndex->zN
15160 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
15170 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
15180 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
15190 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
151a0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
151b0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
151c0 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
151d0 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
151e0 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
151f0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
15200 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
15210 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
15220 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
15230 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45  se,.       "DELE
15240 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
15250 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20  ERE name=%Q",.  
15260 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
15270 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
15280 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20  TABLE(iDb),.    
15290 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
152a0 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
152b0 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
152c0 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20  db, v, iDb);.   
152d0 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
152e0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d  (pParse, pIndex-
152f0 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
15300 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
15310 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c  v, OP_DropIndex,
15320 20 69 44 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d   iDb, 0, pIndex-
15330 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
15340 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78  .exit_drop_index
15350 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
15360 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b  stDelete(pName);
15370 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 70 41 72 72 61  .}../*.** ppArra
15380 79 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 61 20  y points into a 
15390 73 74 72 75 63 74 75 72 65 20 77 68 65 72 65 20  structure where 
153a0 74 68 65 72 65 20 69 73 20 61 6e 20 61 72 72 61  there is an arra
153b0 79 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 66 6f 6c  y pointer.** fol
153c0 6c 6f 77 65 64 20 62 79 20 74 77 6f 20 69 6e 74  lowed by two int
153d0 65 67 65 72 73 2e 20 54 68 65 20 66 69 72 73 74  egers. The first
153e0 20 69 6e 74 65 67 65 72 20 69 73 20 74 68 65 0a   integer is the.
153f0 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  ** number of ele
15400 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 73 74 72  ments in the str
15410 75 63 74 75 72 65 20 61 72 72 61 79 2e 20 20 54  ucture array.  T
15420 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65  he second intege
15430 72 0a 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62  r.** is the numb
15440 65 72 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20  er of allocated 
15450 73 6c 6f 74 73 20 69 6e 20 74 68 65 20 61 72 72  slots in the arr
15460 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68  ay..**.** In oth
15470 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 73 74  er words, the st
15480 72 75 63 74 75 72 65 20 6c 6f 6f 6b 73 20 73 6f  ructure looks so
15490 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 69  mething like thi
154a0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
154b0 73 74 72 75 63 74 20 45 78 61 6d 70 6c 65 31 20  struct Example1 
154c0 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 74  {.**          st
154d0 72 75 63 74 20 73 75 62 45 6c 65 6d 20 2a 61 45  ruct subElem *aE
154e0 6e 74 72 79 3b 0a 2a 2a 20 20 20 20 20 20 20 20  ntry;.**        
154f0 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 0a 2a 2a    int nEntry;.**
15500 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 41            int nA
15510 6c 6c 6f 63 3b 0a 2a 2a 20 20 20 20 20 20 20 20  lloc;.**        
15520 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6e 45 6e  }.**.** The pnEn
15530 74 72 79 20 70 61 72 61 6d 65 74 65 72 20 70 6f  try parameter po
15540 69 6e 74 73 20 74 6f 20 74 68 65 20 65 71 75 69  ints to the equi
15550 76 61 6c 65 6e 74 20 6f 66 20 45 78 61 6d 70 6c  valent of Exampl
15560 65 31 2e 6e 45 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a  e1.nEntry..**.**
15570 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
15580 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 20 73 6c  locates a new sl
15590 6f 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 2c  ot in the array,
155a0 20 7a 65 72 6f 73 20 69 74 20 6f 75 74 2c 0a 2a   zeros it out,.*
155b0 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 20 69 74  * and returns it
155c0 73 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 61 6c  s index.  If mal
155d0 6c 6f 63 20 66 61 69 6c 73 20 61 20 6e 65 67 61  loc fails a nega
155e0 74 69 76 65 20 6e 75 6d 62 65 72 20 69 73 20 72  tive number is r
155f0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  eturned..**.** s
15600 7a 45 6e 74 72 79 20 69 73 20 74 68 65 20 73 69  zEntry is the si
15610 7a 65 6f 66 20 6f 66 20 61 20 73 69 6e 67 6c 65  zeof of a single
15620 20 61 72 72 61 79 20 65 6e 74 72 79 2e 20 20 69   array entry.  i
15630 6e 69 74 53 69 7a 65 20 69 73 20 74 68 65 20 0a  nitSize is the .
15640 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 72  ** number of arr
15650 61 79 20 65 6e 74 72 69 65 73 20 61 6c 6c 6f 63  ay entries alloc
15660 61 74 65 64 20 6f 6e 20 74 68 65 20 69 6e 69 74  ated on the init
15670 69 61 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a  ial allocation..
15680 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 41 72  */.int sqlite3Ar
15690 72 61 79 41 6c 6c 6f 63 61 74 65 28 76 6f 69 64  rayAllocate(void
156a0 20 2a 2a 70 70 41 72 72 61 79 2c 20 69 6e 74 20   **ppArray, int 
156b0 73 7a 45 6e 74 72 79 2c 20 69 6e 74 20 69 6e 69  szEntry, int ini
156c0 74 53 69 7a 65 29 7b 0a 20 20 63 68 61 72 20 2a  tSize){.  char *
156d0 70 3b 0a 20 20 69 6e 74 20 2a 61 6e 20 3d 20 28  p;.  int *an = (
156e0 69 6e 74 2a 29 26 70 70 41 72 72 61 79 5b 31 5d  int*)&ppArray[1]
156f0 3b 0a 20 20 69 66 28 20 61 6e 5b 30 5d 3e 3d 61  ;.  if( an[0]>=a
15700 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 76 6f 69 64  n[1] ){.    void
15710 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20   *pNew;.    int 
15720 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 6e 65 77  newSize;.    new
15730 53 69 7a 65 20 3d 20 61 6e 5b 31 5d 2a 32 20 2b  Size = an[1]*2 +
15740 20 69 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20 70   initSize;.    p
15750 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
15760 6c 6f 63 28 2a 70 70 41 72 72 61 79 2c 20 6e 65  loc(*ppArray, ne
15770 77 53 69 7a 65 2a 73 7a 45 6e 74 72 79 29 3b 0a  wSize*szEntry);.
15780 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
15790 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
157a0 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e  -1;.    }.    an
157b0 5b 31 5d 20 3d 20 6e 65 77 53 69 7a 65 3b 0a 20  [1] = newSize;. 
157c0 20 20 20 2a 70 70 41 72 72 61 79 20 3d 20 70 4e     *ppArray = pN
157d0 65 77 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 2a 70  ew;.  }.  p = *p
157e0 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74  pArray;.  memset
157f0 28 26 70 5b 61 6e 5b 30 5d 2a 73 7a 45 6e 74 72  (&p[an[0]*szEntr
15800 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b  y], 0, szEntry);
15810 0a 20 20 72 65 74 75 72 6e 20 61 6e 5b 30 5d 2b  .  return an[0]+
15820 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  +;.}../*.** Appe
15830 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  nd a new element
15840 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64   to the given Id
15850 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20  List.  Create a 
15860 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a  new IdList if.**
15870 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20   need be..**.** 
15880 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20  A new IdList is 
15890 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
158a0 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
158b0 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a  ils..*/.IdList *
158c0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70  sqlite3IdListApp
158d0 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  end(IdList *pLis
158e0 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
158f0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
15900 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
15910 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
15920 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49  Malloc( sizeof(I
15930 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
15940 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
15950 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
15960 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  ->nAlloc = 0;.  
15970 7d 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 41  }.  i = sqlite3A
15980 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 28 76 6f  rrayAllocate((vo
15990 69 64 2a 2a 29 26 70 4c 69 73 74 2d 3e 61 2c 20  id**)&pList->a, 
159a0 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
159b0 30 5d 29 2c 20 35 29 3b 0a 20 20 69 66 28 20 69  0]), 5);.  if( i
159c0 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
159d0 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  3IdListDelete(pL
159e0 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ist);.    return
159f0 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d   0;.  }.  pList-
15a00 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
15a10 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
15a20 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65  en(pToken);.  re
15a30 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
15a40 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49  *.** Delete an I
15a50 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dList..*/.void s
15a60 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
15a70 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  te(IdList *pList
15a80 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
15a90 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
15aa0 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
15ab0 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
15ac0 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  +){.    sqliteFr
15ad0 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ee(pList->a[i].z
15ae0 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
15af0 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
15b00 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
15b10 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
15b20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
15b30 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68  x in pList of th
15b40 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d  e identifier nam
15b50 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20  ed zId.  Return 
15b60 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75  -1.** if not fou
15b70 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
15b80 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64  e3IdListIndex(Id
15b90 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e  List *pList, con
15ba0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
15bb0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
15bc0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
15bd0 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  n -1;.  for(i=0;
15be0 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
15bf0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
15c00 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
15c10 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  t->a[i].zName, z
15c20 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
15c30 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
15c40 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n -1;.}../*.** A
15c50 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c  ppend a new tabl
15c60 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69  e name to the gi
15c70 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72  ven SrcList.  Cr
15c80 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69  eate a new SrcLi
15c90 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
15ca0 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
15cb0 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  s created in the
15cc0 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66   SrcList even if
15cd0 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e   pToken is NULL.
15ce0 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63  .**.** A new Src
15cf0 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
15d00 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
15d10 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a  loc() fails..**.
15d20 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20  ** If pDatabase 
15d30 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20  is not null, it 
15d40 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74  means that the t
15d50 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69  able has an opti
15d60 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  onal.** database
15d70 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c   name prefix.  L
15d80 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61  ike this:  "data
15d90 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68  base.table".  Th
15da0 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70  e pDatabase.** p
15db0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62  oints to the tab
15dc0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
15dd0 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  pTable points to
15de0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
15df0 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69  me..** The SrcLi
15e00 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65  st.a[].zName fie
15e10 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ld is filled wit
15e20 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
15e30 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20   which might.** 
15e40 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  come from pTable
15e50 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69   (if pDatabase i
15e60 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20  s NULL) or from 
15e70 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20  pDatabase.  .** 
15e80 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74  SrcList.a[].zDat
15e90 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20  abase is filled 
15ea0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
15eb0 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62  e name from pTab
15ec0 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e  le,.** or with N
15ed0 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61  ULL if no databa
15ee0 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e  se is specified.
15ef0 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
15f00 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c  words, if call l
15f10 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
15f20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
15f30 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42  rcListAppend(A,B
15f40 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,0);.**.** Then 
15f50 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d  B is a table nam
15f60 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
15f70 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65  se name is unspe
15f80 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c  cified.  If call
15f90 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a  ed.** like this:
15fa0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
15fb0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
15fc0 65 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a  end(A,B,C);.**.*
15fd0 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20  * Then C is the 
15fe0 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42  table name and B
15ff0 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65   is the database
16000 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73   name..*/.SrcLis
16010 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
16020 74 41 70 70 65 6e 64 28 53 72 63 4c 69 73 74 20  tAppend(SrcList 
16030 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
16040 54 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70 44  Table, Token *pD
16050 61 74 61 62 61 73 65 29 7b 0a 20 20 73 74 72 75  atabase){.  stru
16060 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
16070 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
16080 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
16090 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ist = sqliteMall
160a0 6f 63 28 20 73 69 7a 65 6f 66 28 53 72 63 4c 69  oc( sizeof(SrcLi
160b0 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
160c0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
160d0 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
160e0 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20  Alloc = 1;.  }. 
160f0 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53 72 63   if( pList->nSrc
16100 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20  >=pList->nAlloc 
16110 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  ){.    SrcList *
16120 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73 74 2d  pNew;.    pList-
16130 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20  >nAlloc *= 2;.  
16140 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    pNew = sqliteR
16150 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a 20 20  ealloc(pList,.  
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
16170 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20 28 70  eof(*pList) + (p
16180 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a  List->nAlloc-1)*
16190 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
161a0 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  0]) );.    if( p
161b0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
161c0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
161d0 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
161e0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
161f0 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70   }.    pList = p
16200 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  New;.  }.  pItem
16210 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
16220 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20 20 6d 65 6d  st->nSrc];.  mem
16230 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69  set(pItem, 0, si
16240 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
16250 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62  ));.  if( pDatab
16260 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65  ase && pDatabase
16270 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  ->z==0 ){.    pD
16280 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
16290 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
162a0 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a 20 20   && pTable ){.  
162b0 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d    Token *pTemp =
162c0 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20   pDatabase;.    
162d0 70 44 61 74 61 62 61 73 65 20 3d 20 70 54 61 62  pDatabase = pTab
162e0 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d  le;.    pTable =
162f0 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49   pTemp;.  }.  pI
16300 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
16310 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
16320 6e 28 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74  n(pTable);.  pIt
16330 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
16340 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
16350 6f 6b 65 6e 28 70 44 61 74 61 62 61 73 65 29 3b  oken(pDatabase);
16360 0a 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  .  pItem->iCurso
16370 72 20 3d 20 2d 31 3b 0a 20 20 70 49 74 65 6d 2d  r = -1;.  pItem-
16380 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 30  >isPopulated = 0
16390 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b  ;.  pList->nSrc+
163a0 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  +;.  return pLis
163b0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  t;.}../*.** Assi
163c0 67 6e 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c  gn cursors to al
163d0 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72  l tables in a Sr
163e0 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  cList.*/.void sq
163f0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
16400 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20  gnCursors(Parse 
16410 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
16420 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
16430 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  i;.  struct SrcL
16440 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
16450 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73 74 20  .  assert(pList 
16460 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  || sqlite3Malloc
16470 46 61 69 6c 65 64 28 29 20 29 3b 0a 20 20 69 66  Failed() );.  if
16480 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
16490 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(i=0, pItem=pL
164a0 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
164b0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
164c0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
164d0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d  pItem->iCursor>=
164e0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
164f0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20   pItem->iCursor 
16500 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
16510 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
16520 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
16530 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
16540 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
16550 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  s(pParse, pItem-
16560 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b  >pSelect->pSrc);
16570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16580 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
16590 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20  an alias to the 
165a0 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65 72 20  last identifier 
165b0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69 64 65  on the given ide
165c0 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f  ntifier list..*/
165d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
165e0 4c 69 73 74 41 64 64 41 6c 69 61 73 28 53 72 63  ListAddAlias(Src
165f0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
16600 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69  en *pToken){.  i
16610 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73  f( pList && pLis
16620 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20  t->nSrc>0 ){.   
16630 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d   pList->a[pList-
16640 3e 6e 53 72 63 2d 31 5d 2e 7a 41 6c 69 61 73 20  >nSrc-1].zAlias 
16650 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
16660 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a  mToken(pToken);.
16670 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
16680 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
16690 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
166a0 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
166b0 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
166c0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
166d0 74 65 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  te(SrcList *pLis
166e0 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
166f0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
16700 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
16710 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
16720 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  rn;.  for(pItem=
16730 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
16740 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
16750 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
16760 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65   sqliteFree(pIte
16770 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
16780 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49     sqliteFree(pI
16790 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
167a0 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65   sqliteFree(pIte
167b0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
167c0 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
167d0 6c 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70 54 61  le(0, pItem->pTa
167e0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  b);.    sqlite3S
167f0 65 6c 65 63 74 44 65 6c 65 74 65 28 70 49 74 65  electDelete(pIte
16800 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
16810 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
16820 74 65 28 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a  te(pItem->pOn);.
16830 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
16840 74 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70  tDelete(pItem->p
16850 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71  Using);.  }.  sq
16860 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b  liteFree(pList);
16870 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
16880 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
16890 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
168a0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  inTransaction(Pa
168b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
168c0 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65   type){.  sqlite
168d0 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
168e0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66  ;.  int i;..  if
168f0 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
16900 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
16910 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  0 || db->aDb[0].
16920 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
16930 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
16940 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61  Err || sqlite3Ma
16950 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20 72  llocFailed() ) r
16960 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
16970 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
16980 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
16990 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e  NSACTION, "BEGIN
169a0 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  ", 0, 0) ) retur
169b0 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  n;..  v = sqlite
169c0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
169d0 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74  ;.  if( !v ) ret
169e0 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21  urn;.  if( type!
169f0 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a  =TK_DEFERRED ){.
16a00 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
16a10 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
16a20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16a30 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73  ddOp(v, OP_Trans
16a40 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65  action, i, (type
16a50 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b  ==TK_EXCLUSIVE)+
16a60 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
16a70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16a80 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
16a90 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  t, 0, 0);.}../*.
16aa0 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e  ** Commit a tran
16ab0 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
16ac0 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61  sqlite3CommitTra
16ad0 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
16ae0 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
16af0 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
16b00 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  v;..  if( pParse
16b10 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
16b20 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
16b30 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
16b40 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
16b50 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
16b60 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
16b70 65 64 28 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ed() ) return;. 
16b80 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
16b90 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
16ba0 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
16bb0 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
16bc0 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76  ) ) return;..  v
16bd0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
16be0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
16bf0 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
16c00 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
16c10 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20  _AutoCommit, 1, 
16c20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
16c30 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e   Rollback a tran
16c40 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
16c50 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54  sqlite3RollbackT
16c60 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
16c70 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
16c80 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
16c90 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72   *v;..  if( pPar
16ca0 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
16cb0 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
16cc0 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
16cd0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
16ce0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
16cf0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61   sqlite3MallocFa
16d00 69 6c 65 64 28 29 20 29 20 72 65 74 75 72 6e 3b  iled() ) return;
16d10 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
16d20 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
16d30 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
16d40 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20  ON, "ROLLBACK", 
16d50 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
16d60 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
16d70 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
16d80 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
16d90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
16da0 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
16db0 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   1, 1);.  }.}../
16dc0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
16dd0 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  he TEMP database
16de0 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61   is open and ava
16df0 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20  ilable for use. 
16e00 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e   Return.** the n
16e10 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
16e20 20 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f    Leave any erro
16e30 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68  r messages in th
16e40 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
16e50 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  re..*/.int sqlit
16e60 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
16e70 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
16e80 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
16e90 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
16ea0 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
16eb0 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73  pBt==0 && !pPars
16ec0 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
16ed0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
16ee0 65 33 42 74 72 65 65 46 61 63 74 6f 72 79 28 64  e3BtreeFactory(d
16ef0 62 2c 20 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47  b, 0, 0, MAX_PAG
16f00 45 53 2c 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e  ES, &db->aDb[1].
16f10 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pBt);.    if( rc
16f20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16f30 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
16f40 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
16f50 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74  able to open a t
16f60 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
16f70 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c  e ".        "fil
16f80 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65  e for storing te
16f90 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29  mporary tables")
16fa0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
16fb0 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72  rc = rc;.      r
16fc0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
16fd0 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73     if( db->flags
16fe0 20 26 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   & !db->autoComm
16ff0 69 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  it ){.      rc =
17000 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
17010 69 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b  inTrans(db->aDb[
17020 31 5d 2e 70 42 74 2c 20 31 29 3b 0a 20 20 20 20  1].pBt, 1);.    
17030 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17040 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
17050 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
17060 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
17070 6f 20 67 65 74 20 61 20 77 72 69 74 65 20 6c 6f  o get a write lo
17080 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20 20 20  ck on ".        
17090 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61 72 79    "the temporary
170a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 29   database file")
170b0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
170c0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
170d0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
170e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
170f0 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31  ssert( db->aDb[1
17100 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 7d  ].pSchema );.  }
17110 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
17120 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
17130 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 77 69  DBE code that wi
17140 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20 73 63  ll verify the sc
17150 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20  hema cookie and 
17160 73 74 61 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d  start.** a read-
17170 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
17180 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61 62 61  all named databa
17190 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  se files..**.** 
171a0 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
171b0 74 68 61 74 20 61 6c 6c 20 73 63 68 65 6d 61 20  that all schema 
171c0 63 6f 6f 6b 69 65 73 20 62 65 20 76 65 72 69 66  cookies be verif
171d0 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72  ied and all.** r
171e0 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ead transactions
171f0 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
17200 72 65 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  re anything else
17210 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74   happens in.** t
17220 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e  he VDBE program.
17230 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69    But this routi
17240 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  ne can be called
17250 20 61 66 74 65 72 20 6d 75 63 68 20 6f 74 68 65   after much othe
17260 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20 62 65  r.** code has be
17270 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20 20 53  en generated.  S
17280 6f 20 68 65 72 65 20 69 73 20 77 68 61 74 20 77  o here is what w
17290 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e do:.**.** The 
172a0 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  first time this 
172b0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
172c0 64 2c 20 77 65 20 63 6f 64 65 20 61 6e 20 4f 50  d, we code an OP
172d0 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69  _Goto that.** wi
172e0 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73 75 62  ll jump to a sub
172f0 72 6f 75 74 69 6e 65 20 61 74 20 74 68 65 20 65  routine at the e
17300 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  nd of the progra
17310 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72  m.  Then we.** r
17320 65 63 6f 72 64 20 65 76 65 72 79 20 64 61 74 61  ecord every data
17330 62 61 73 65 20 74 68 61 74 20 6e 65 65 64 73 20  base that needs 
17340 69 74 73 20 73 63 68 65 6d 61 20 76 65 72 69 66  its schema verif
17350 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50  ied in the.** pP
17360 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
17370 20 66 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20   field.  Later, 
17380 61 66 74 65 72 20 61 6c 6c 20 6f 74 68 65 72 20  after all other 
17390 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a  code has been.**
173a0 20 67 65 6e 65 72 61 74 65 64 2c 20 74 68 65 20   generated, the 
173b0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
173c0 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  does the cookie 
173d0 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20 61 6e  verifications an
173e0 64 0a 2a 2a 20 73 74 61 72 74 73 20 74 68 65 20  d.** starts the 
173f0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c  transactions wil
17400 6c 20 62 65 20 63 6f 64 65 64 20 61 6e 64 20 74  l be coded and t
17410 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61  he OP_Goto P2 va
17420 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d  lue.** will be m
17430 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ade to point to 
17440 74 68 61 74 20 73 75 62 72 6f 75 74 69 6e 65 2e  that subroutine.
17450 20 20 54 68 65 20 67 65 6e 65 72 61 74 69 6f 6e    The generation
17460 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69   of the.** cooki
17470 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 73  e verification s
17480 75 62 72 6f 75 74 69 6e 65 20 63 6f 64 65 20 68  ubroutine code h
17490 61 70 70 65 6e 73 20 69 6e 20 73 71 6c 69 74 65  appens in sqlite
174a0 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
174b0 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20  .**.** If iDb<0 
174c0 74 68 65 6e 20 63 6f 64 65 20 74 68 65 20 4f 50  then code the OP
174d0 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e  _Goto only - don
174e0 27 74 20 73 65 74 20 66 6c 61 67 20 74 6f 20 76  't set flag to v
174f0 65 72 69 66 79 20 74 68 65 0a 2a 2a 20 73 63 68  erify the.** sch
17500 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74 61 62  ema on any datab
17510 61 73 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20  ases.  This can 
17520 62 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74  be used to posit
17530 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a  ion the OP_Goto.
17540 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20  ** early in the 
17550 63 6f 64 65 2c 20 62 65 66 6f 72 65 20 77 65 20  code, before we 
17560 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64 61 74 61  know if any data
17570 62 61 73 65 20 74 61 62 6c 65 73 20 77 69 6c 6c  base tables will
17580 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69   be used..*/.voi
17590 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  d sqlite3CodeVer
175a0 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20  ifySchema(Parse 
175b0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
175c0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
175d0 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
175e0 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d 20  nt mask;..  v = 
175f0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
17600 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
17610 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  =0 ) return;  /*
17620 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
17630 6e 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ns if there was 
17640 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f  a prior error */
17650 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
17660 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  db;.  if( pParse
17670 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20  ->cookieGoto==0 
17680 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63  ){.    pParse->c
17690 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69  ookieGoto = sqli
176a0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
176b0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31  OP_Goto, 0, 0)+1
176c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3e  ;.  }.  if( iDb>
176d0 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
176e0 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  ( iDb<db->nDb );
176f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
17700 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30  >aDb[iDb].pBt!=0
17710 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20   || iDb==1 );.  
17720 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 33 32    assert( iDb<32
17730 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 31   );.    mask = 1
17740 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66 28 20 28  <<iDb;.    if( (
17750 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
17760 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  sk & mask)==0 ){
17770 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
17780 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73  ookieMask |= mas
17790 6b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  k;.      pParse-
177a0 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62  >cookieValue[iDb
177b0 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  ] = db->aDb[iDb]
177c0 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
177d0 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69  _cookie;.      i
177e0 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
177f0 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
17800 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
17810 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 50 61  TempDatabase(pPa
17820 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rse);.      }.  
17830 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
17840 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
17850 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65  ode that prepare
17860 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f  s for doing an o
17870 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  peration that.**
17880 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
17890 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
178a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
178b0 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e  tarts a new tran
178c0 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72  saction if we ar
178d0 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69  e not already wi
178e0 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61  thin.** a transa
178f0 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72  ction.  If we ar
17900 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  e already within
17910 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
17920 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e  then a checkpoin
17930 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74  t.** is set if t
17940 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20  he setStatement 
17950 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75  parameter is tru
17960 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74  e.  A checkpoint
17970 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
17980 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73  t for operations
17990 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c   that might fail
179a0 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74   (due to a const
179b0 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a  raint) part of.*
179c0 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67  * the way throug
179d0 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c  h and which will
179e0 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f   need to undo so
179f0 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75  me writes withou
17a00 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72  t having to.** r
17a10 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c  ollback the whol
17a20 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
17a30 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  For operations w
17a40 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  here all constra
17a50 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  ints.** can be c
17a60 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e  hecked before an
17a70 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  y changes are ma
17a80 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
17a90 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a  se, it is never.
17aa0 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ** necessary to 
17ab0 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64  undo a write and
17ac0 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
17ad0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65  should not be se
17ae0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61  t..**.** Only da
17af0 74 61 62 61 73 65 20 69 44 62 20 61 6e 64 20 74  tabase iDb and t
17b00 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
17b10 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62   are made writab
17b20 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c 6c 2e  le by this call.
17b30 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20 74  .** If iDb==0, t
17b40 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e 64  hen the main and
17b50 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 73 20   temp databases 
17b60 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c  are made writabl
17b70 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d 3d  e.   If.** iDb==
17b80 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20  1 then only the 
17b90 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 69 73  temp database is
17ba0 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20   made writable. 
17bb0 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e 20 74   If iDb>1 then t
17bc0 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  he.** specified 
17bd0 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
17be0 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20  se and the temp 
17bf0 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64  database are mad
17c00 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76  e writable..*/.v
17c10 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
17c20 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50  WriteOperation(P
17c30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
17c40 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20  t setStatement, 
17c50 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
17c60 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
17c70 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
17c80 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
17c90 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65  n;.  sqlite3Code
17ca0 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
17cb0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 50 61  rse, iDb);.  pPa
17cc0 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c  rse->writeMask |
17cd0 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20  = 1<<iDb;.  if( 
17ce0 73 65 74 53 74 61 74 65 6d 65 6e 74 20 26 26 20  setStatement && 
17cf0 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
17d00 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
17d10 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
17d20 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62 2c 20  Statement, iDb, 
17d30 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 4f  0);.  }.  if( (O
17d40 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69 44  MIT_TEMPDB || iD
17d50 62 21 3d 31 29 20 26 26 20 70 50 61 72 73 65 2d  b!=1) && pParse-
17d60 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 21  >db->aDb[1].pBt!
17d70 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
17d80 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
17d90 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 73 65 74  tion(pParse, set
17da0 53 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a 20  Statement, 1);. 
17db0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63   }.}../*.** Chec
17dc0 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64  k to see if pInd
17dd0 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c  ex uses the coll
17de0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
17df0 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  Coll.  Return.**
17e00 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
17e10 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74   and false if it
17e20 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69   does not..*/.#i
17e30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17e40 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
17e50 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61   int collationMa
17e60 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tch(const char *
17e70 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49  zColl, Index *pI
17e80 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  ndex){.  int i;.
17e90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e    for(i=0; i<pIn
17ea0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  dex->nColumn; i+
17eb0 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
17ec0 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e  ar *z = pIndex->
17ed0 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69  azColl[i];.    i
17ee0 66 28 20 7a 3d 3d 7a 43 6f 6c 6c 20 7c 7c 20 28  f( z==zColl || (
17ef0 7a 20 26 26 20 7a 43 6f 6c 6c 20 26 26 20 30 3d  z && zColl && 0=
17f00 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
17f10 7a 2c 20 7a 43 6f 6c 6c 29 29 20 29 7b 0a 20 20  z, zColl)) ){.  
17f20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
17f30 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
17f40 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
17f50 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c  .** Recompute al
17f60 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
17f70 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63  b that use the c
17f80 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
17f90 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70  e pColl..** If p
17fa0 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
17fb0 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
17fc0 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23  es of pTab..*/.#
17fd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17fe0 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
17ff0 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61  c void reindexTa
18000 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
18010 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
18020 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
18030 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  l){.  Index *pIn
18040 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
18050 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
18060 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
18070 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e  ab */..  for(pIn
18080 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  dex=pTab->pIndex
18090 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
180a0 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b  =pIndex->pNext){
180b0 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d  .    if( zColl==
180c0 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61  0 || collationMa
180d0 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65  tch(zColl, pInde
180e0 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  x) ){.      int 
180f0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
18100 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
18110 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
18120 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  hema);.      sql
18130 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
18140 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
18150 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  0, iDb);.      s
18160 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
18170 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
18180 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , -1);.    }.  }
18190 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
181a0 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
181b0 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61  ndices of all ta
181c0 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  bles in all data
181d0 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a  bases where the.
181e0 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74  ** indices use t
181f0 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
18200 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66  uence pColl.  If
18210 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
18220 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20  ecompute.** all 
18230 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65  indices everywhe
18240 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  re..*/.#ifndef S
18250 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
18260 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  EX.static void r
18270 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
18280 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
18290 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
182a0 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  ){.  Db *pDb;   
182b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182c0 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74   /* A single dat
182d0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
182e0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
182f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
18300 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
18310 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
18320 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
18330 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
18340 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
18350 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b  */.  HashElem *k
18360 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18370 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
18380 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70  over tables in p
18390 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  Db */.  Table *p
183a0 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
183b0 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
183c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
183d0 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20  /..  for(iDb=0, 
183e0 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62  pDb=db->aDb; iDb
183f0 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c  <db->nDb; iDb++,
18400 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73   pDb++){.    ass
18410 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20  ert( pDb!=0 );. 
18420 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48     for(k=sqliteH
18430 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70  ashFirst(&pDb->p
18440 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
18450 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61  ;  k; k=sqliteHa
18460 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20  shNext(k)){.    
18470 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a    pTab = (Table*
18480 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
18490 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65  k);.      reinde
184a0 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
184b0 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  Tab, zColl);.   
184c0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
184d0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
184e0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45 49  code for the REI
184f0 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
18500 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
18510 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EX              
18520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
18530 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   1.**        REI
18540 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e  NDEX  <collation
18550 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >               
18560 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 2.**        R
18570 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
18580 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e  se>.?<tablename>
18590 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20    -- 3.**       
185a0 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
185b0 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d  base>.?<indexnam
185c0 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46  e>  -- 4.**.** F
185d0 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c  orm 1 causes all
185e0 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
185f0 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
18600 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74  es to be rebuilt
18610 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75  ..** Form 2 rebu
18620 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  ilds all indices
18630 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
18640 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e  s that use the n
18650 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e  amed.** collatin
18660 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72  g function.  For
18670 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75 69  ms 3 and 4 rebui
18680 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  ld the named ind
18690 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64  ex or all.** ind
186a0 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
186b0 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74  with the named t
186c0 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
186d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
186e0 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65  NDEX.void sqlite
186f0 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a  3Reindex(Parse *
18700 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
18710 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Name1, Token *pN
18720 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ame2){.  CollSeq
18730 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *pColl;        
18740 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
18750 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65  g sequence to be
18760 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e   reindexed, or N
18770 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ULL */.  char *z
18780 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18790 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
187a0 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
187b0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
187c0 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20   *zDb;          
187d0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
187e0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54   database */.  T
187f0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
18800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
18810 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
18820 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78  abase */.  Index
18830 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
18840 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
18850 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
18860 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  th pTab */.  int
18870 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
18880 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18890 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
188a0 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
188b0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
188c0 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
188d0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
188e0 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f  n */.  Token *pO
188f0 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  bjName;         
18900 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
18910 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
18920 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
18930 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   */..  /* Read t
18940 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
18950 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ma. If an error 
18960 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
18970 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
18980 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20   ** and code in 
18990 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
189a0 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28  n NULL. */.  if(
189b0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
189c0 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
189d0 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74  arse) ){.    ret
189e0 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  urn;.  }..  if( 
189f0 70 4e 61 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e 61  pName1==0 || pNa
18a00 6d 65 31 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  me1->z==0 ){.   
18a10 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
18a20 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20  s(pParse, 0);.  
18a30 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73    return;.  }els
18a40 65 20 69 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20  e if( pName2==0 
18a50 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20  || pName2->z==0 
18a60 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
18a70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20  Name1->z );.    
18a80 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
18a90 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
18aa0 4e 43 28 64 62 29 2c 20 28 63 68 61 72 2a 29 70  NC(db), (char*)p
18ab0 4e 61 6d 65 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31  Name1->z, pName1
18ac0 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ->n, 0);.    if(
18ad0 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
18ae0 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 73 71  char *zColl = sq
18af0 6c 69 74 65 53 74 72 4e 44 75 70 28 28 63 6f 6e  liteStrNDup((con
18b00 73 74 20 63 68 61 72 20 2a 29 70 4e 61 6d 65 31  st char *)pName1
18b10 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d 3e 6e 29 3b  ->z, pName1->n);
18b20 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c  .      if( zColl
18b30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 69 6e   ){.        rein
18b40 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
18b50 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  rse, zColl);.   
18b60 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
18b70 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  zColl);.      }.
18b80 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
18b90 20 20 7d 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20    }.  }.  iDb = 
18ba0 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
18bb0 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
18bc0 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a  1, pName2, &pObj
18bd0 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62  Name);.  if( iDb
18be0 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  <0 ) return;.  z
18bf0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
18c00 6f 6d 54 6f 6b 65 6e 28 70 4f 62 6a 4e 61 6d 65  omToken(pObjName
18c10 29 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61  );.  zDb = db->a
18c20 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
18c30 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
18c40 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20  indTable(db, z, 
18c50 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62  zDb);.  if( pTab
18c60 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54   ){.    reindexT
18c70 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
18c80 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
18c90 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 72 65  eFree(z);.    re
18ca0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  turn;.  }.  pInd
18cb0 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
18cc0 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62  Index(db, z, zDb
18cd0 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
18ce0 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  z);.  if( pIndex
18cf0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
18d00 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
18d10 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
18d20 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  b);.    sqlite3R
18d30 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
18d40 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
18d50 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
18d60 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
18d70 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
18d80 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68  e to identify th
18d90 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72  e object to be r
18da0 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65  eindexed");.}.#e
18db0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
18dc0 72 6e 20 61 20 64 79 6e 61 6d 69 63 6c 79 20 61  rn a dynamicly a
18dd0 6c 6c 6f 63 61 74 65 64 20 4b 65 79 49 6e 66 6f  llocated KeyInfo
18de0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
18df0 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 77  can be used.** w
18e00 69 74 68 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20  ith OP_OpenRead 
18e10 6f 72 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20  or OP_OpenWrite 
18e20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 62 61  to access databa
18e30 73 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  se index pIdx..*
18e40 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
18e50 75 6c 2c 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ul, a pointer to
18e60 20 74 68 65 20 6e 65 77 20 73 74 72 75 63 74 75   the new structu
18e70 72 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  re is returned. 
18e80 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
18e90 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  the caller is re
18ea0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
18eb0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 46 72 65 65  lling sqliteFree
18ec0 28 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e  () on the return
18ed0 65 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 20  ed .** pointer. 
18ee0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
18ef0 72 73 20 28 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  rs (out of memor
18f00 79 20 6f 72 20 6d 69 73 73 69 6e 67 20 63 6f 6c  y or missing col
18f10 6c 61 74 69 6f 6e 20 0a 2a 2a 20 73 65 71 75 65  lation .** seque
18f20 6e 63 65 29 2c 20 4e 55 4c 4c 20 69 73 20 72 65  nce), NULL is re
18f30 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73  turned and the s
18f40 74 61 74 65 20 6f 66 20 70 50 61 72 73 65 20 75  tate of pParse u
18f50 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63  pdated to reflec
18f60 74 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 0a  t.** the error..
18f70 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
18f80 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
18f90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
18fa0 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69  ndex *pIdx){.  i
18fb0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  nt i;.  int nCol
18fc0 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   = pIdx->nColumn
18fd0 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 20 3d  ;.  int nBytes =
18fe0 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29   sizeof(KeyInfo)
18ff0 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65   + (nCol-1)*size
19000 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 6e  of(CollSeq*) + n
19010 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  Col;.  KeyInfo *
19020 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f 20  pKey = (KeyInfo 
19030 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e  *)sqliteMalloc(n
19040 42 79 74 65 73 29 3b 0a 0a 20 20 69 66 28 20 70  Bytes);..  if( p
19050 4b 65 79 20 29 7b 0a 20 20 20 20 70 4b 65 79 2d  Key ){.    pKey-
19060 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
19070 38 20 2a 29 26 28 70 4b 65 79 2d 3e 61 43 6f 6c  8 *)&(pKey->aCol
19080 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20 61 73  l[nCol]);.    as
19090 73 65 72 74 28 20 26 70 4b 65 79 2d 3e 61 53 6f  sert( &pKey->aSo
190a0 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 3d 3d 26  rtOrder[nCol]==&
190b0 28 28 28 75 38 20 2a 29 70 4b 65 79 29 5b 6e 42  (((u8 *)pKey)[nB
190c0 79 74 65 73 5d 29 20 29 3b 0a 20 20 20 20 66 6f  ytes]) );.    fo
190d0 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
190e0 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ++){.      char 
190f0 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61  *zColl = pIdx->a
19100 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zColl[i];.      
19110 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 20 29 3b  assert( zColl );
19120 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f  .      pKey->aCo
19130 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 4c  ll[i] = sqlite3L
19140 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
19150 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 3b  rse, zColl, -1);
19160 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f  .      pKey->aSo
19170 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64  rtOrder[i] = pId
19180 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
19190 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79  ;.    }.    pKey
191a0 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b  ->nField = nCol;
191b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72  .  }..  if( pPar
191c0 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
191d0 73 71 6c 69 74 65 46 72 65 65 28 70 4b 65 79 29  sqliteFree(pKey)
191e0 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a  ;.    pKey = 0;.
191f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65    }.  return pKe
19200 79 3b 0a 7d 0a                                   y;.}.