/ Hex Artifact Content
Login

Artifact ff75e783aa638482d2598a443f88e2ff40abc301:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 0a 2a 2a    ROLLBACK.**.**
02d0: 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20   $Id: build.c,v 
02e0: 31 2e 33 37 32 20 32 30 30 36 2f 30 31 2f 30 39  1.372 2006/01/09
02f0: 20 31 36 3a 31 32 3a 30 35 20 64 61 6e 69 65 6c   16:12:05 daniel
0300: 6b 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23  k1977 Exp $.*/.#
0310: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0320: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
0330: 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  ctype.h>../*.** 
0340: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0350: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  called when a ne
0360: 77 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  w SQL statement 
0370: 69 73 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a  is beginning to.
0380: 2a 2a 20 62 65 20 70 61 72 73 65 64 2e 20 20 49  ** be parsed.  I
0390: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 70 50  nitialize the pP
03a0: 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20 61  arse structure a
03b0: 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69  s needed..*/.voi
03c0: 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61  d sqlite3BeginPa
03d0: 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rse(Parse *pPars
03e0: 65 2c 20 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c  e, int explainFl
03f0: 61 67 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 65  ag){.  pParse->e
0400: 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61 69 6e  xplain = explain
0410: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
0420: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
0430: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0440: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0450: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0460: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0470: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0480: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0490: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
04a0: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
04b0: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
04c0: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
04d0: 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 54 61  t iDb;.  int iTa
04e0: 62 3b 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c  b;.  u8 isWriteL
04f0: 6f 63 6b 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ock;.  const cha
0500: 72 20 2a 7a 4e 61 6d 65 3b 0a 7d 3b 0a 0a 2f 2a  r *zName;.};../*
0510: 0a 2a 2a 20 48 61 76 65 20 74 68 65 20 63 6f 6d  .** Have the com
0520: 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 20  piled statement 
0530: 6c 6f 63 6b 20 74 68 65 20 74 61 62 6c 65 20 77  lock the table w
0540: 69 74 68 20 72 6f 6f 74 70 61 67 65 20 69 54 61  ith rootpage iTa
0550: 62 20 69 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a  b in database.**
0560: 20 69 44 62 20 61 74 20 74 68 65 20 73 68 61 72   iDb at the shar
0570: 65 64 2d 63 61 63 68 65 20 6c 65 76 65 6c 20 77  ed-cache level w
0580: 68 65 6e 20 65 78 65 63 75 74 65 64 2e 20 54 68  hen executed. Th
0590: 65 20 69 73 57 72 69 74 65 4c 6f 63 6b 20 61 72  e isWriteLock ar
05a0: 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 7a 65  gument .** is ze
05b0: 72 6f 20 66 6f 72 20 61 20 72 65 61 64 2d 6c 6f  ro for a read-lo
05c0: 63 6b 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  ck, or non-zero 
05d0: 66 6f 72 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  for a write-lock
05e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 4e 61 6d  ..**.** The zNam
05f0: 65 20 70 61 72 61 6d 65 74 65 72 20 73 68 6f 75  e parameter shou
0600: 6c 64 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ld point to the 
0610: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
0620: 65 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 0a  e name. This is.
0630: 2a 2a 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69  ** used to provi
0640: 64 65 20 61 20 6d 6f 72 65 20 69 6e 66 6f 72 6d  de a more inform
0650: 61 74 69 76 65 20 65 72 72 6f 72 20 6d 65 73 73  ative error mess
0660: 61 67 65 20 73 68 6f 75 6c 64 20 74 68 65 20 6c  age should the l
0670: 6f 63 6b 20 66 61 69 6c 2e 0a 2a 2f 0a 76 6f 69  ock fail..*/.voi
0680: 64 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f  d sqlite3TableLo
0690: 63 6b 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ck(.  Parse *pPa
06a0: 72 73 65 2c 20 0a 20 20 69 6e 74 20 69 44 62 2c  rse, .  int iDb,
06b0: 20 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 0a 20   .  int iTab, . 
06c0: 20 75 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 2c   u8 isWriteLock,
06d0: 20 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20    .  const char 
06e0: 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 69 6e 74 20  *zName.){.  int 
06f0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b  i;.  int nBytes;
0700: 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b  .  TableLock *p;
0710: 0a 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70  .  ThreadData *p
0720: 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72  Tsd = sqlite3Thr
0730: 65 61 64 44 61 74 61 28 29 3b 0a 0a 20 20 69 66  eadData();..  if
0740: 28 20 30 3d 3d 70 54 73 64 2d 3e 75 73 65 53 68  ( 0==pTsd->useSh
0750: 61 72 65 64 44 61 74 61 20 7c 7c 20 69 44 62 3c  aredData || iDb<
0760: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
0770: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  .  }..  for(i=0;
0780: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c   i<pParse->nTabl
0790: 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  eLock; i++){.   
07a0: 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54   p = &pParse->aT
07b0: 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20  ableLock[i];.   
07c0: 20 69 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62   if( p->iDb==iDb
07d0: 20 26 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61   && p->iTab==iTa
07e0: 62 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73  b ){.      p->is
07f0: 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e  WriteLock = (p->
0800: 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69  isWriteLock || i
0810: 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20  sWriteLock);.   
0820: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
0830: 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d  .  }..  nBytes =
0840: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63   sizeof(TableLoc
0850: 6b 29 20 2a 20 28 70 50 61 72 73 65 2d 3e 6e 54  k) * (pParse->nT
0860: 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20 73  ableLock+1);.  s
0870: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 4f 72 46 72  qliteReallocOrFr
0880: 65 65 28 28 76 6f 69 64 20 2a 2a 29 26 70 50 61  ee((void **)&pPa
0890: 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 2c  rse->aTableLock,
08a0: 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20   nBytes);.  if( 
08b0: 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f  pParse->aTableLo
08c0: 63 6b 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  ck ){.    p = &p
08d0: 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63  Parse->aTableLoc
08e0: 6b 5b 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65  k[pParse->nTable
08f0: 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e  Lock++];.    p->
0900: 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 20 20 70  iDb = iDb;.    p
0910: 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20  ->iTab = iTab;. 
0920: 20 20 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63     p->isWriteLoc
0930: 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b  k = isWriteLock;
0940: 0a 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 20 3d 20  .    p->zName = 
0950: 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  zName;.  }.}../*
0960: 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54  .** Code an OP_T
0970: 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74 72 75 63  ableLock instruc
0980: 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 61  tion for each ta
0990: 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79 20 74 68  ble locked by th
09a0: 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28  e.** statement (
09b0: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 63 61  configured by ca
09c0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 54 61  lls to sqlite3Ta
09d0: 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a 2f 0a 73  bleLock())..*/.s
09e0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 54  tatic void codeT
09f0: 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72 73 65 20  ableLocks(Parse 
0a00: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
0a10: 69 3b 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65  i;.  Vdbe *pVdbe
0a20: 3b 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ; .  assert( sql
0a30: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
0a40: 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20  ->useSharedData 
0a50: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c  || pParse->nTabl
0a60: 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 69  eLock==0 );..  i
0a70: 66 28 20 30 3d 3d 28 70 56 64 62 65 20 3d 20 73  f( 0==(pVdbe = s
0a80: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
0a90: 61 72 73 65 29 29 20 29 7b 0a 20 20 20 20 72 65  arse)) ){.    re
0aa0: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  turn;.  }..  for
0ab0: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
0ac0: 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29  nTableLock; i++)
0ad0: 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20  {.    TableLock 
0ae0: 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54  *p = &pParse->aT
0af0: 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20  ableLock[i];.   
0b00: 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62   int p1 = p->iDb
0b10: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73 57  ;.    if( p->isW
0b20: 72 69 74 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  riteLock ){.    
0b30: 20 20 70 31 20 3d 20 2d 31 2a 28 70 31 2b 31 29    p1 = -1*(p1+1)
0b40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
0b50: 74 65 33 56 64 62 65 4f 70 33 28 70 56 64 62 65  te3VdbeOp3(pVdbe
0b60: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0b70: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0b80: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
0b90: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20  );.  }.}.#else. 
0ba0: 20 23 64 65 66 69 6e 65 20 63 6f 64 65 54 61 62   #define codeTab
0bb0: 6c 65 4c 6f 63 6b 73 28 78 29 0a 23 65 6e 64 69  leLocks(x).#endi
0bc0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
0bd0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
0be0: 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65 20 53  after a single S
0bf0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  QL statement has
0c00: 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20   been.** parsed 
0c10: 61 6e 64 20 61 20 56 44 42 45 20 70 72 6f 67 72  and a VDBE progr
0c20: 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  am to execute th
0c30: 61 74 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  at statement has
0c40: 20 62 65 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65   been.** prepare
0c50: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
0c60: 20 70 75 74 73 20 74 68 65 20 66 69 6e 69 73 68   puts the finish
0c70: 69 6e 67 20 74 6f 75 63 68 65 73 20 6f 6e 20 74  ing touches on t
0c80: 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72  he.** VDBE progr
0c90: 61 6d 20 61 6e 64 20 72 65 73 65 74 73 20 74 68  am and resets th
0ca0: 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
0cb0: 72 65 20 66 6f 72 20 74 68 65 20 6e 65 78 74 0a  re for the next.
0cc0: 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20  ** parse..**.** 
0cd0: 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61 6e 20  Note that if an 
0ce0: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
0cf0: 69 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  it might be the 
0d00: 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20  case that.** no 
0d10: 56 44 42 45 20 63 6f 64 65 20 77 61 73 20 67 65  VDBE code was ge
0d20: 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  nerated..*/.void
0d30: 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f   sqlite3FinishCo
0d40: 64 69 6e 67 28 50 61 72 73 65 20 2a 70 50 61 72  ding(Parse *pPar
0d50: 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se){.  sqlite3 *
0d60: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  db;.  Vdbe *v;..
0d70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 68 72    if( sqlite3Thr
0d80: 65 61 64 44 61 74 61 28 29 2d 3e 6d 61 6c 6c 6f  eadData()->mallo
0d90: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
0da0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
0db0: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
0dc0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
0dd0: 70 56 64 62 65 20 29 7b 0a 20 20 20 20 69 66 28  pVdbe ){.    if(
0de0: 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c   pParse->rc==SQL
0df0: 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 72 73 65  ITE_OK && pParse
0e00: 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ->nErr ){.      
0e10: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
0e20: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
0e30: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
0e40: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20  ..  /* Begin by 
0e50: 67 65 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20  generating some 
0e60: 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65  termination code
0e70: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
0e80: 68 65 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f  he.  ** vdbe pro
0e90: 67 72 61 6d 0a 20 20 2a 2f 0a 20 20 64 62 20 3d  gram.  */.  db =
0ea0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76   pParse->db;.  v
0eb0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
0ec0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
0ed0: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
0ee0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
0ef0: 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 0a 20  _Halt, 0, 0);.. 
0f00: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65     /* The cookie
0f10: 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f   mask contains o
0f20: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
0f30: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70  database file op
0f40: 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20  en..    ** (Bit 
0f50: 30 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62  0 is for main, b
0f60: 69 74 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70  it 1 is for temp
0f70: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29  , and so forth.)
0f80: 20 20 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a    Bits are.    *
0f90: 2a 20 73 65 74 20 66 6f 72 20 65 61 63 68 20 64  * set for each d
0fa0: 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20  atabase that is 
0fb0: 75 73 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20  used.  Generate 
0fc0: 63 6f 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a  code to start a.
0fd0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
0fe0: 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20  on on each used 
0ff0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20  database and to 
1000: 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
1010: 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20  a cookie.    ** 
1020: 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61 74  on each used dat
1030: 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  abase..    */.  
1040: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
1050: 6f 6b 69 65 47 6f 74 6f 3e 30 20 29 7b 0a 20 20  okieGoto>0 ){.  
1060: 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 0a 20 20      u32 mask;.  
1070: 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
1080: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1090: 6d 70 48 65 72 65 28 76 2c 20 70 50 61 72 73 65  mpHere(v, pParse
10a0: 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29 3b  ->cookieGoto-1);
10b0: 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30  .      for(iDb=0
10c0: 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62  , mask=1; iDb<db
10d0: 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c  ->nDb; mask<<=1,
10e0: 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20   iDb++){.       
10f0: 20 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50 61   if( (mask & pPa
1100: 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29  rse->cookieMask)
1110: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1120: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1130: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54  dbeAddOp(v, OP_T
1140: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62 2c  ransaction, iDb,
1150: 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d   (mask & pParse-
1160: 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29 3b  >writeMask)!=0);
1170: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1180: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1190: 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69 44  VerifyCookie, iD
11a0: 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  b, pParse->cooki
11b0: 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b 0a 20 20  eValue[iDb]);.  
11c0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
11d0: 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f  Once all the coo
11e0: 6b 69 65 73 20 68 61 76 65 20 62 65 65 6e 20 76  kies have been v
11f0: 65 72 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e  erified and tran
1200: 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c  sactions opened,
1210: 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69   .      ** obtai
1220: 6e 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  n the required t
1230: 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73  able-locks. This
1240: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
1250: 73 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ss the .      **
1260: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65   shared-cache fe
1270: 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64  ature is enabled
1280: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1290: 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28   codeTableLocks(
12a0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
12b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
12c0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
12d0: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
12e0: 6f 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  o);.    }..#ifnd
12f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
1300: 52 41 43 45 0a 20 20 20 20 2f 2a 20 41 64 64 20  RACE.    /* Add 
1310: 61 20 4e 6f 2d 6f 70 20 74 68 61 74 20 63 6f 6e  a No-op that con
1320: 74 61 69 6e 73 20 74 68 65 20 63 6f 6d 70 6c 65  tains the comple
1330: 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  te text of the c
1340: 6f 6d 70 69 6c 65 64 20 53 51 4c 0a 20 20 20 20  ompiled SQL.    
1350: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20  ** statement as 
1360: 69 74 73 20 50 33 20 61 72 67 75 6d 65 6e 74 2e  its P3 argument.
1370: 20 20 54 68 69 73 20 64 6f 65 73 20 6e 6f 74 20    This does not 
1380: 63 68 61 6e 67 65 20 74 68 65 20 66 75 6e 63 74  change the funct
1390: 69 6f 6e 61 6c 69 74 79 0a 20 20 20 20 2a 2a 20  ionality.    ** 
13a0: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20  of the program. 
13b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
13c0: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 69  his is used to i
13d0: 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33  mplement sqlite3
13e0: 5f 74 72 61 63 65 28 29 2e 0a 20 20 20 20 2a 2f  _trace()..    */
13f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1400: 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20  Op3(v, OP_Noop, 
1410: 30 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 7a 53  0, 0, pParse->zS
1420: 71 6c 2c 20 70 50 61 72 73 65 2d 3e 7a 54 61 69  ql, pParse->zTai
1430: 6c 2d 70 50 61 72 73 65 2d 3e 7a 53 71 6c 29 3b  l-pParse->zSql);
1440: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1450: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a  E_OMIT_TRACE */.
1460: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74    }...  /* Get t
1470: 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  he VDBE program 
1480: 72 65 61 64 79 20 66 6f 72 20 65 78 65 63 75 74  ready for execut
1490: 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76  ion.  */.  if( v
14a0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
14b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20  ==0 ){.    FILE 
14c0: 2a 74 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c  *trace = (db->fl
14d0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
14e0: 65 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64  eTrace)!=0 ? std
14f0: 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c  out : 0;.    sql
1500: 69 74 65 33 56 64 62 65 54 72 61 63 65 28 76 2c  ite3VdbeTrace(v,
1510: 20 74 72 61 63 65 29 3b 0a 20 20 20 20 73 71 6c   trace);.    sql
1520: 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64  ite3VdbeMakeRead
1530: 79 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61  y(v, pParse->nVa
1540: 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b  r, pParse->nMem+
1550: 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3,.             
1560: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
1570: 73 65 2d 3e 6e 54 61 62 2b 33 2c 20 70 50 61 72  se->nTab+3, pPar
1580: 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a 20 20  se->explain);.  
1590: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
15a0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
15b0: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
15c0: 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Set = 0;.  }else
15d0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d   if( pParse->rc=
15e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15f0: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
1600: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
1610: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20  .  pParse->nTab 
1620: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
1630: 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Mem = 0;.  pPars
1640: 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70  e->nSet = 0;.  p
1650: 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b  Parse->nVar = 0;
1660: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  .  pParse->cooki
1670: 65 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61  eMask = 0;.  pPa
1680: 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20  rse->cookieGoto 
1690: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75  = 0;.}../*.** Ru
16a0: 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 6e 64  n the parser and
16b0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
16c0: 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20 6f  recursively in o
16d0: 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65  rder to generate
16e0: 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68 65  .** code for the
16f0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 67   SQL statement g
1700: 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e  iven onto the en
1710: 64 20 6f 66 20 74 68 65 20 70 50 61 72 73 65 20  d of the pParse 
1720: 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72 65  context.** curre
1730: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
1740: 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74  ruction.  When t
1750: 68 65 20 70 61 72 73 65 72 20 69 73 20 72 75 6e  he parser is run
1760: 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20   recursively.** 
1770: 74 68 69 73 20 77 61 79 2c 20 74 68 65 20 66 69  this way, the fi
1780: 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e  nal OP_Halt is n
1790: 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20  ot appended and 
17a0: 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a 61  other initializa
17b0: 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61  tion.** and fina
17c0: 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 61  lization steps a
17d0: 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61 75  re omitted becau
17e0: 73 65 20 74 68 6f 73 65 20 61 72 65 20 68 61 6e  se those are han
17f0: 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20  dling by the.** 
1800: 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65 72  outermost parser
1810: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72  ..**.** Not ever
1820: 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61 62  ything is nestab
1830: 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c 69  le.  This facili
1840: 74 79 20 69 73 20 64 65 73 69 67 6e 65 64 20 74  ty is designed t
1850: 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45  o permit.** INSE
1860: 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20  RT, UPDATE, and 
1870: 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
1880: 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54 45  s against SQLITE
1890: 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a  _MASTER.  Use.**
18a0: 20 63 61 72 65 20 69 66 20 79 6f 75 20 64 65 63   care if you dec
18b0: 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75 73  ide to try to us
18c0: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  e this routine f
18d0: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
18e0: 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  rposes..*/.void 
18f0: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
1900: 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
1910: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
1920: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
1930: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61  a_list ap;.  cha
1940: 72 20 2a 7a 53 71 6c 3b 0a 23 20 64 65 66 69 6e  r *zSql;.# defin
1950: 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69 7a 65  e SAVE_SZ  (size
1960: 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66 66 73  of(Parse) - offs
1970: 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61 72 29  etof(Parse,nVar)
1980: 29 0a 20 20 63 68 61 72 20 73 61 76 65 42 75 66  ).  char saveBuf
1990: 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66  [SAVE_SZ];..  if
19a0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
19b0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
19c0: 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  t( pParse->neste
19d0: 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74  d<10 );  /* Nest
19e0: 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ing should only 
19f0: 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20 64 65  be of limited de
1a00: 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72  pth */.  va_star
1a10: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
1a20: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
1a30: 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74  VMPrintf(zFormat
1a40: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
1a50: 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  ap);.  if( zSql=
1a60: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1a70: 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20  ;   /* A malloc 
1a80: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
1a90: 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73 65   */.  }.  pParse
1aa0: 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65  ->nested++;.  me
1ab0: 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20 26 70  mcpy(saveBuf, &p
1ac0: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56  Parse->nVar, SAV
1ad0: 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28  E_SZ);.  memset(
1ae0: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30  &pParse->nVar, 0
1af0: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71  , SAVE_SZ);.  sq
1b00: 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28 70  lite3RunParser(p
1b10: 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 30 29 3b  Parse, zSql, 0);
1b20: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 53  .  sqliteFree(zS
1b30: 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70  ql);.  memcpy(&p
1b40: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73 61 76  Parse->nVar, sav
1b50: 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  eBuf, SAVE_SZ);.
1b60: 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64    pParse->nested
1b70: 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  --;.}../*.** Loc
1b80: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
1b90: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
1ba0: 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72   describes a par
1bb0: 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
1bc0: 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20  .** table given 
1bd0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
1be0: 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69   table and (opti
1bf0: 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65  onally) the name
1c00: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
1c10: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
1c20: 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
1c30: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
1c40: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44  und..**.** If zD
1c50: 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c  atabase is 0, al
1c60: 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  l databases are 
1c70: 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65  searched for the
1c80: 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a   table and the.*
1c90: 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  * first matching
1ca0: 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72 6e   table is return
1cb0: 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e  ed.  (No checkin
1cc0: 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  g for duplicate 
1cd0: 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69  table.** names i
1ce0: 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65  s done.)  The se
1cf0: 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54 45  arch order is TE
1d00: 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d  MP first, then M
1d10: 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a  AIN, then any.**
1d20: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
1d30: 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e 67  ases added using
1d40: 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d   the ATTACH comm
1d50: 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  and..**.** See a
1d60: 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  lso sqlite3Locat
1d70: 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62  eTable()..*/.Tab
1d80: 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 54  le *sqlite3FindT
1d90: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
1da0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
1db0: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
1dc0: 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20 54  *zDatabase){.  T
1dd0: 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69  able *p = 0;.  i
1de0: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
1df0: 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 61 73  zName!=0 );.  as
1e00: 73 65 72 74 28 20 28 64 62 2d 3e 66 6c 61 67 73  sert( (db->flags
1e10: 20 26 20 53 51 4c 49 54 45 5f 49 6e 69 74 69 61   & SQLITE_Initia
1e20: 6c 69 7a 65 64 29 20 7c 7c 20 64 62 2d 3e 69 6e  lized) || db->in
1e30: 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 66 6f 72  it.busy );.  for
1e40: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
1e50: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
1e60: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
1e70: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20  2) ? i^1 : i;   
1e80: 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62  /* Search TEMP b
1e90: 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20  efore MAIN */.  
1ea0: 20 20 69 66 28 20 7a 44 61 74 61 62 61 73 65 21    if( zDatabase!
1eb0: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
1ec0: 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20  ICmp(zDatabase, 
1ed0: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65  db->aDb[j].zName
1ee0: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
1ef0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
1f00: 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a  hFind(&db->aDb[j
1f10: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
1f20: 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  sh, zName, strle
1f30: 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20  n(zName)+1);.   
1f40: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
1f50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
1f60: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
1f70: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
1f80: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
1f90: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
1fa0: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
1fb0: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
1fc0: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
1fd0: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
1fe0: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
1ff0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2000: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
2010: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
2020: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
2030: 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a    Also leave an.
2040: 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ** error message
2050: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
2060: 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  Msg..**.** The d
2070: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
2080: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
2090: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  nd sqlite3FindTa
20a0: 62 6c 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ble() is that th
20b0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65  is.** routine le
20c0: 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  aves an error me
20d0: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
20e0: 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a 2a  >zErrMsg where.*
20f0: 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  * sqlite3FindTab
2100: 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  le() does not..*
2110: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
2120: 4c 6f 63 61 74 65 54 61 62 6c 65 28 50 61 72 73  LocateTable(Pars
2130: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
2140: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
2150: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65  nst char *zDbase
2160: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a  ){.  Table *p;..
2170: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
2180: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
2190: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
21a0: 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
21b0: 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
21c0: 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
21d0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
21e0: 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  L. */.  if( SQLI
21f0: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
2200: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
2210: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
2220: 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  ;.  }..  p = sql
2230: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50  ite3FindTable(pP
2240: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  arse->db, zName,
2250: 20 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20   zDbase);.  if( 
2260: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  p==0 ){.    if( 
2270: 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  zDbase ){.      
2280: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2290: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
22a0: 20 74 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20   table: %s.%s", 
22b0: 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a  zDbase, zName);.
22c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
22e0: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
22f0: 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 4e  h table: %s", zN
2300: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
2310: 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
2320: 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  ema = 1;.  }.  r
2330: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
2340: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
2350: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
2360: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
2370: 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72  .** a particular
2380: 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65   index given the
2390: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e   name of that in
23a0: 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e  dex.** and the n
23b0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
23c0: 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ase that contain
23d0: 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20  s the index..** 
23e0: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
23f0: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  ot found..**.** 
2400: 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20  If zDatabase is 
2410: 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  0, all databases
2420: 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f   are searched fo
2430: 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61  r the.** table a
2440: 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  nd the first mat
2450: 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72  ching index is r
2460: 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68  eturned.  (No ch
2470: 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75  ecking.** for du
2480: 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61  plicate index na
2490: 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54  mes is done.)  T
24a0: 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20  he search order 
24b0: 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74  is.** TEMP first
24c0: 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65  , then MAIN, the
24d0: 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20  n any auxiliary 
24e0: 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64 0a  databases added.
24f0: 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54 54  ** using the ATT
2500: 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  ACH command..*/.
2510: 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69  Index *sqlite3Fi
2520: 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  ndIndex(sqlite3 
2530: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
2540: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
2550: 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65  ar *zDb){.  Inde
2560: 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  x *p = 0;.  int 
2570: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 28 64 62  i;.  assert( (db
2580: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
2590: 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 20 7c 7c  _Initialized) ||
25a0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
25b0: 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54  ;.  for(i=OMIT_T
25c0: 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62  EMPDB; i<db->nDb
25d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
25e0: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
25f0: 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20  : i;  /* Search 
2600: 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e  TEMP before MAIN
2610: 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a   */.    Schema *
2620: 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
2630: 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  b[j].pSchema;.  
2640: 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c    if( zDb && sql
2650: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
2660: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d   db->aDb[j].zNam
2670: 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
2680: 20 20 20 61 73 73 65 72 74 28 20 70 53 63 68 65     assert( pSche
2690: 6d 61 20 7c 7c 20 28 6a 3d 3d 31 20 26 26 20 21  ma || (j==1 && !
26a0: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20  db->aDb[1].pBt) 
26b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 63 68 65  );.    if( pSche
26c0: 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  ma ){.      p = 
26d0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
26e0: 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  &pSchema->idxHas
26f0: 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  h, zName, strlen
2700: 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20  (zName)+1);.    
2710: 7d 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72  }.    if( p ) br
2720: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
2730: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
2740: 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79  claim the memory
2750: 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65   used by an inde
2760: 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  x.*/.static void
2770: 20 66 72 65 65 49 6e 64 65 78 28 49 6e 64 65 78   freeIndex(Index
2780: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 46 72   *p){.  sqliteFr
2790: 65 65 28 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  ee(p->zColAff);.
27a0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
27b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
27c0: 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78   the given index
27d0: 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
27e0: 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20  hash table, and 
27f0: 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f  free.** its memo
2800: 72 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  ry structures..*
2810: 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69  *.** The index i
2820: 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
2830: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 68  he database hash
2840: 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69   tables but.** i
2850: 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65  t is not unlinke
2860: 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65  d from the Table
2870: 20 74 68 61 74 20 69 74 20 69 6e 64 65 78 65 73   that it indexes
2880: 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66  ..** Unlinking f
2890: 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75  rom the Table mu
28a0: 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68  st be done by th
28b0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
28c0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
28d0: 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49  id sqliteDeleteI
28e0: 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62  ndex(sqlite3 *db
28f0: 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49  , Index *p){.  I
2900: 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 20 20 63 6f  ndex *pOld;.  co
2910: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
2920: 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 70  = p->zName;..  p
2930: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
2940: 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68  hInsert(&p->pSch
2950: 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e  ema->idxHash, zN
2960: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 20 7a 4e 61  ame, strlen( zNa
2970: 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73  me)+1, 0);.  ass
2980: 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20  ert( pOld==0 || 
2990: 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 72 65  pOld==p );.  fre
29a0: 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a  eIndex(p);.}../*
29b0: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65  .** For the inde
29c0: 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d  x called zIdxNam
29d0: 65 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64  e which is found
29e0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
29f0: 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20   iDb,.** unlike 
2a00: 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20  that index from 
2a10: 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72  its Table then r
2a20: 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
2a30: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65  from.** the inde
2a40: 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  x hash table and
2a50: 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   free all memory
2a60: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
2a70: 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
2a80: 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69  he index..*/.voi
2a90: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
2aa0: 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  ndDeleteIndex(sq
2ab0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
2ac0: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
2ad0: 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64  zIdxName){.  Ind
2ae0: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ex *pIndex;.  in
2af0: 74 20 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a 70  t len;.  Hash *p
2b00: 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b  Hash = &db->aDb[
2b10: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64  iDb].pSchema->id
2b20: 78 48 61 73 68 3b 0a 0a 20 20 6c 65 6e 20 3d 20  xHash;..  len = 
2b30: 73 74 72 6c 65 6e 28 7a 49 64 78 4e 61 6d 65 29  strlen(zIdxName)
2b40: 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  ;.  pIndex = sql
2b50: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70  ite3HashInsert(p
2b60: 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20  Hash, zIdxName, 
2b70: 6c 65 6e 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28  len+1, 0);.  if(
2b80: 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 69   pIndex ){.    i
2b90: 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  f( pIndex->pTabl
2ba0: 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65  e->pIndex==pInde
2bb0: 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  x ){.      pInde
2bc0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
2bd0: 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  x = pIndex->pNex
2be0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
2bf0: 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
2c00: 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78      for(p=pIndex
2c10: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
2c20: 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21  ; p && p->pNext!
2c30: 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e  =pIndex; p=p->pN
2c40: 65 78 74 29 7b 7d 0a 20 20 20 20 20 20 69 66 28  ext){}.      if(
2c50: 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d   p && p->pNext==
2c60: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
2c70: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e    p->pNext = pIn
2c80: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
2c90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72    }.    }.    fr
2ca0: 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  eeIndex(pIndex);
2cb0: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
2cc0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
2cd0: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
2ce0: 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68  ** Erase all sch
2cf0: 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ema information 
2d00: 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  from the in-memo
2d10: 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f  ry hash tables o
2d20: 66 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 64 61  f.** a single da
2d30: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
2d40: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2d50: 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72  to reclaim memor
2d60: 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20  y.** before the 
2d70: 64 61 74 61 62 61 73 65 20 63 6c 6f 73 65 73 2e  database closes.
2d80: 20 20 49 74 20 69 73 20 61 6c 73 6f 20 63 61 6c    It is also cal
2d90: 6c 65 64 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  led during a rol
2da0: 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72  lback.** if ther
2db0: 65 20 77 65 72 65 20 73 63 68 65 6d 61 20 63 68  e were schema ch
2dc0: 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65  anges during the
2dd0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
2de0: 69 66 20 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63  if a.** schema-c
2df0: 6f 6f 6b 69 65 20 6d 69 73 6d 61 74 63 68 20 6f  ookie mismatch o
2e00: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ccurs..**.** If 
2e10: 69 44 62 3c 3d 30 20 74 68 65 6e 20 72 65 73 65  iDb<=0 then rese
2e20: 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  t the internal s
2e30: 63 68 65 6d 61 20 74 61 62 6c 65 73 20 66 6f 72  chema tables for
2e40: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a   all database.**
2e50: 20 66 69 6c 65 73 2e 20 20 49 66 20 69 44 62 3e   files.  If iDb>
2e60: 3d 32 20 74 68 65 6e 20 72 65 73 65 74 20 74 68  =2 then reset th
2e70: 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  e internal schem
2e80: 61 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a  a for only the.*
2e90: 2a 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e  * single file in
2ea0: 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  dicated..*/.void
2eb0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
2ec0: 65 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69  ernalSchema(sqli
2ed0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
2ee0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a  ){.  int i, j;..
2ef0: 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
2f00: 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
2f10: 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  );.  db->flags &
2f20: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 69 74 69 61  = ~SQLITE_Initia
2f30: 6c 69 7a 65 64 3b 0a 20 20 66 6f 72 28 69 3d 69  lized;.  for(i=i
2f40: 44 62 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  Db; i<db->nDb; i
2f50: 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62  ++){.    Db *pDb
2f60: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
2f70: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63      if( pDb->pSc
2f80: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71  hema ){.      sq
2f90: 6c 69 74 65 33 53 63 68 65 6d 61 46 72 65 65 28  lite3SchemaFree(
2fa0: 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pDb->pSchema);. 
2fb0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44 62     }.    if( iDb
2fc0: 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d  >0 ) return;.  }
2fd0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d  .  assert( iDb==
2fe0: 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  0 );.  db->flags
2ff0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
3000: 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a  rnChanges;..  /*
3010: 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   If one or more 
3020: 6f 66 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  of the auxiliary
3030: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
3040: 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c  has been closed,
3050: 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76  .  ** then remov
3060: 65 20 74 68 65 6e 20 66 72 6f 6d 20 74 68 65 20  e then from the 
3070: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
3080: 73 65 20 6c 69 73 74 2e 20 20 57 65 20 74 61 6b  se list.  We tak
3090: 65 20 74 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72  e the.  ** oppor
30a0: 74 75 6e 69 74 79 20 74 6f 20 64 6f 20 74 68 69  tunity to do thi
30b0: 73 20 68 65 72 65 20 73 69 6e 63 65 20 77 65 20  s here since we 
30c0: 68 61 76 65 20 6a 75 73 74 20 64 65 6c 65 74 65  have just delete
30d0: 64 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a  d all of the.  *
30e0: 2a 20 73 63 68 65 6d 61 20 68 61 73 68 20 74 61  * schema hash ta
30f0: 62 6c 65 73 20 61 6e 64 20 74 68 65 72 65 66 6f  bles and therefo
3100: 72 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  re do not have t
3110: 6f 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67  o make any chang
3120: 65 73 0a 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f  es.  ** to any o
3130: 66 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a  f those tables..
3140: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
3150: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
3160: 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a  .    struct Db *
3170: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
3180: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
3190: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
31a0: 69 66 28 20 70 44 62 2d 3e 70 41 75 78 20 26 26  if( pDb->pAux &&
31b0: 20 70 44 62 2d 3e 78 46 72 65 65 41 75 78 20 29   pDb->xFreeAux )
31c0: 20 70 44 62 2d 3e 78 46 72 65 65 41 75 78 28 70   pDb->xFreeAux(p
31d0: 44 62 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  Db->pAux);.     
31e0: 20 70 44 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a   pDb->pAux = 0;.
31f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
3200: 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62  i=j=2; i<db->nDb
3210: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
3220: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
3230: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
3240: 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b  ( pDb->pBt==0 ){
3250: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
3260: 65 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  e(pDb->zName);. 
3270: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20       pDb->zName 
3280: 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 0;.      conti
3290: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
32a0: 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20  f( j<i ){.      
32b0: 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d  db->aDb[j] = db-
32c0: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  >aDb[i];.    }. 
32d0: 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65     j++;.  }.  me
32e0: 6d 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d  mset(&db->aDb[j]
32f0: 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29  , 0, (db->nDb-j)
3300: 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b  *sizeof(db->aDb[
3310: 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20  j]));.  db->nDb 
3320: 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e  = j;.  if( db->n
3330: 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62  Db<=2 && db->aDb
3340: 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20  !=db->aDbStatic 
3350: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62  ){.    memcpy(db
3360: 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d  ->aDbStatic, db-
3370: 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64  >aDb, 2*sizeof(d
3380: 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20  b->aDb[0]));.   
3390: 20 73 71 6c 69 74 65 46 72 65 65 28 64 62 2d 3e   sqliteFree(db->
33a0: 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44  aDb);.    db->aD
33b0: 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69  b = db->aDbStati
33c0: 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
33d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
33e0: 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20  called whenever 
33f0: 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
3400: 73 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72  s.  If there wer
3410: 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 68 61 6e  e.** schema chan
3420: 67 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74  ges during the t
3430: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
3440: 20 77 65 20 68 61 76 65 20 74 6f 20 72 65 73 65   we have to rese
3450: 74 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61  t the.** interna
3460: 6c 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  l hash tables an
3470: 64 20 72 65 6c 6f 61 64 20 74 68 65 6d 20 66 72  d reload them fr
3480: 6f 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64  om disk..*/.void
3490: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
34a0: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
34b0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
34c0: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
34d0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
34e0: 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  nges ){.    sqli
34f0: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
3500: 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20  Schema(db, 0);. 
3510: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
3520: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
3530: 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74  ed when a commit
3540: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
3550: 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
3560: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
3570: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62  lite3 *db){.  db
3580: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
3590: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
35a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
35b0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
35c0: 73 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 6f  s from a table o
35d0: 72 20 76 69 65 77 2e 0a 2a 2f 0a 73 74 61 74 69  r view..*/.stati
35e0: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 52 65 73  c void sqliteRes
35f0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61  etColumnNames(Ta
3600: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
3610: 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20  int i;.  Column 
3620: 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28  *pCol;.  assert(
3630: 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20   pTable!=0 );.  
3640: 69 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62  if( (pCol = pTab
3650: 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a  le->aCol)!=0 ){.
3660: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
3670: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
3680: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
3690: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c   sqliteFree(pCol
36a0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
36b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
36c0: 65 28 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  e(pCol->pDflt);.
36d0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
36e0: 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20  (pCol->zType);. 
36f0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46     }.    sqliteF
3700: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
3710: 29 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d  );.  }.  pTable-
3720: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  >aCol = 0;.  pTa
3730: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d  ble->nCol = 0;.}
3740: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
3750: 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73  he memory data s
3760: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
3770: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
3780: 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e  ven.** Table.  N
3790: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
37a0: 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68  de to disk by th
37b0: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
37c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a  * This routine j
37d0: 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20  ust deletes the 
37e0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20  data structure. 
37f0: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c   It does not unl
3800: 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ink.** the table
3810: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
3820: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
3830: 62 6c 65 2e 20 20 4e 6f 72 20 64 6f 65 73 20 69  ble.  Nor does i
3840: 74 20 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65  t remove.** fore
3850: 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d 20 74 68  ign keys from th
3860: 65 20 73 71 6c 69 74 65 2e 61 46 4b 65 79 20 68  e sqlite.aFKey h
3870: 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20  ash table.  But 
3880: 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a  it does destroy.
3890: 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ** memory struct
38a0: 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69  ures of the indi
38b0: 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20  ces and foreign 
38c0: 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  keys associated 
38d0: 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62  with .** the tab
38e0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65  le..**.** Indice
38f0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
3900: 68 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  h the table are 
3910: 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68  unlinked from th
3920: 65 20 22 64 62 22 0a 2a 2a 20 64 61 74 61 20 73  e "db".** data s
3930: 74 72 75 63 74 75 72 65 20 69 66 20 64 62 21 3d  tructure if db!=
3940: 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d 3d 4e 55  NULL.  If db==NU
3950: 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61 74 74 61  LL, indices atta
3960: 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74  ched to.** the t
3970: 61 62 6c 65 20 61 72 65 20 64 65 6c 65 74 65 64  able are deleted
3980: 2c 20 62 75 74 20 69 74 20 69 73 20 61 73 73 75  , but it is assu
3990: 6d 65 64 20 74 68 65 79 20 68 61 76 65 20 61 6c  med they have al
39a0: 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 75 6e  ready been.** un
39b0: 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  linked..*/.void 
39c0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
39d0: 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  le(sqlite3 *db, 
39e0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
39f0: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
3a00: 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20   *pNext;.  FKey 
3a10: 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b  *pFKey, *pNextFK
3a20: 65 79 3b 0a 0a 20 20 64 62 20 3d 20 30 3b 0a 0a  ey;..  db = 0;..
3a30: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
3a40: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
3a50: 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
3a60: 65 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68  e table until th
3a70: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
3a80: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20  t reaches zero. 
3a90: 2a 2f 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65  */.  pTable->nRe
3aa0: 66 2d 2d 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  f--;.  if( pTabl
3ab0: 65 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20  e->nRef>0 ){.   
3ac0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
3ad0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e  ssert( pTable->n
3ae0: 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
3af0: 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63  Delete all indic
3b00: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
3b10: 74 68 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20  th this table.  
3b20: 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20  */.  for(pIndex 
3b30: 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  = pTable->pIndex
3b40: 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
3b50: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
3b60: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
3b70: 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  xt;.    assert( 
3b80: 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d  pIndex->pSchema=
3b90: 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61  =pTable->pSchema
3ba0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65   );.    sqliteDe
3bb0: 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49  leteIndex(db, pI
3bc0: 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  ndex);.  }..#ifn
3bd0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3be0: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 2f 2a  FOREIGN_KEY.  /*
3bf0: 20 44 65 6c 65 74 65 20 61 6c 6c 20 66 6f 72 65   Delete all fore
3c00: 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61  ign keys associa
3c10: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61  ted with this ta
3c20: 62 6c 65 2e 20 20 54 68 65 20 6b 65 79 73 0a 20  ble.  The keys. 
3c30: 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20   ** should have 
3c40: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 75 6e 6c  already been unl
3c50: 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 64  inked from the d
3c60: 62 2d 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61  b->aFKey hash ta
3c70: 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ble .  */.  for(
3c80: 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46  pFKey=pTable->pF
3c90: 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65  Key; pFKey; pFKe
3ca0: 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20  y=pNextFKey){.  
3cb0: 20 20 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46    pNextFKey = pF
3cc0: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a  Key->pNextFrom;.
3cd0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
3ce0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 54 61  te3HashFind(&pTa
3cf0: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46  ble->pSchema->aF
3d00: 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Key,.           
3d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d20: 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c  pFKey->zTo, strl
3d30: 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31  en(pFKey->zTo)+1
3d40: 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20 20  )!=pFKey );.    
3d50: 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79  sqliteFree(pFKey
3d60: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
3d70: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54   /* Delete the T
3d80: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  able structure i
3d90: 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71  tself..  */.  sq
3da0: 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e  liteResetColumnN
3db0: 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20 20  ames(pTable);.  
3dc0: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
3dd0: 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  e->zName);.  sql
3de0: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
3df0: 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69  zColAff);.  sqli
3e00: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
3e10: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29  pTable->pSelect)
3e20: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
3e30: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73 71  _OMIT_CHECK.  sq
3e40: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3e50: 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b  pTable->pCheck);
3e60: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
3e70: 46 72 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d 0a  Free(pTable);.}.
3e80: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68  ./*.** Unlink th
3e90: 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72  e given table fr
3ea0: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
3eb0: 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74  es and the delet
3ec0: 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73  e the.** table s
3ed0: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c  tructure with al
3ee0: 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e  l its indices an
3ef0: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a  d foreign keys..
3f00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55  */.void sqlite3U
3f10: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61  nlinkAndDeleteTa
3f20: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
3f30: 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20   int iDb, const 
3f40: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b  char *zTabName){
3f50: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 46  .  Table *p;.  F
3f60: 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46 32 3b 0a  Key *pF1, *pF2;.
3f70: 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73    Db *pDb;..  as
3f80: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
3f90: 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
3fa0: 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
3fb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61 62  ;.  assert( zTab
3fc0: 4e 61 6d 65 20 26 26 20 7a 54 61 62 4e 61 6d 65  Name && zTabName
3fd0: 5b 30 5d 20 29 3b 0a 20 20 70 44 62 20 3d 20 26  [0] );.  pDb = &
3fe0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
3ff0: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
4000: 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68  nsert(&pDb->pSch
4010: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54  ema->tblHash, zT
4020: 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a  abName, strlen(z
4030: 54 61 62 4e 61 6d 65 29 2b 31 2c 30 29 3b 0a 20  TabName)+1,0);. 
4040: 20 69 66 28 20 70 20 29 7b 0a 23 69 66 6e 64 65   if( p ){.#ifnde
4050: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
4060: 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 66 6f  REIGN_KEY.    fo
4070: 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20  r(pF1=p->pFKey; 
4080: 70 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e  pF1; pF1=pF1->pN
4090: 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20  extFrom){.      
40a0: 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e  int nTo = strlen
40b0: 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a  (pF1->zTo) + 1;.
40c0: 20 20 20 20 20 20 70 46 32 20 3d 20 73 71 6c 69        pF2 = sqli
40d0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 44 62  te3HashFind(&pDb
40e0: 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79  ->pSchema->aFKey
40f0: 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 29  , pF1->zTo, nTo)
4100: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 32 3d  ;.      if( pF2=
4110: 3d 70 46 31 20 29 7b 0a 20 20 20 20 20 20 20 20  =pF1 ){.        
4120: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
4130: 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t(&pDb->pSchema-
4140: 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f  >aFKey, pF1->zTo
4150: 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78  , nTo, pF1->pNex
4160: 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  tTo);.      }els
4170: 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  e{.        while
4180: 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70 4e  ( pF2 && pF2->pN
4190: 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70 46  extTo!=pF1 ){ pF
41a0: 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b 20  2=pF2->pNextTo; 
41b0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46  }.        if( pF
41c0: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  2 ){.          p
41d0: 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 46  F2->pNextTo = pF
41e0: 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20  1->pNextTo;.    
41f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
4200: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 73    }.#endif.    s
4210: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
4220: 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 20 20  e(db, p);.  }.  
4230: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
4240: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
4250: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  s;.}../*.** Give
4260: 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72  n a token, retur
4270: 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  n a string that 
4280: 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20  consists of the 
4290: 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20  text of that.** 
42a0: 74 6f 6b 65 6e 20 77 69 74 68 20 61 6e 79 20 71  token with any q
42b0: 75 6f 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76 65  uotations remove
42c0: 64 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  d.  Space to hol
42d0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
42e0: 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61  tring.** is obta
42f0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
4300: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
4310: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
4320: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
4330: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b  ction..**.** Tok
4340: 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75  ens are often ju
4350: 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f  st pointers into
4360: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
4370: 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a  L text and so.**
4380: 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65   are not \000 te
4390: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65  rminated and are
43a0: 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e   not persistent.
43b0: 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73    The returned s
43c0: 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30  tring.** is \000
43d0: 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20   terminated and 
43e0: 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a  is persistent..*
43f0: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e  /.char *sqlite3N
4400: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b  ameFromToken(Tok
4410: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68  en *pName){.  ch
4420: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28  ar *zName;.  if(
4430: 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
4440: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  ame = sqliteStrN
4450: 44 75 70 28 28 63 68 61 72 2a 29 70 4e 61 6d 65  Dup((char*)pName
4460: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
4470: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
4480: 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c  te(zName);.  }el
4490: 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  se{.    zName = 
44a0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
44b0: 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zName;.}../*.** 
44c0: 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  Open the sqlite_
44d0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f  master table sto
44e0: 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65 20  red in database 
44f0: 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a  number iDb for.*
4500: 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74  * writing. The t
4510: 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75  able is opened u
4520: 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a  sing cursor 0..*
4530: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70  /.void sqlite3Op
4540: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50 61  enMasterTable(Pa
4550: 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 29  rse *p, int iDb)
4560: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
4570: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29 3b  lite3GetVdbe(p);
4580: 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c  .  sqlite3TableL
4590: 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 54  ock(p, iDb, MAST
45a0: 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53 43 48 45  ER_ROOT, 1, SCHE
45b0: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a  MA_TABLE(iDb));.
45c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
45d0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
45e0: 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c  , iDb, 0);.  sql
45f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4600: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30   OP_OpenWrite, 0
4610: 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 29 3b 0a  , MASTER_ROOT);.
4620: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4630: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  Op(v, OP_SetNumC
4640: 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35 29 3b 20 2f  olumns, 0, 5); /
4650: 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
4660: 68 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f  has 5 columns */
4670: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f  .}../*.** The to
4680: 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61  ken *pName conta
4690: 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ins the name of 
46a0: 61 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68  a database (eith
46b0: 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20  er "main" or.** 
46c0: 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61  "temp" or the na
46d0: 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65  me of an attache
46e0: 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74  d db). This rout
46f0: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a  ine returns the.
4700: 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ** index of the 
4710: 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69  named database i
4720: 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20  n db->aDb[], or 
4730: 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  -1 if the named 
4740: 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  db .** does not 
4750: 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  exist..*/.int sq
4760: 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69  lite3FindDb(sqli
4770: 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a  te3 *db, Token *
4780: 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20  pName){.  int i 
4790: 3d 20 2d 31 3b 20 20 20 20 2f 2a 20 44 61 74 61  = -1;    /* Data
47a0: 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  base number */. 
47b0: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
47c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
47d0: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 6e  racters in the n
47e0: 61 6d 65 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62  ame */.  Db *pDb
47f0: 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 64 61 74  ;       /* A dat
4800: 61 62 61 73 65 20 77 68 6f 73 65 20 6e 61 6d 65  abase whose name
4810: 20 73 70 61 63 65 20 69 73 20 62 65 69 6e 67 20   space is being 
4820: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 68  searched */.  ch
4830: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
4840: 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72  Name we are sear
4850: 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 0a 20 20  ching for */..  
4860: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
4870: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61  ameFromToken(pNa
4880: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
4890: 20 29 7b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c   ){.    n = strl
48a0: 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66  en(zName);.    f
48b0: 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29  or(i=(db->nDb-1)
48c0: 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69  , pDb=&db->aDb[i
48d0: 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44  ]; i>=0; i--, pD
48e0: 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20  b--){.      if( 
48f0: 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c  (!OMIT_TEMPDB ||
4900: 20 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73 74   i!=1 ) && n==st
4910: 72 6c 65 6e 28 70 44 62 2d 3e 7a 4e 61 6d 65 29  rlen(pDb->zName)
4920: 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 30   && .          0
4930: 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
4940: 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  (pDb->zName, zNa
4950: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  me) ){.        b
4960: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4970: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
4980: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  ee(zName);.  }. 
4990: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a   return i;.}../*
49a0: 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   The table or vi
49b0: 65 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61  ew or trigger na
49c0: 6d 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  me is passed to 
49d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61  this routine via
49e0: 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65   tokens.** pName
49f0: 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66  1 and pName2. If
4a00: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
4a10: 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  was fully qualif
4a20: 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ied, for example
4a30: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
4a40: 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e  ABLE xxx.yyy (..
4a50: 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20  .);.** .** Then 
4a60: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
4a70: 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65   "xxx" and pName
4a80: 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20  2 "yyy". On the 
4a90: 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a  other hand if.**
4aa0: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
4ab0: 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61  is not fully qua
4ac0: 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a  lified, i.e.:.**
4ad0: 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45  .** CREATE TABLE
4ae0: 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a   yyy(...);.**.**
4af0: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
4b00: 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64  set to "yyy" and
4b10: 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a   pName2 is ""..*
4b20: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4b30: 65 20 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e  e sets the *ppUn
4b40: 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20  qual pointer to 
4b50: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b  point at the tok
4b60: 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a  en (pName1 or.**
4b70: 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74   pName2) that st
4b80: 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69  ores the unquali
4b90: 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e  fied table name.
4ba0: 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74    The index of t
4bb0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22  he.** database "
4bc0: 78 78 78 22 20 69 73 20 72 65 74 75 72 6e 65 64  xxx" is returned
4bd0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4be0: 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50  TwoPartName(.  P
4bf0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4c00: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
4c10: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
4c20: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
4c30: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
4c40: 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20     /* The "xxx" 
4c50: 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78  in the name "xxx
4c60: 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a  .yyy" or "xxx" *
4c70: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
4c80: 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  2,      /* The "
4c90: 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  yyy" in the name
4ca0: 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20   "xxx.yyy" */.  
4cb0: 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20  Token **pUnqual 
4cc0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
4cd0: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a   unqualified obj
4ce0: 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f  ect name here */
4cf0: 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  .){.  int iDb;  
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d10: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
4d20: 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74  lding the object
4d30: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
4d40: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4d50: 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26  .  if( pName2 &&
4d60: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a   pName2->n>0 ){.
4d70: 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
4d80: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
4d90: 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61    *pUnqual = pNa
4da0: 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  me2;.    iDb = s
4db0: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c  qlite3FindDb(db,
4dc0: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66   pName1);.    if
4dd0: 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20  ( iDb<0 ){.     
4de0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
4df0: 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
4e00: 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20  n database %T", 
4e10: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70  pName1);.      p
4e20: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
4e30: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
4e40: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
4e50: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69     assert( db->i
4e60: 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62  nit.iDb==0 || db
4e70: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
4e80: 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69     iDb = db->ini
4e90: 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71  t.iDb;.    *pUnq
4ea0: 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20  ual = pName1;.  
4eb0: 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a  }.  return iDb;.
4ec0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
4ed0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
4ee0: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54   check if the UT
4ef0: 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  F-8 string zName
4f00: 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75   is a legal.** u
4f10: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
4f20: 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61  for a new schema
4f30: 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20   object (table, 
4f40: 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a  index, view or.*
4f50: 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20  * trigger). All 
4f60: 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20  names are legal 
4f70: 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61  except those tha
4f80: 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  t begin with the
4f90: 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69   string.** "sqli
4fa0: 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20  te_" (in upper, 
4fb0: 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63  lower or mixed c
4fc0: 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69  ase). This porti
4fd0: 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70  on of the namesp
4fe0: 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76  ace.** is reserv
4ff0: 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ed for internal 
5000: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
5010: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
5020: 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  me(Parse *pParse
5030: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
5040: 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ame){.  if( !pPa
5050: 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  rse->db->init.bu
5060: 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65  sy && pParse->ne
5070: 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20  sted==0 .       
5080: 20 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64     && (pParse->d
5090: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
50a0: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d  E_WriteSchema)==
50b0: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30  0.          && 0
50c0: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
50d0: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
50e0: 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71  _", 7) ){.    sq
50f0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5100: 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61  arse, "object na
5110: 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  me reserved for 
5120: 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73  internal use: %s
5130: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ", zName);.    r
5140: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
5150: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
5160: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
5170: 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74  *.** Begin const
5180: 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ructing a new ta
5190: 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
51a0: 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54  on in memory.  T
51b0: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
51c0: 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61  rst of several a
51d0: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74  ction routines t
51e0: 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69  hat get called i
51f0: 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f  n response.** to
5200: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
5210: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70  statement.  In p
5220: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20  articular, this 
5230: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
5240: 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e  d.** after seein
5250: 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45  g tokens "CREATE
5260: 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e  " and "TABLE" an
5270: 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  d the table name
5280: 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74 61 72 74  .  The.** pStart
5290: 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 43 52   token is the CR
52a0: 45 41 54 45 20 61 6e 64 20 70 4e 61 6d 65 20 69  EATE and pName i
52b0: 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
52c0: 2e 20 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a  .  The isTemp.**
52d0: 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66   flag is true if
52e0: 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c   the table shoul
52f0: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
5300: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
5310: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e  abase.** file in
5320: 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20  stead of in the 
5330: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
5340: 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  le.  This is nor
5350: 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a  mally the case.*
5360: 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50  * when the "TEMP
5370: 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22  " or "TEMPORARY"
5380: 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20   keyword occurs 
5390: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52  in between.** CR
53a0: 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a  EATE and TABLE..
53b0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61  **.** The new ta
53c0: 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e  ble record is in
53d0: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75  itialized and pu
53e0: 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65  t in pParse->pNe
53f0: 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f  wTable..** As mo
5400: 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  re of the CREATE
5410: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
5420: 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69   is parsed, addi
5430: 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a  tional action.**
5440: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62   routines will b
5450: 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20  e called to add 
5460: 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
5470: 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e   to this record.
5480: 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
5490: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
54a0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  LE statement, th
54b0: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
54c0: 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  e() routine.** i
54d0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70  s called to comp
54e0: 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75  lete the constru
54f0: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77  ction of the new
5500: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a   table record..*
5510: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74  /.void sqlite3St
5520: 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73  artTable(.  Pars
5530: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
5540: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
5550: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  /.  Token *pStar
5560: 74 2c 20 20 20 2f 2a 20 54 68 65 20 22 43 52 45  t,   /* The "CRE
5570: 41 54 45 22 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  ATE" token */.  
5580: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
5590: 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
55a0: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
55b0: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
55c0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
55d0: 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  e2,   /* Second 
55e0: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
55f0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
5600: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
5610: 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54  sTemp,      /* T
5620: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
5630: 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20   TEMP table */. 
5640: 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20   int isView,    
5650: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
5660: 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20  s is a VIEW */. 
5670: 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20   int noErr      
5680: 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
5690: 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  if table already
56a0: 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
56b0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
56c0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
56d0: 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66  ; /* The name of
56e0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a   the new table *
56f0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
5700: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
5710: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
5720: 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  Db;         /* D
5730: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 74  atabase number t
5740: 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62  o create the tab
5750: 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  le in */.  Token
5760: 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55   *pName;    /* U
5770: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
5780: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
5790: 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20  create */..  /* 
57a0: 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  The table or vie
57b0: 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61 74 65  w name to create
57c0: 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
57d0: 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74  is routine via t
57e0: 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65  okens.  ** pName
57f0: 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66  1 and pName2. If
5800: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
5810: 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  was fully qualif
5820: 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ied, for example
5830: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41  :.  **.  ** CREA
5840: 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79  TE TABLE xxx.yyy
5850: 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20   (...);.  ** .  
5860: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
5870: 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61  s set to "xxx" a
5880: 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e  nd pName2 "yyy".
5890: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
58a0: 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 74  nd if.  ** the t
58b0: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
58c0: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
58d0: 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a  , i.e.:.  **.  *
58e0: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79  * CREATE TABLE y
58f0: 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20  yy(...);.  **.  
5900: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
5910: 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61  s set to "yyy" a
5920: 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e  nd pName2 is "".
5930: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
5940: 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73 20 74  all below sets t
5950: 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72  he pName pointer
5960: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
5970: 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f   token (pName1 o
5980: 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74  r.  ** pName2) t
5990: 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75  hat stores the u
59a0: 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65  nqualified table
59b0: 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72 69 61   name. The varia
59c0: 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a 2a 20  ble iDb is.  ** 
59d0: 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
59e0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
59f0: 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
5a00: 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20 62 65  or view is to be
5a10: 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e  .  ** created in
5a20: 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73  ..  */.  iDb = s
5a30: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
5a40: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
5a50: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
5a60: 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29  );.  if( iDb<0 )
5a70: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21   return;.  if( !
5a80: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
5a90: 73 54 65 6d 70 20 26 26 20 69 44 62 3e 31 20 29  sTemp && iDb>1 )
5aa0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61  {.    /* If crea
5ab0: 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c  ting a temp tabl
5ac0: 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20  e, the name may 
5ad0: 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65 64  not be qualified
5ae0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
5af0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5b00: 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65  "temporary table
5b10: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e   name must be un
5b20: 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20  qualified");.   
5b30: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
5b40: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
5b50: 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62 20  && isTemp ) iDb 
5b60: 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e  = 1;..  pParse->
5b70: 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e  sNameToken = *pN
5b80: 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  ame;.  zName = s
5b90: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
5ba0: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66  ken(pName);.  if
5bb0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
5bc0: 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  urn;.  if( SQLIT
5bd0: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65  E_OK!=sqlite3Che
5be0: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61  ckObjectName(pPa
5bf0: 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  rse, zName) ){. 
5c00: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
5c10: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
5c20: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44   if( db->init.iD
5c30: 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20  b==1 ) isTemp = 
5c40: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
5c50: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
5c60: 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28  TION.  assert( (
5c70: 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54  isTemp & 1)==isT
5c80: 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69  emp );.  {.    i
5c90: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61  nt code;.    cha
5ca0: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
5cb0: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
5cc0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
5cd0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
5ce0: 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
5cf0: 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70  EMA_TABLE(isTemp
5d00: 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  ), 0, zDb) ){.  
5d10: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
5d20: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
5d30: 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
5d40: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f   ){.      if( !O
5d50: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
5d60: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
5d70: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
5d80: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  EATE_TEMP_VIEW;.
5d90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5da0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
5db0: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a  TE_CREATE_VIEW;.
5dc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
5dd0: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  e{.      if( !OM
5de0: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54  IT_TEMPDB && isT
5df0: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63  emp ){.        c
5e00: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
5e10: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ATE_TEMP_TABLE;.
5e20: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5e30: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
5e40: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b  TE_CREATE_TABLE;
5e50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5e60: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
5e70: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
5e80: 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20  code, zName, 0, 
5e90: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
5ea0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
5eb0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
5ec0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b  #endif..  /* Mak
5ed0: 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74  e sure the new t
5ee0: 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e  able name does n
5ef0: 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20  ot collide with 
5f00: 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a  an existing.  **
5f10: 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
5f20: 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65  name in the same
5f30: 20 64 61 74 61 62 61 73 65 2e 20 20 49 73 73 75   database.  Issu
5f40: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
5f50: 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f  ge if.  ** it do
5f60: 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53  es..  */.  if( S
5f70: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
5f80: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
5f90: 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  se) ){.    goto 
5fa0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
5fb0: 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20  r;.  }.  pTable 
5fc0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
5fd0: 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62  le(db, zName, db
5fe0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
5ff0: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 20  );.  if( pTable 
6000: 29 7b 0a 20 20 20 20 69 66 28 20 21 6e 6f 45 72  ){.    if( !noEr
6010: 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
6020: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6030: 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72  e, "table %T alr
6040: 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e  eady exists", pN
6050: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
6060: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
6070: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  _error;.  }.  if
6080: 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  ( sqlite3FindInd
6090: 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  ex(db, zName, 0)
60a0: 21 3d 30 20 26 26 20 28 69 44 62 3d 3d 30 20 7c  !=0 && (iDb==0 |
60b0: 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  | !db->init.busy
60c0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
60d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
60e0: 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
60f0: 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65  dy an index name
6100: 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  d %s", zName);. 
6110: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
6120: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
6130: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
6140: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54  Malloc( sizeof(T
6150: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
6160: 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
6170: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
6180: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70  ITE_NOMEM;.    p
6190: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
61a0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
61b0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
61c0: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d   pTable->zName =
61d0: 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65   zName;.  pTable
61e0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  ->nCol = 0;.  pT
61f0: 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  able->aCol = 0;.
6200: 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20    pTable->iPKey 
6210: 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  = -1;.  pTable->
6220: 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54  pIndex = 0;.  pT
6230: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20  able->pSchema = 
6240: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
6250: 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  hema;.  pTable->
6260: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 69 66 28 20  nRef = 1;.  if( 
6270: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
6280: 65 20 29 20 73 71 6c 69 74 65 33 44 65 6c 65 74  e ) sqlite3Delet
6290: 65 54 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73  eTable(db, pPars
62a0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20  e->pNewTable);. 
62b0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
62c0: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20  le = pTable;..  
62d0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
62e0: 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73  e magic sqlite_s
62f0: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73  equence table us
6300: 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d  ed by autoincrem
6310: 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  ent,.  ** then r
6320: 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20  ecord a pointer 
6330: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e  to this table in
6340: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
6350: 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
6360: 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54  * so that INSERT
6370: 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61   can find the ta
6380: 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f  ble easily..  */
6390: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
63a0: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
63b0: 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  NT.  if( !pParse
63c0: 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63  ->nested && strc
63d0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
63e0: 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20  e_sequence")==0 
63f0: 29 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70  ){.    pTable->p
6400: 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20  Schema->pSeqTab 
6410: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  = pTable;.  }.#e
6420: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  ndif..  /* Begin
6430: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
6440: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
6450: 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20  nsert the table 
6460: 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a  record into.  **
6470: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
6480: 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20  ER table.  Note 
6490: 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68  in particular th
64a0: 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68  at we must go ah
64b0: 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c  ead.  ** and all
64c0: 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64  ocate the record
64d0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
64e0: 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e  table entry now.
64f0: 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a    Before any.  *
6500: 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  * PRIMARY KEY or
6510: 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73   UNIQUE keywords
6520: 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68   are parsed.  Th
6530: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c  ose keywords wil
6540: 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64  l cause.  ** ind
6550: 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74  ices to be creat
6560: 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  ed and the table
6570: 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d   record must com
6580: 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20  e before the .  
6590: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e  ** indices.  Hen
65a0: 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ce, the record n
65b0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
65c0: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ble must be allo
65d0: 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a  cated.  ** now..
65e0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
65f0: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20  init.busy && (v 
6600: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
6610: 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a  (pParse))!=0 ){.
6620: 20 20 20 20 69 6e 74 20 6c 62 6c 3b 0a 20 20 20      int lbl;.   
6630: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
6640: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
6650: 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 20 20  se, 0, iDb);..  
6660: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
6670: 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f   format and enco
6680: 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61  ding in the data
6690: 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65  base have not be
66a0: 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20  en set, .    ** 
66b0: 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20  set them now..  
66c0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
66d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
66e0: 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  ReadCookie, iDb,
66f0: 20 31 29 3b 20 20 20 2f 2a 20 66 69 6c 65 5f 66   1);   /* file_f
6700: 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20 6c 62 6c  ormat */.    lbl
6710: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
6720: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
6730: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6740: 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 6c 62  (v, OP_If, 0, lb
6750: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
6760: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
6770: 6e 74 65 67 65 72 2c 20 53 51 4c 49 54 45 5f 44  nteger, SQLITE_D
6780: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d  EFAULT_FILE_FORM
6790: 41 54 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  AT, 0);.    sqli
67a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
67b0: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
67c0: 62 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 1);.    sqlit
67d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
67e0: 50 5f 49 6e 74 65 67 65 72 2c 20 45 4e 43 28 64  P_Integer, ENC(d
67f0: 62 29 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  b), 0);.    sqli
6800: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6810: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
6820: 62 2c 20 34 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 4);.    sqlit
6830: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
6840: 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 0a 20 20 20  el(v, lbl);..   
6850: 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72   /* This just cr
6860: 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f  eates a place-ho
6870: 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74  lder record in t
6880: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
6890: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54   table..    ** T
68a0: 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65  he record create
68b0: 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  d does not conta
68c0: 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e  in anything yet.
68d0: 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70    It will be rep
68e0: 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  laced.    ** by 
68f0: 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69  the real entry i
6900: 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  n code generated
6910: 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61   at sqlite3EndTa
6920: 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ble()..    **.  
6930: 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66    ** The rowid f
6940: 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  or the new entry
6950: 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20   is left on the 
6960: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
6970: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  ..    ** The row
6980: 69 64 20 76 61 6c 75 65 20 69 73 20 6e 65 65 64  id value is need
6990: 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 74  ed by the code t
69a0: 68 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61  hat sqlite3EndTa
69b0: 62 6c 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ble will.    ** 
69c0: 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f  generate..    */
69d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
69e0: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 69 66  OMIT_VIEW.    if
69f0: 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20  ( isView ){.    
6a00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6a10: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
6a20: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  , 0, 0);.    }el
6a30: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
6a40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6a50: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65  eAddOp(v, OP_Cre
6a60: 61 74 65 54 61 62 6c 65 2c 20 69 44 62 2c 20 30  ateTable, iDb, 0
6a70: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
6a80: 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61  ite3OpenMasterTa
6a90: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  ble(pParse, iDb)
6aa0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6ab0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
6ac0: 52 6f 77 69 64 2c 20 30 2c 20 30 29 3b 0a 20 20  Rowid, 0, 0);.  
6ad0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6ae0: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
6af0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
6b00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6b10: 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Null, 0, 0);.   
6b20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6b30: 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  p(v, OP_Insert, 
6b40: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
6b50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6b60: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
6b70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6b80: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  ddOp(v, OP_Pull,
6b90: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f   1, 0);.  }..  /
6ba0: 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72  * Normal (non-er
6bb0: 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a  ror) return. */.
6bc0: 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20    return;..  /* 
6bd0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
6be0: 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65  rs, we jump here
6bf0: 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f   */.begin_table_
6c00: 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 46  error:.  sqliteF
6c10: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  ree(zName);.  re
6c20: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
6c30: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65  his macro is use
6c40: 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f  d to compare two
6c50: 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20 63 61   strings in a ca
6c60: 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 6d  se-insensitive m
6c70: 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20  anner..** It is 
6c80: 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 20  slightly faster 
6c90: 74 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c  than calling sql
6ca0: 69 74 65 33 53 74 72 49 43 6d 70 28 29 20 64 69  ite3StrICmp() di
6cb0: 72 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70  rectly, but.** p
6cc0: 72 6f 64 75 63 65 73 20 6c 61 72 67 65 72 20 63  roduces larger c
6cd0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49  ode..**.** WARNI
6ce0: 4e 47 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69  NG: This macro i
6cf0: 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65  s not compatible
6d00: 20 77 69 74 68 20 74 68 65 20 73 74 72 63 6d 70   with the strcmp
6d10: 28 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a  () family. It.**
6d20: 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66   returns true if
6d30: 20 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67 73   the two strings
6d40: 20 61 72 65 20 65 71 75 61 6c 2c 20 6f 74 68 65   are equal, othe
6d50: 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a  rwise false..*/.
6d60: 23 64 65 66 69 6e 65 20 53 54 52 49 43 4d 50 28  #define STRICMP(
6d70: 78 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74 65 33  x, y) (\.sqlite3
6d80: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75  UpperToLower[*(u
6d90: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28  nsigned char *)(
6da0: 78 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65  x)]==   \.sqlite
6db0: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28  3UpperToLower[*(
6dc0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
6dd0: 28 79 29 5d 20 20 20 20 20 5c 0a 26 26 20 73 71  (y)]     \.&& sq
6de0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 28 78 29  lite3StrICmp((x)
6df0: 2b 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a  +1,(y)+1)==0 )..
6e00: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
6e10: 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61  column to the ta
6e20: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65  ble currently be
6e30: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  ing constructed.
6e40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  .**.** The parse
6e50: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
6e60: 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61  tine once for ea
6e70: 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72  ch column declar
6e80: 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52  ation.** in a CR
6e90: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
6ea0: 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74  ment.  sqlite3St
6eb0: 61 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20  artTable() gets 
6ec0: 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20  called.** first 
6ed0: 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f  to get things go
6ee0: 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20  ing.  Then this 
6ef0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
6f00: 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f  d for each.** co
6f10: 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lumn..*/.void sq
6f20: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50  lite3AddColumn(P
6f30: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
6f40: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54  ken *pName){.  T
6f50: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
6f60: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43  ;.  char *z;.  C
6f70: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69  olumn *pCol;.  i
6f80: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
6f90: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
6fa0: 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71  return;.  z = sq
6fb0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
6fc0: 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  en(pName);.  if(
6fd0: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
6fe0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
6ff0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
7000: 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70  if( STRICMP(z, p
7010: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
7020: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7030: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7040: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
7050: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
7060: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
7070: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65  ree(z);.      re
7080: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
7090: 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26    if( (p->nCol &
70a0: 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   0x7)==0 ){.    
70b0: 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20  Column *aNew;.  
70c0: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    aNew = sqliteR
70d0: 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c  ealloc( p->aCol,
70e0: 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a   (p->nCol+8)*siz
70f0: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
7100: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
7110: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
7120: 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20  eFree(z);.      
7130: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
7140: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77    p->aCol = aNew
7150: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26  ;.  }.  pCol = &
7160: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d  p->aCol[p->nCol]
7170: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c  ;.  memset(pCol,
7180: 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43   0, sizeof(p->aC
7190: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d  ol[0]));.  pCol-
71a0: 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20  >zName = z;. .  
71b0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
71c0: 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  o type specified
71d0: 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74  , columns have t
71e0: 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e  he default affin
71f0: 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e  ity.  ** 'NONE'.
7200: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
7210: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 74  ype specified, t
7220: 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f  hen sqlite3AddCo
7230: 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a  lumnType() will.
7240: 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e    ** be called n
7250: 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d  ext to set pCol-
7260: 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63  >affinity correc
7270: 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  tly..  */.  pCol
7280: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
7290: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
72a0: 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50  pCol->pColl = pP
72b0: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
72c0: 6f 6c 6c 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b  oll;.  p->nCol++
72d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
72e0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
72f0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
7300: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
7310: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
7320: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
7330: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22   statement.  A "
7340: 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  NOT NULL" constr
7350: 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e  aint has.** been
7360: 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d   seen on a colum
7370: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
7380: 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c   sets the notNul
7390: 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65  l flag on.** the
73a0: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
73b0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
73c0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
73d0: 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28  lite3AddNotNull(
73e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
73f0: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54  nt onError){.  T
7400: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
7410: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
7420: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
7430: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
7440: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
7450: 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43  if( i>=0 ) p->aC
7460: 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20  ol[i].notNull = 
7470: 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  onError;.}../*.*
7480: 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d  * Scan the colum
7490: 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70  n type name zTyp
74a0: 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29  e (length nType)
74b0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a   and return the.
74c0: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66  ** associated af
74d0: 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a  finity type..**.
74e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
74f0: 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65  does a case-inde
7500: 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f  pendent search o
7510: 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20  f zType for the 
7520: 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69  .** substrings i
7530: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
7540: 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66  table. If one of
7550: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
7560: 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65  is.** found, the
7570: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61   corresponding a
7580: 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72  ffinity is retur
7590: 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f  ned. If zType co
75a0: 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74  ntains.** more t
75b0: 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  han one of the s
75c0: 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69  ubstrings, entri
75d0: 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f  es toward the to
75e0: 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62  p of .** the tab
75f0: 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79  le take priority
7600: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
7610: 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42  f zType is 'BLOB
7620: 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45  INT', .** SQLITE
7630: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20  _AFF_INTEGER is 
7640: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
7650: 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20  Substring     | 
7660: 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d  Affinity.** ----
7670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
7690: 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20  'INT'         | 
76a0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
76b0: 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20  ER.** 'CHAR'    
76c0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
76d0: 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20  _TEXT.** 'CLOB' 
76e0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
76f0: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58  AFF_TEXT.** 'TEX
7700: 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  T'        | SQLI
7710: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
7720: 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53  BLOB'        | S
7730: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a  QLITE_AFF_NONE.*
7740: 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20  * 'REAL'        
7750: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
7760: 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20  L.** 'FLOA'     
7770: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7780: 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20  REAL.** 'DOUB'  
7790: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
77a0: 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66  FF_REAL.**.** If
77b0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62   none of the sub
77c0: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61  strings in the a
77d0: 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66  bove table are f
77e0: 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ound,.** SQLITE_
77f0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72  AFF_NUMERIC is r
7800: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72  eturned..*/.char
7810: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
7820: 54 79 70 65 28 63 6f 6e 73 74 20 54 6f 6b 65 6e  Type(const Token
7830: 20 2a 70 54 79 70 65 29 7b 0a 20 20 75 33 32 20   *pType){.  u32 
7840: 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66  h = 0;.  char af
7850: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f = SQLITE_AFF_N
7860: 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20  UMERIC;.  const 
7870: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
7880: 49 6e 20 3d 20 70 54 79 70 65 2d 3e 7a 3b 0a 20  In = pType->z;. 
7890: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
78a0: 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20 26 70 54  char *zEnd = &pT
78b0: 79 70 65 2d 3e 7a 5b 70 54 79 70 65 2d 3e 6e 5d  ype->z[pType->n]
78c0: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 21  ;..  while( zIn!
78d0: 3d 7a 45 6e 64 20 29 7b 0a 20 20 20 20 68 20 3d  =zEnd ){.    h =
78e0: 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65   (h<<8) + sqlite
78f0: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a  3UpperToLower[*z
7900: 49 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a  In];.    zIn++;.
7910: 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27      if( h==(('c'
7920: 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b  <<24)+('h'<<16)+
7930: 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b  ('a'<<8)+'r') ){
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7950: 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66  CHAR */.      af
7960: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
7970: 45 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65 20  EXT; .    }else 
7980: 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34  if( h==(('c'<<24
7990: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
79a0: 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20  <<8)+'b') ){    
79b0: 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20     /* CLOB */.  
79c0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
79d0: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
79e0: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74  else if( h==(('t
79f0: 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29  '<<24)+('e'<<16)
7a00: 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29  +('x'<<8)+'t') )
7a10: 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20  {       /* TEXT 
7a20: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
7a30: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
7a40: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
7a50: 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('b'<<24)+('l'
7a60: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
7a70: 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b')          /* 
7a80: 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20  BLOB */.        
7a90: 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f  && (aff==SQLITE_
7aa0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61  AFF_NUMERIC || a
7ab0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff==SQLITE_AFF_R
7ac0: 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66  EAL) ){.      af
7ad0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f = SQLITE_AFF_N
7ae0: 4f 4e 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ONE;.#ifndef SQL
7af0: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
7b00: 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73  G_POINT.    }els
7b10: 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c  e if( h==(('r'<<
7b20: 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27  24)+('e'<<16)+('
7b30: 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20  a'<<8)+'l')     
7b40: 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a       /* REAL */.
7b50: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
7b60: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
7b70: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
7b80: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
7b90: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
7ba0: 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28   h==(('f'<<24)+(
7bb0: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
7bc0: 29 2b 27 61 27 29 20 20 20 20 20 20 20 20 20 20  )+'a')          
7bd0: 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20  /* FLOA */.     
7be0: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
7bf0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
7c00: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
7c10: 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20  ITE_AFF_REAL;.  
7c20: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
7c30: 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c  ('d'<<24)+('o'<<
7c40: 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27  16)+('u'<<8)+'b'
7c50: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f  )          /* DO
7c60: 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  UB */.        &&
7c70: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
7c80: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
7c90: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
7ca0: 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a  FF_REAL;.#endif.
7cb0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68      }else if( (h
7cc0: 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28  &0x00FFFFFF)==((
7cd0: 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38  'i'<<16)+('n'<<8
7ce0: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20  )+'t') ){    /* 
7cf0: 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  INT */.      aff
7d00: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   = SQLITE_AFF_IN
7d10: 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65  TEGER;.      bre
7d20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
7d30: 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a   return aff;.}..
7d40: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
7d50: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
7d60: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
7d70: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
7d80: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
7d90: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
7da0: 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72  ement.  The pFir
7db0: 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20  st token is the 
7dc0: 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69  first.** token i
7dd0: 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f  n the sequence o
7de0: 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65  f tokens that de
7df0: 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20  scribe the type 
7e00: 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  of the.** column
7e10: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
7e20: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
7e30: 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61   pLast is the la
7e40: 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74  st token.** in t
7e50: 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73  he sequence.  Us
7e60: 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  e this informati
7e70: 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  on to construct 
7e80: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74  a string.** that
7e90: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79   contains the ty
7ea0: 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  pename of the co
7eb0: 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74  lumn and store t
7ec0: 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e  hat string.** in
7ed0: 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64   zType..*/ .void
7ee0: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
7ef0: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
7f00: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70  rse, Token *pTyp
7f10: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
7f20: 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d    int i;.  Colum
7f30: 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 69 66 28 20  n *pCol;..  if( 
7f40: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
7f50: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
7f60: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
7f70: 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20  ol-1;.  if( i<0 
7f80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
7f90: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a   = &p->aCol[i];.
7fa0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f    sqliteFree(pCo
7fb0: 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 70 43 6f  l->zType);.  pCo
7fc0: 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74  l->zType = sqlit
7fd0: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
7fe0: 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e  pType);.  pCol->
7ff0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
8000: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70  e3AffinityType(p
8010: 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Type);.}../*.** 
8020: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
8030: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  s the default va
8040: 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  lue for the most
8050: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
8060: 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65  column.** of the
8070: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
8080: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
8090: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75  ion..**.** Defau
80a0: 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73 73  lt value express
80b0: 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e  ions must be con
80c0: 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e  stant.  Raise an
80d0: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68   exception if th
80e0: 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65  is.** is not the
80f0: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   case..**.** Thi
8100: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8110: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
8120: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
8130: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
8140: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
8150: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  LE statement..*/
8160: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
8170: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72  DefaultValue(Par
8180: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
8190: 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 61 62 6c   *pExpr){.  Tabl
81a0: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
81b0: 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d  pCol;.  if( (p =
81c0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
81d0: 6c 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43  le)!=0 ){.    pC
81e0: 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70  ol = &(p->aCol[p
81f0: 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20  ->nCol-1]);.    
8200: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
8210: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
8220: 74 69 6f 6e 28 70 45 78 70 72 29 20 29 7b 0a 20  tion(pExpr) ){. 
8230: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8240: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 65  rMsg(pParse, "de
8250: 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63  fault value of c
8260: 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f  olumn [%s] is no
8270: 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20  t constant",.   
8280: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61         pCol->zNa
8290: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
82a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
82b0: 72 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44  rDelete(pCol->pD
82c0: 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  flt);.      pCol
82d0: 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65  ->pDflt = sqlite
82e0: 33 45 78 70 72 44 75 70 28 70 45 78 70 72 29 3b  3ExprDup(pExpr);
82f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
8300: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
8310: 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
8320: 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52  Designate the PR
8330: 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68  IMARY KEY for th
8340: 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20  e table.  pList 
8350: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d  is a list of nam
8360: 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e  es .** of column
8370: 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  s that form the 
8380: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
8390: 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20   pList is NULL, 
83a0: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74  then the.** most
83b0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
83c0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
83d0: 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61  ble is the prima
83e0: 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20  ry key..**.** A 
83f0: 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61  table can have a
8400: 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61  t most one prima
8410: 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20  ry key.  If the 
8420: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
8430: 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b  s.** a primary k
8440: 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20  ey (and this is 
8450: 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61  the second prima
8460: 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65  ry key) then cre
8470: 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e  ate an.** error.
8480: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52  .**.** If the PR
8490: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20  IMARY KEY is on 
84a0: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
84b0: 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69  whose datatype i
84c0: 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68  s INTEGER,.** th
84d0: 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74  en we will try t
84e0: 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d  o use that colum
84f0: 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20  n as the rowid. 
8500: 20 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69   Set the Table.i
8510: 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66  PKey.** field of
8520: 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72   the table under
8530: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f   construction to
8540: 20 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66   be the index of
8550: 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20   the.** INTEGER 
8560: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
8570: 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79  mn.  Table.iPKey
8580: 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66   is set to -1 if
8590: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
85a0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
85b0: 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  KEY..**.** If th
85c0: 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20  e key is not an 
85d0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
85e0: 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65  KEY, then create
85f0: 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64   a unique.** ind
8600: 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20  ex for the key. 
8610: 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65   No index is cre
8620: 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52  ated for INTEGER
8630: 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a   PRIMARY KEYs..*
8640: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
8650: 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50  dPrimaryKey(.  P
8660: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8670: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
8680: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
8690: 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  t *pList,  /* Li
86a0: 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65  st of field name
86b0: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
86c0: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
86d0: 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  ,      /* What t
86e0: 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71  o do with a uniq
86f0: 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20  ueness conflict 
8700: 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63  */.  int autoInc
8710: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
8720: 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d  f the AUTOINCREM
8730: 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  ENT keyword is p
8740: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
8750: 73 6f 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a  sortOrder     /*
8760: 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f   SQLITE_SO_ASC o
8770: 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  r SQLITE_SO_DESC
8780: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
8790: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
87a0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72  NewTable;.  char
87b0: 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69   *zType = 0;.  i
87c0: 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b  nt iCol = -1, i;
87d0: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
87e0: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
87f0: 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54  y_exit;.  if( pT
8800: 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29  ab->hasPrimKey )
8810: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
8820: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
8830: 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73       "table \"%s
8840: 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  \" has more than
8850: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
8860: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
8870: 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72  .    goto primar
8880: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a  y_key_exit;.  }.
8890: 20 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b    pTab->hasPrimK
88a0: 65 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c  ey = 1;.  if( pL
88b0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43  ist==0 ){.    iC
88c0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  ol = pTab->nCol 
88d0: 2d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61  - 1;.    pTab->a
88e0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d  Col[iCol].isPrim
88f0: 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Key = 1;.  }else
8900: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
8910: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
8920: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  ++){.      for(i
8930: 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62  Col=0; iCol<pTab
8940: 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  ->nCol; iCol++){
8950: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
8960: 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
8970: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[i].zName, p
8980: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
8990: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
89a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
89b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
89c0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70        if( iCol<p
89d0: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
89e0: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
89f0: 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20  iCol].isPrimKey 
8a00: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
8a10: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74   }.    if( pList
8a20: 2d 3e 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c  ->nExpr>1 ) iCol
8a30: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28   = -1;.  }.  if(
8a40: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
8a50: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  <pTab->nCol ){. 
8a60: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
8a70: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
8a80: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79  e;.  }.  if( zTy
8a90: 70 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  pe && sqlite3Str
8aa0: 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54  ICmp(zType, "INT
8ab0: 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20  EGER")==0.      
8ac0: 20 20 26 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d    && sortOrder==
8ad0: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b  SQLITE_SO_ASC ){
8ae0: 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
8af0: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61   = iCol;.    pTa
8b00: 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45  b->keyConf = onE
8b10: 72 72 6f 72 3b 0a 20 20 20 20 70 54 61 62 2d 3e  rror;.    pTab->
8b20: 61 75 74 6f 49 6e 63 20 3d 20 61 75 74 6f 49 6e  autoInc = autoIn
8b30: 63 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61  c;.  }else if( a
8b40: 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65  utoInc ){.#ifnde
8b50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
8b60: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
8b70: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8b80: 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43  pParse, "AUTOINC
8b90: 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61  REMENT is only a
8ba0: 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20  llowed on an ". 
8bb0: 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50        "INTEGER P
8bc0: 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65  RIMARY KEY");.#e
8bd0: 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
8be0: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49    sqlite3CreateI
8bf0: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20  ndex(pParse, 0, 
8c00: 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45  0, 0, pList, onE
8c10: 72 72 6f 72 2c 20 30 2c 20 30 2c 20 73 6f 72 74  rror, 0, 0, sort
8c20: 4f 72 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 70  Order, 0);.    p
8c30: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70  List = 0;.  }..p
8c40: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a  rimary_key_exit:
8c50: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
8c60: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
8c70: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
8c80: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43 48  .** Add a new CH
8c90: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  ECK constraint t
8ca0: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
8cb0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
8cc0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
8cd0: 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65 63  d sqlite3AddChec
8ce0: 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  kConstraint(.  P
8cf0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8d00: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
8d10: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
8d20: 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54 68  CheckExpr  /* Th
8d30: 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73 69  e check expressi
8d40: 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  on */.){.#ifndef
8d50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
8d60: 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  CK.  Table *pTab
8d70: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
8d80: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 54 61 62  able;.  if( pTab
8d90: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 43   ){.    /* The C
8da0: 48 45 43 4b 20 65 78 70 72 65 73 73 69 6f 6e 20  HECK expression 
8db0: 6d 75 73 74 20 62 65 20 64 75 70 6c 69 63 61 74  must be duplicat
8dc0: 65 64 20 73 6f 20 74 68 61 74 20 74 6f 6b 65 6e  ed so that token
8dd0: 73 20 72 65 66 65 72 0a 20 20 20 20 2a 2a 20 74  s refer.    ** t
8de0: 6f 20 6d 61 6c 6c 6f 63 65 64 20 73 70 61 63 65  o malloced space
8df0: 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 28 65 70   and not the (ep
8e00: 68 65 6d 65 72 61 6c 29 20 74 65 78 74 20 6f 66  hemeral) text of
8e10: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
8e20: 45 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65  E.    ** stateme
8e30: 6e 74 20 2a 2f 0a 20 20 20 20 70 54 61 62 2d 3e  nt */.    pTab->
8e40: 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33  pCheck = sqlite3
8e50: 45 78 70 72 41 6e 64 28 70 54 61 62 2d 3e 70 43  ExprAnd(pTab->pC
8e60: 68 65 63 6b 2c 20 73 71 6c 69 74 65 33 45 78 70  heck, sqlite3Exp
8e70: 72 44 75 70 28 70 43 68 65 63 6b 45 78 70 72 29  rDup(pCheckExpr)
8e80: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
8e90: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8ea0: 65 28 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 7d  e(pCheckExpr);.}
8eb0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
8ec0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
8ed0: 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
8ee0: 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74  ecently parsed t
8ef0: 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74  able column.** t
8f00: 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69  o the CollSeq gi
8f10: 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ven..*/.void sql
8f20: 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79  ite3AddCollateTy
8f30: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
8f40: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
8f50: 79 70 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b  ype, int nType){
8f60: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 49  .  Table *p;.  I
8f70: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 43 6f  ndex *pIdx;.  Co
8f80: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
8f90: 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 28 70  int i;..  if( (p
8fa0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
8fb0: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
8fc0: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
8fd0: 2d 31 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73  -1;..  pColl = s
8fe0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
8ff0: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 54 79 70  Seq(pParse, zTyp
9000: 65 2c 20 6e 54 79 70 65 29 3b 0a 20 20 70 2d 3e  e, nType);.  p->
9010: 61 43 6f 6c 5b 69 5d 2e 70 43 6f 6c 6c 20 3d 20  aCol[i].pColl = 
9020: 70 43 6f 6c 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20  pColl;..  /* If 
9030: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65  the column is de
9040: 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65  clared as "<name
9050: 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f  > PRIMARY KEY CO
9060: 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20  LLATE <type>",. 
9070: 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65   ** then an inde
9080: 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  x may have been 
9090: 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20  created on this 
90a0: 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68  column before th
90b0: 65 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e  e.  ** collation
90c0: 20 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e   type was added.
90d0: 20 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66   Correct this if
90e0: 20 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e   it is the case.
90f0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78  .  */.  for(pIdx
9100: 20 3d 20 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49   = p->pIndex; pI
9110: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
9120: 4e 65 78 74 29 7b 0a 20 20 20 20 61 73 73 65 72  Next){.    asser
9130: 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
9140: 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==1 );.    if( p
9150: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
9160: 3d 3d 69 20 29 20 70 49 64 78 2d 3e 6b 65 79 49  ==i ) pIdx->keyI
9170: 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70  nfo.aColl[0] = p
9180: 43 6f 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Coll;.  }.}../*.
9190: 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43  ** Call sqlite3C
91a0: 68 65 63 6b 43 6f 6c 6c 53 65 71 28 29 20 66 6f  heckCollSeq() fo
91b0: 72 20 61 6c 6c 20 63 6f 6c 6c 61 74 69 6e 67 20  r all collating 
91c0: 73 65 71 75 65 6e 63 65 73 20 69 6e 20 61 6e 20  sequences in an 
91d0: 69 6e 64 65 78 2c 0a 2a 2a 20 69 6e 20 6f 72 64  index,.** in ord
91e0: 65 72 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  er to verify tha
91f0: 74 20 61 6c 6c 20 74 68 65 20 6e 65 63 65 73 73  t all the necess
9200: 61 72 79 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ary collating se
9210: 71 75 65 6e 63 65 73 20 61 72 65 0a 2a 2a 20 6c  quences are.** l
9220: 6f 61 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oaded..*/.int sq
9230: 6c 69 74 65 33 43 68 65 63 6b 49 6e 64 65 78 43  lite3CheckIndexC
9240: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
9250: 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64  arse, Index *pId
9260: 78 29 7b 0a 20 20 69 66 28 20 70 49 64 78 20 29  x){.  if( pIdx )
9270: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
9280: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
9290: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
92a0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
92b0: 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70  e3CheckCollSeq(p
92c0: 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 6b 65 79  Parse, pIdx->key
92d0: 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 29  Info.aColl[i]) )
92e0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
92f0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
9300: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9310: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9320: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
9330: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
9340: 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  rns the collatio
9350: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64  n sequence for d
9360: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74  atabase native t
9370: 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  ext.** encoding 
9380: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
9390: 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20  e string zName, 
93a0: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a  length nName..**
93b0: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
93c0: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  sted collation s
93d0: 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61  equence is not a
93e0: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74  vailable, or not
93f0: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e   available.** in
9400: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
9410: 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74  tive encoding, t
9420: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
9430: 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20  tory is invoked 
9440: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74  to.** request it
9450: 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  . If the collati
9460: 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20  on factory does 
9470: 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20  not supply such 
9480: 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61  a sequence,.** a
9490: 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  nd the sequence 
94a0: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
94b0: 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63  another text enc
94c0: 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74  oding, then that
94d0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
94e0: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
94f0: 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66  f no versions of
9500: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
9510: 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e  ollations sequen
9520: 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ce are available
9530: 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20  , or.** another 
9540: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
9550: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
9560: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
9570: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
9580: 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 43  .** pParse..*/.C
9590: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
95a0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
95b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
95c0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
95d0: 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 73 71 6c  nt nName){.  sql
95e0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
95f0: 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20  e->db;.  u8 enc 
9600: 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20  = ENC(db);.  u8 
9610: 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69  initbusy = db->i
9620: 6e 69 74 2e 62 75 73 79 3b 0a 0a 20 20 43 6f 6c  nit.busy;..  Col
9630: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
9640: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
9650: 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c  (db, enc, zName,
9660: 20 6e 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79   nName, initbusy
9670: 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75  );.  if( !initbu
9680: 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c  sy && (!pColl ||
9690: 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29   !pColl->xCmp) )
96a0: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
96b0: 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28  lite3GetCollSeq(
96c0: 64 62 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65  db, pColl, zName
96d0: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , nName);.    if
96e0: 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
96f0: 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29 7b    if( nName<0 ){
9700: 0a 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d  .        nName =
9710: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a   strlen(zName);.
9720: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
9730: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9740: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63  arse, "no such c
9750: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
9760: 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e 61 6d 65 2c  e: %.*s", nName,
9770: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70   zName);.      p
9780: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Coll = 0;.    }.
9790: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43    }..  return pC
97a0: 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  oll;.}.../*.** G
97b0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
97c0: 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74  t will increment
97d0: 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
97e0: 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63  ie..**.** The sc
97f0: 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75  hema cookie is u
9800: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
9810: 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
9820: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61   for the.** data
9830: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41  base changes.  A
9840: 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61  fter each schema
9850: 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f   change, the coo
9860: 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61  kie value.** cha
9870: 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72  nges.  When a pr
9880: 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64  ocess first read
9890: 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20  s the schema it 
98a0: 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63  records the.** c
98b0: 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74  ookie.  Thereaft
98c0: 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20  er, whenever it 
98d0: 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74  goes to access t
98e0: 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20  he database,.** 
98f0: 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f  it checks the co
9900: 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  okie to make sur
9910: 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73  e the schema has
9920: 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20   not changed.** 
9930: 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73  since it was las
9940: 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  t read..**.** Th
9950: 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63  is plan is not c
9960: 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74  ompletely bullet
9970: 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70  -proof.  It is p
9980: 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74  ossible for.** t
9990: 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61  he schema to cha
99a0: 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  nge multiple tim
99b0: 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63  es and for the c
99c0: 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73  ookie to be.** s
99d0: 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72  et back to prior
99e0: 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68   value.  But sch
99f0: 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20  ema changes are 
9a00: 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e  infrequent.** an
9a10: 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  d the probabilit
9a20: 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65  y of hitting the
9a30: 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c   same cookie val
9a40: 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20  ue is only.** 1 
9a50: 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20  chance in 2^32. 
9a60: 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65   So we're safe e
9a70: 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73  nough..*/.void s
9a80: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
9a90: 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ie(sqlite3 *db, 
9aa0: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 44 62  Vdbe *v, int iDb
9ab0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
9ac0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
9ad0: 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62  ger, db->aDb[iDb
9ae0: 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ].pSchema->schem
9af0: 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 30 29 3b 0a  a_cookie+1, 0);.
9b00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9b10: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  Op(v, OP_SetCook
9b20: 69 65 2c 20 69 44 62 2c 20 30 29 3b 0a 7d 0a 0a  ie, iDb, 0);.}..
9b30: 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68  /*.** Measure th
9b40: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
9b50: 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f  acters needed to
9b60: 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   output the give
9b70: 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e  n.** identifier.
9b80: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74    The number ret
9b90: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61  urned includes a
9ba0: 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a  ny quotes used.*
9bb0: 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69  * but does not i
9bc0: 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20  nclude the null 
9bd0: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a  terminator..**.*
9be0: 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69  * The estimate i
9bf0: 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20  s conservative. 
9c00: 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72   It might be lar
9c10: 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73  ger that what is
9c20: 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65  .** really neede
9c30: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
9c40: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e   identLength(con
9c50: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
9c60: 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b  nt n;.  for(n=0;
9c70: 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a   *z; n++, z++){.
9c80: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20      if( *z=='"' 
9c90: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  ){ n++; }.  }.  
9ca0: 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a  return n + 2;.}.
9cb0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
9cc0: 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20  identifier onto 
9cd0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67  the end of the g
9ce0: 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41 64  iven string.  Ad
9cf0: 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61  d.** quote chara
9d00: 63 74 65 72 73 20 61 73 20 6e 65 65 64 65 64 2e  cters as needed.
9d10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9d20: 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a  identPut(char *z
9d30: 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61  , int *pIdx, cha
9d40: 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29  r *zSignedIdent)
9d50: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
9d60: 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73  r *zIdent = (uns
9d70: 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67  igned char*)zSig
9d80: 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20  nedIdent;.  int 
9d90: 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b  i, j, needQuote;
9da0: 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20  .  i = *pIdx;.  
9db0: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
9dc0: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  j]; j++){.    if
9dd0: 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e  ( !isalnum(zIden
9de0: 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b  t[j]) && zIdent[
9df0: 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b  j]!='_' ) break;
9e00: 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65  .  }.  needQuote
9e10: 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30   =  zIdent[j]!=0
9e20: 20 7c 7c 20 69 73 64 69 67 69 74 28 7a 49 64 65   || isdigit(zIde
9e30: 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20  nt[0]).         
9e40: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
9e50: 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a  te3KeywordCode(z
9e60: 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44  Ident, j)!=TK_ID
9e70: 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  ;.  if( needQuot
9e80: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
9e90: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
9ea0: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
9eb0: 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e    z[i++] = zIden
9ec0: 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49  t[j];.    if( zI
9ed0: 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a  dent[j]=='"' ) z
9ee0: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d  [i++] = '"';.  }
9ef0: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
9f00: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
9f10: 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a  .  z[i] = 0;.  *
9f20: 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a  pIdx = i;.}../*.
9f30: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52  ** Generate a CR
9f40: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
9f50: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
9f60: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
9f70: 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79  * table.  Memory
9f80: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78   to hold the tex
9f90: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
9fa0: 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  nt is obtained.*
9fb0: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  * from sqliteMal
9fc0: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
9fd0: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
9fe0: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
9ff0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
a000: 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74  *createTableStmt
a010: 28 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 69  (Table *p, int i
a020: 73 54 65 6d 70 29 7b 0a 20 20 69 6e 74 20 69 2c  sTemp){.  int i,
a030: 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a   k, n;.  char *z
a040: 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53  Stmt;.  char *zS
a050: 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e  ep, *zSep2, *zEn
a060: 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20  d, *z;.  Column 
a070: 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a  *pCol;.  n = 0;.
a080: 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e    for(pCol = p->
a090: 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e  aCol, i=0; i<p->
a0a0: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
a0b0: 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65  +){.    n += ide
a0c0: 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a  ntLength(pCol->z
a0d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 70  Name);.    z = p
a0e0: 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20  Col->zType;.    
a0f0: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 6e  if( z ){.      n
a100: 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 29 20 2b   += (strlen(z) +
a110: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   1);.    }.  }. 
a120: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
a130: 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  h(p->zName);.  i
a140: 66 28 20 6e 3c 35 30 20 29 7b 0a 20 20 20 20 7a  f( n<50 ){.    z
a150: 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53  Sep = "";.    zS
a160: 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a  ep2 = ",";.    z
a170: 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c  End = ")";.  }el
a180: 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  se{.    zSep = "
a190: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32  \n  ";.    zSep2
a1a0: 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20   = ",\n  ";.    
a1b0: 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20  zEnd = "\n)";.  
a1c0: 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a  }.  n += 35 + 6*
a1d0: 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74  p->nCol;.  zStmt
a1e0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
a1f0: 61 77 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a  aw( n );.  if( z
a200: 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  Stmt==0 ) return
a210: 20 30 3b 0a 20 20 73 74 72 63 70 79 28 7a 53 74   0;.  strcpy(zSt
a220: 6d 74 2c 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  mt, !OMIT_TEMPDB
a230: 26 26 69 73 54 65 6d 70 20 3f 20 22 43 52 45 41  &&isTemp ? "CREA
a240: 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 22 3a  TE TEMP TABLE ":
a250: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 29  "CREATE TABLE ")
a260: 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a  ;.  k = strlen(z
a270: 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75  Stmt);.  identPu
a280: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e  t(zStmt, &k, p->
a290: 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b  zName);.  zStmt[
a2a0: 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f  k++] = '(';.  fo
a2b0: 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20  r(pCol=p->aCol, 
a2c0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
a2d0: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
a2e0: 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b    strcpy(&zStmt[
a2f0: 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b  k], zSep);.    k
a300: 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d   += strlen(&zStm
a310: 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20  t[k]);.    zSep 
a320: 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65  = zSep2;.    ide
a330: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
a340: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
a350: 20 20 20 69 66 28 20 28 7a 20 3d 20 70 43 6f 6c     if( (z = pCol
a360: 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29 7b 0a 20  ->zType)!=0 ){. 
a370: 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20       zStmt[k++] 
a380: 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 73 74 72  = ' ';.      str
a390: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
a3a0: 29 3b 0a 20 20 20 20 20 20 6b 20 2b 3d 20 73 74  );.      k += st
a3b0: 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 7d 0a 20  rlen(z);.    }. 
a3c0: 20 7d 0a 20 20 73 74 72 63 70 79 28 26 7a 53 74   }.  strcpy(&zSt
a3d0: 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20  mt[k], zEnd);.  
a3e0: 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a  return zStmt;.}.
a3f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
a400: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
a410: 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61   report the fina
a420: 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69  l ")" that termi
a430: 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54  nates.** a CREAT
a440: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
a450: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  t..**.** The tab
a460: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
a470: 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72  t other action r
a480: 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65  outines have bee
a490: 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73  n building.** is
a4a0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
a4b0: 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c  ternal hash tabl
a4c0: 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20  es, assuming no 
a4d0: 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f  errors have.** o
a4e0: 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  ccurred..**.** A
a4f0: 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
a500: 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e  table is made in
a510: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
a520: 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73  e on disk, unles
a530: 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74  s.** this is a t
a540: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
a550: 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  r db->init.busy=
a560: 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e  =1.  When db->in
a570: 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74  it.busy==1.** it
a580: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
a590: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
a5a0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65  _master table be
a5b0: 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a  cause we just.**
a5c0: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68   connected to th
a5d0: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65  e database or be
a5e0: 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65  cause the sqlite
a5f0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61  _master table ha
a600: 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68  s.** recently ch
a610: 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e  anged, so the en
a620: 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62  try for this tab
a630: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
a640: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s in.** the sqli
a650: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
a660: 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74    We do not want
a670: 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67   to create it ag
a680: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ain..**.** If th
a690: 65 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65  e pSelect argume
a6a0: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nt is not NULL, 
a6b0: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
a6c0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61  is routine.** wa
a6d0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
a6e0: 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72  te a table gener
a6f0: 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20  ated from a .** 
a700: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e  "CREATE TABLE ..
a710: 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22  . AS SELECT ..."
a720: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
a730: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66   column names of
a740: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c  .** the new tabl
a750: 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65  e will match the
a760: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
a770: 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
a780: 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  id sqlite3EndTab
a790: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
a7a0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
a7b0: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
a7c0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73  /.  Token *pCons
a7d0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
a7e0: 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74  he ',' token aft
a7f0: 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  er the last colu
a800: 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f  mn defn. */.  To
a810: 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20  ken *pEnd,      
a820: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6e        /* The fin
a830: 61 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20  al ')' token in 
a840: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
a850: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
a860: 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a  elect         /*
a870: 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22   Select from a "
a880: 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45  CREATE ... AS SE
a890: 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61  LECT" */.){.  Ta
a8a0: 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  ble *p;.  sqlite
a8b0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
a8c0: 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
a8d0: 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26    if( (pEnd==0 &
a8e0: 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c  & pSelect==0) ||
a8f0: 20 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e   .      pParse->
a900: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 54  nErr || sqlite3T
a910: 68 72 65 61 64 44 61 74 61 28 29 2d 3e 6d 61 6c  hreadData()->mal
a920: 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20 20  locFailed ) {.  
a930: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
a940: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
a950: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
a960: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  0 ) return;..  a
a970: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
a980: 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63  .busy || !pSelec
a990: 74 20 29 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71  t );..  iDb = sq
a9a0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
a9b0: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
a9c0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66  ->pSchema);..#if
a9d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a9e0: 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f  _CHECK.  /* Reso
a9f0: 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c  lve names in all
aa00: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
aa10: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20  t expressions.. 
aa20: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68   */.  if( p->pCh
aa30: 65 63 6b 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  eck ){.    SrcLi
aa40: 73 74 20 73 53 72 63 3b 20 20 20 20 20 20 20 20  st sSrc;        
aa50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61             /* Fa
aa60: 6b 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70  ke SrcList for p
aa70: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
aa80: 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74   */.    NameCont
aa90: 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20  ext sNC;        
aaa0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
aab0: 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72  context for pPar
aac0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f  se->pNewTable */
aad0: 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  ..    memset(&sN
aae0: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
aaf0: 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ));.    memset(&
ab00: 73 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sSrc, 0, sizeof(
ab10: 73 53 72 63 29 29 3b 0a 20 20 20 20 73 53 72 63  sSrc));.    sSrc
ab20: 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 73  .nSrc = 1;.    s
ab30: 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d  Src.a[0].zName =
ab40: 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73   p->zName;.    s
ab50: 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20  Src.a[0].pTab = 
ab60: 70 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d  p;.    sSrc.a[0]
ab70: 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  .iCursor = -1;. 
ab80: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
ab90: 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e  pParse;.    sNC.
aba0: 70 53 72 63 4c 69 73 74 20 3d 20 26 73 53 72 63  pSrcList = &sSrc
abb0: 3b 0a 20 20 20 20 73 4e 43 2e 69 73 43 68 65 63  ;.    sNC.isChec
abc0: 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 73  k = 1;.    if( s
abd0: 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
abe0: 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
abf0: 70 43 68 65 63 6b 29 20 29 7b 0a 20 20 20 20 20  pCheck) ){.     
ac00: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
ac10: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
ac20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
ac30: 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f  T_CHECK) */..  /
ac40: 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
ac50: 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d  t.busy is 1 it m
ac60: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
ac70: 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20  ing the SQL off 
ac80: 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65  the.  ** "sqlite
ac90: 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c  _master" or "sql
aca0: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22  ite_temp_master"
acb0: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
acc0: 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e  sk..  ** So do n
acd0: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
ace0: 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74  disk again.  Ext
acf0: 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61  ract the root pa
ad00: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66  ge number.  ** f
ad10: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  or the table fro
ad20: 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e  m the db->init.n
ad30: 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28  ewTnum field.  (
ad40: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  The page number.
ad50: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65    ** should have
ad60: 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20   been put there 
ad70: 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65  by the sqliteOpe
ad80: 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20  nCb routine.).  
ad90: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
ada0: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d  t.busy ){.    p-
adb0: 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
adc0: 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20  .newTnum;.  }.. 
add0: 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69   /* If not initi
ade0: 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72  alizing, then cr
adf0: 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f  eate a record fo
ae00: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a  r the new table.
ae10: 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49    ** in the SQLI
ae20: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
ae30: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
ae40: 20 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d    The record num
ae50: 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ber.  ** for the
ae60: 20 6e 65 77 20 74 61 62 6c 65 20 65 6e 74 72 79   new table entry
ae70: 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
ae80: 62 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  be on the stack.
ae90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
aea0: 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52  is is a TEMPORAR
aeb0: 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74  Y table, write t
aec0: 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  he entry into th
aed0: 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
aee0: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
aef0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
af00: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
af10: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
af20: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69  it.busy ){.    i
af30: 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt n;.    Vdbe *
af40: 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  v;.    char *zTy
af50: 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22  pe;    /* "view"
af60: 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20   or "table" */. 
af70: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b     char *zType2;
af80: 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20     /* "VIEW" or 
af90: 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63  "TABLE" */.    c
afa0: 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f  har *zStmt;    /
afb0: 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52  * Text of the CR
afc0: 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52  EATE TABLE or CR
afd0: 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d  EATE VIEW statem
afe0: 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20  ent */..    v = 
aff0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
b000: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
b010: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  v==0 ) return;..
b020: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b030: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
b040: 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  , 0, 0);..    /*
b050: 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74   Create the root
b060: 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65 77  page for the new
b070: 20 74 61 62 6c 65 20 61 6e 64 20 70 75 73 68 20   table and push 
b080: 69 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  it onto the stac
b090: 6b 2e 0a 20 20 20 20 2a 2a 20 41 20 76 69 65 77  k..    ** A view
b0a0: 20 68 61 73 20 6e 6f 20 72 6f 6f 74 70 61 67 65   has no rootpage
b0b0: 2c 20 73 6f 20 6a 75 73 74 20 70 75 73 68 20 61  , so just push a
b0c0: 20 7a 65 72 6f 20 6f 6e 74 6f 20 74 68 65 20 73   zero onto the s
b0d0: 74 61 63 6b 20 66 6f 72 0a 20 20 20 20 2a 2a 20  tack for.    ** 
b0e0: 76 69 65 77 73 2e 20 20 49 6e 69 74 69 61 6c 69  views.  Initiali
b0f0: 7a 65 20 7a 54 79 70 65 20 61 74 20 74 68 65 20  ze zType at the 
b100: 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 2a  same time..    *
b110: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65  /.    if( p->pSe
b120: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lect==0 ){.     
b130: 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61   /* A regular ta
b140: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  ble */.      zTy
b150: 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20  pe = "table";.  
b160: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41      zType2 = "TA
b170: 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51  BLE";.#ifndef SQ
b180: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
b190: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b1a0: 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20  /* A view */.   
b1b0: 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77     zType = "view
b1c0: 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20  ";.      zType2 
b1d0: 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66  = "VIEW";.#endif
b1e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
b1f0: 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41  f this is a CREA
b200: 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53  TE TABLE xx AS S
b210: 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75  ELECT ..., execu
b220: 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  te the SELECT.  
b230: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
b240: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e  o populate the n
b250: 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f  ew table. The ro
b260: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66  ot-page number f
b270: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65  or the.    ** ne
b280: 77 20 74 61 62 6c 65 20 69 73 20 6f 6e 20 74 68  w table is on th
b290: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 76 64 62  e top of the vdb
b2a0: 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a  e stack..    **.
b2b0: 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20      ** Once the 
b2c0: 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20  SELECT has been 
b2d0: 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33  coded by sqlite3
b2e0: 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20  Select(), it is 
b2f0: 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74  in a.    ** suit
b300: 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75  able state to qu
b310: 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ery for the colu
b320: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70  mn names and typ
b330: 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20  es to be used.  
b340: 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20    ** by the new 
b350: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  table..    **.  
b360: 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61    ** A shared-ca
b370: 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69  che write-lock i
b380: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
b390: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e  o write to the n
b3a0: 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a  ew table,.    **
b3b0: 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63   as a schema-loc
b3c0: 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  k must have alre
b3d0: 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ady been obtaine
b3e0: 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20  d to create it. 
b3f0: 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73  Since.    ** a s
b400: 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75  chema-lock exclu
b410: 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61  des all other da
b420: 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68  tabase users, th
b430: 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75  e write-lock wou
b440: 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64  ld.    ** be red
b450: 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  undant..    */. 
b460: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
b470: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
b480: 53 65 6c 54 61 62 3b 0a 20 20 20 20 20 20 73 71  SelTab;.      sq
b490: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b4a0: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
b4b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b4c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
b4d0: 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a  teger, iDb, 0);.
b4e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b4f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
b500: 6e 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20  nWrite, 1, 0);. 
b510: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
b520: 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  b = 2;.      sql
b530: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
b540: 65 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f  e, pSelect, SRT_
b550: 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20  Table, 1, 0, 0, 
b560: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
b570: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b580: 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29   OP_Close, 1, 0)
b590: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
b5a0: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
b5b0: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d         pSelTab =
b5c0: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
b5d0: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
b5e0: 2c 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  , 0, pSelect);. 
b5f0: 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54         if( pSelT
b600: 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ab==0 ) return;.
b610: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b620: 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  p->aCol==0 );.  
b630: 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20        p->nCol = 
b640: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
b650: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d         p->aCol =
b660: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a   pSelTab->aCol;.
b670: 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d          pSelTab-
b680: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
b690: 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
b6a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
b6b0: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
b6c0: 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  (0, pSelTab);.  
b6d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
b6e0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
b6f0: 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
b700: 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74   the CREATE stat
b710: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28  ement */.    if(
b720: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
b730: 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65    zStmt = create
b740: 54 61 62 6c 65 53 74 6d 74 28 70 2c 20 70 2d 3e  TableStmt(p, p->
b750: 70 53 63 68 65 6d 61 3d 3d 70 50 61 72 73 65 2d  pSchema==pParse-
b760: 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  >db->aDb[1].pSch
b770: 65 6d 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ema);.    }else{
b780: 0a 20 20 20 20 20 20 6e 20 3d 20 70 45 6e 64 2d  .      n = pEnd-
b790: 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61  >z - pParse->sNa
b7a0: 6d 65 54 6f 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20  meToken.z + 1;. 
b7b0: 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c       zStmt = sql
b7c0: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 43 52 45  ite3MPrintf("CRE
b7d0: 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54  ATE %s %.*s", zT
b7e0: 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d  ype2, n, pParse-
b7f0: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a  >sNameToken.z);.
b800: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20      }..    /* A 
b810: 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63  slot for the rec
b820: 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ord has already 
b830: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69  been allocated i
b840: 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51  n the .    ** SQ
b850: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
b860: 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64  e.  We just need
b870: 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20   to update that 
b880: 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20  slot with all.  
b890: 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61    ** the informa
b8a0: 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65  tion we've colle
b8b0: 63 74 65 64 2e 20 20 54 68 65 20 72 6f 77 69 64  cted.  The rowid
b8c0: 20 66 6f 72 20 74 68 65 20 70 72 65 61 6c 6c 6f   for the preallo
b8d0: 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 73 6c 6f  cated.    ** slo
b8e0: 74 20 69 73 20 74 68 65 20 32 6e 64 20 69 74 65  t is the 2nd ite
b8f0: 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  m on the stack. 
b900: 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   The top of the 
b910: 73 74 61 63 6b 20 69 73 20 74 68 65 0a 20 20 20  stack is the.   
b920: 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 66 6f   ** root page fo
b930: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  r the new table 
b940: 28 6f 72 20 61 20 30 20 69 66 20 74 68 69 73 20  (or a 0 if this 
b950: 69 73 20 61 20 76 69 65 77 29 2e 0a 20 20 20 20  is a view)..    
b960: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
b970: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
b980: 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20  ,.      "UPDATE 
b990: 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20  %Q.%s ".        
b9a0: 20 22 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c   "SET type='%s',
b9b0: 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61   name=%Q, tbl_na
b9c0: 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d  me=%Q, rootpage=
b9d0: 23 30 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20  #0, sql=%Q ".   
b9e0: 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64      "WHERE rowid
b9f0: 3d 23 31 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e  =#1",.      db->
ba00: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
ba10: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
ba20: 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a  ),.      zType,.
ba30: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
ba40: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
ba50: 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20        zStmt.    
ba60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
ba70: 65 28 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71  e(zStmt);.    sq
ba80: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
ba90: 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 0a  e(db, v, iDb);..
baa0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
bab0: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
bac0: 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  T.    /* Check t
bad0: 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65 64  o see if we need
bae0: 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71   to create an sq
baf0: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
bb00: 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b  ble for.    ** k
bb10: 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20  eeping track of 
bb20: 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65  autoincrement ke
bb30: 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ys..    */.    i
bb40: 66 28 20 70 2d 3e 61 75 74 6f 49 6e 63 20 29 7b  f( p->autoInc ){
bb50: 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d  .      Db *pDb =
bb60: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
bb70: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
bb80: 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d  Schema->pSeqTab=
bb90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
bba0: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
bbb0: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
bbc0: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
bbd0: 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
bbe0: 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a  nce(name,seq)",.
bbf0: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a            pDb->z
bc00: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  Name.        );.
bc10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
bc20: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70  ndif..    /* Rep
bc30: 61 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20  arse everything 
bc40: 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e  to update our in
bc50: 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75  ternal data stru
bc60: 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71  ctures */.    sq
bc70: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
bc80: 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20  OP_ParseSchema, 
bc90: 69 44 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  iDb, 0,.        
bca0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
bcb0: 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70  tbl_name='%q'",p
bcc0: 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e  ->zName), P3_DYN
bcd0: 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  AMIC);.  }...  /
bce0: 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20  * Add the table 
bcf0: 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  to the in-memory
bd00: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
bd10: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
bd20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
bd30: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61  init.busy && pPa
bd40: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
bd50: 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b      Table *pOld;
bd60: 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  .    FKey *pFKey
bd70: 3b 20 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  ; .    Schema *p
bd80: 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68  Schema = p->pSch
bd90: 65 6d 61 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20  ema;.    pOld = 
bda0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
bdb0: 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  t(&pSchema->tblH
bdc0: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73  ash, p->zName, s
bdd0: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
bde0: 31 2c 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  1,p);.    if( pO
bdf0: 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ld ){.      asse
be00: 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20  rt( p==pOld );  
be10: 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
be20: 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64  ave failed insid
be30: 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a  e HashInsert() *
be40: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  /.      return;.
be50: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
be60: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
be70: 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28 70 46  N_KEY.    for(pF
be80: 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46  Key=p->pFKey; pF
be90: 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79  Key; pFKey=pFKey
bea0: 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20  ->pNextFrom){.  
beb0: 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74      int nTo = st
bec0: 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29  rlen(pFKey->zTo)
bed0: 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65   + 1;.      pFKe
bee0: 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c  y->pNextTo = sql
bef0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53  ite3HashFind(&pS
bf00: 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46  chema->aFKey, pF
bf10: 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a  Key->zTo, nTo);.
bf20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73        sqlite3Has
bf30: 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61  hInsert(&pSchema
bf40: 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e  ->aFKey, pFKey->
bf50: 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29  zTo, nTo, pFKey)
bf60: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
bf70: 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
bf80: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
bf90: 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20  ->nTable++;.    
bfa0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
bfb0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
bfc0: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
bfd0: 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42  TE_OMIT_ALTERTAB
bfe0: 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70  LE.    if( !p->p
bff0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
c000: 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74  assert( !pSelect
c010: 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e   && pCons && pEn
c020: 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  d );.      if( p
c030: 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 20 70 43 6f  Cons->z==0 ) pCo
c040: 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  ns = pEnd;.     
c050: 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74   p->addColOffset
c060: 20 3d 20 31 33 20 2b 20 28 70 43 6f 6e 73 2d 3e   = 13 + (pCons->
c070: 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d  z - pParse->sNam
c080: 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 7d  eToken.z);.    }
c090: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23  .#endif.  }.}..#
c0a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c0b0: 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68  IT_VIEW./*.** Th
c0c0: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
c0d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f  his routine in o
c0e0: 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61  rder to create a
c0f0: 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69   new VIEW.*/.voi
c100: 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56  d sqlite3CreateV
c110: 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50  iew(.  Parse *pP
c120: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65  arse,     /* The
c130: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
c140: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65   */.  Token *pBe
c150: 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  gin,     /* The 
c160: 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
c170: 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61  t begins the sta
c180: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
c190: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
c1a0: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
c1b0: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
c1c0: 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
c1d0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
c1e0: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
c1f0: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
c200: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
c210: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
c220: 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45  elect,   /* A SE
c230: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
c240: 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
c250: 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a  the new view */.
c260: 20 20 69 6e 74 20 69 73 54 65 6d 70 20 20 20 20    int isTemp    
c270: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72       /* TRUE for
c280: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65   a TEMPORARY vie
c290: 77 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  w */.){.  Table 
c2a0: 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  *p;.  int n;.  c
c2b0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
c2c0: 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73  ar *z;.  Token s
c2d0: 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73  End;.  DbFixer s
c2e0: 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  Fix;.  Token *pN
c2f0: 61 6d 65 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  ame;.  int iDb;.
c300: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
c310: 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  Var>0 ){.    sql
c320: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
c330: 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73  rse, "parameters
c340: 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
c350: 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20   in views");.   
c360: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
c370: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
c380: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
c390: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
c3a0: 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65 67 69  le(pParse, pBegi
c3b0: 6e 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  n, pName1, pName
c3c0: 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 29  2, isTemp, 1, 0)
c3d0: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
c3e0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
c3f0: 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
c400: 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c  >nErr ){.    sql
c410: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
c420: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72  (pSelect);.    r
c430: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
c440: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
c450: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
c460: 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
c470: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
c480: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
c490: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63  arse->db, p->pSc
c4a0: 68 65 6d 61 29 3b 0a 20 20 69 66 28 20 73 71 6c  hema);.  if( sql
c4b0: 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
c4c0: 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20  x, pParse, iDb, 
c4d0: 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20  "view", pName). 
c4e0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 78     && sqlite3Fix
c4f0: 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53  Select(&sFix, pS
c500: 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20 20  elect).  ){.    
c510: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
c520: 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ete(pSelect);.  
c530: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
c540: 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20   /* Make a copy 
c550: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45  of the entire SE
c560: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
c570: 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
c580: 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20  view..  ** This 
c590: 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74  will force all t
c5a0: 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20  he Expr.token.z 
c5b0: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e  values to be dyn
c5c0: 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c  amically.  ** al
c5d0: 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74  located rather t
c5e0: 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  han point to the
c5f0: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20   input string - 
c600: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
c610: 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20  .  ** they will 
c620: 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68  persist after th
c630: 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65  e current sqlite
c640: 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65  3_exec() call re
c650: 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d  turns..  */.  p-
c660: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
c670: 65 33 53 65 6c 65 63 74 44 75 70 28 70 53 65 6c  e3SelectDup(pSel
c680: 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ect);.  sqlite3S
c690: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
c6a0: 65 63 74 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ect);.  if( sqli
c6b0: 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 2d  te3ThreadData()-
c6c0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
c6d0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
c6e0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
c6f0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
c700: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 69 65 77  .    sqlite3View
c710: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
c720: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a  Parse, p);.  }..
c730: 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
c740: 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54  end of the CREAT
c750: 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
c760: 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69  .  Make sEnd poi
c770: 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65  nt to.  ** the e
c780: 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20  nd..  */.  sEnd 
c790: 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54  = pParse->sLastT
c7a0: 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64  oken;.  if( sEnd
c7b0: 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e 64  .z[0]!=0 && sEnd
c7c0: 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20  .z[0]!=';' ){.  
c7d0: 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64    sEnd.z += sEnd
c7e0: 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e  .n;.  }.  sEnd.n
c7f0: 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 73 45 6e 64   = 0;.  n = sEnd
c800: 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a  .z - pBegin->z;.
c810: 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73    z = (const uns
c820: 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 65 67  igned char*)pBeg
c830: 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
c840: 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d  n>0 && (z[n-1]==
c850: 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a  ';' || isspace(z
c860: 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20  [n-1])) ){ n--; 
c870: 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b  }.  sEnd.z = &z[
c880: 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d  n-1];.  sEnd.n =
c890: 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71   1;..  /* Use sq
c8a0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
c8b0: 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20  to add the view 
c8c0: 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  to the SQLITE_MA
c8d0: 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20  STER table */.  
c8e0: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
c8f0: 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64  pParse, 0, &sEnd
c900: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  , 0);.  return;.
c910: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
c920: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
c930: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c940: 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
c950: 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
c960: 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65  ure pTable is re
c970: 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69  ally a VIEW.  Fi
c980: 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20  ll in the names 
c990: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  of.** the column
c9a0: 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e  s of the view in
c9b0: 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75   the pTable stru
c9c0: 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74  cture.  Return t
c9d0: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
c9e0: 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65  errors.  If an e
c9f0: 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61  rror is seen lea
ca00: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
ca10: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
ca20: 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
ca30: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
ca40: 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a  umnNames(Parse *
ca50: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
ca60: 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20  Table){.  Table 
ca70: 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41  *pSelTab;   /* A
ca80: 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d   fake table from
ca90: 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74 68   which we get th
caa0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
cab0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
cac0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74      /* Copy of t
cad0: 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  he SELECT that i
cae0: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
caf0: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72  ew */.  int nErr
cb00: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d   = 0;     /* Num
cb10: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e  ber of errors en
cb20: 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69  countered */.  i
cb30: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
cb40: 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20   /* Temporarily 
cb50: 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72  holds the number
cb60: 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73 69   of cursors assi
cb70: 67 6e 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  gned */..  asser
cb80: 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20  t( pTable );..  
cb90: 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43  /* A positive nC
cba0: 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c  ol means the col
cbb0: 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74  umns names for t
cbc0: 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a  his view are.  *
cbd0: 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e  * already known.
cbe0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
cbf0: 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74  le->nCol>0 ) ret
cc00: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e  urn 0;..  /* A n
cc10: 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20  egative nCol is 
cc20: 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72  a special marker
cc30: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65   meaning that we
cc40: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20   are currently. 
cc50: 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f   ** trying to co
cc60: 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e  mpute the column
cc70: 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65   names.  If we e
cc80: 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  nter this routin
cc90: 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65  e with.  ** a ne
cca0: 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20  gative nCol, it 
ccb0: 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72  means two or mor
ccc0: 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c  e views form a l
ccd0: 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  oop, like this:.
cce0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52    **.  **     CR
ccf0: 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53  EATE VIEW one AS
cd00: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
cd10: 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  wo;.  **     CRE
cd20: 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20  ATE VIEW two AS 
cd30: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e  SELECT * FROM on
cd40: 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  e;.  **.  ** Act
cd50: 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f  ually, this erro
cd60: 72 20 69 73 20 63 61 75 67 68 74 20 70 72 65 76  r is caught prev
cd70: 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68  iously and so th
cd80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
cd90: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77  .  ** should alw
cda0: 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77  ays fail.  But w
cdb0: 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20  e will leave it 
cdc0: 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f  in place just to
cdd0: 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 23   be safe..  */.#
cde0: 69 66 20 30 0a 20 20 69 66 28 20 70 54 61 62 6c  if 0.  if( pTabl
cdf0: 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  e->nCol<0 ){.   
ce00: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
ce10: 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25  (pParse, "view %
ce20: 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20  s is circularly 
ce30: 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65  defined", pTable
ce40: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
ce50: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64  turn 1;.  }.#end
ce60: 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  if.  assert( pTa
ce70: 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a  ble->nCol>=0 );.
ce80: 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
ce90: 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
cea0: 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f  ns we need to co
ceb0: 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20  mpute the table 
cec0: 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65  names..  ** Note
ced0: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74   that the call t
cee0: 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  o sqlite3ResultS
cef0: 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c  etOfSelect() wil
cf00: 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a  l expand any.  *
cf10: 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69  * "*" elements i
cf20: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65  n the results se
cf30: 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e  t of the view an
cf40: 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75  d will assign cu
cf50: 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68  rsors.  ** to th
cf60: 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  e elements of th
cf70: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
cf80: 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61  But we do not wa
cf90: 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73  nt these changes
cfa0: 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d  .  ** to be perm
cfb0: 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63  anent.  So the c
cfc0: 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f  omputation is do
cfd0: 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20  ne on a copy of 
cfe0: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20  the SELECT.  ** 
cff0: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
d000: 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
d010: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
d020: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20  pTable->pSelect 
d030: 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69  );.  pSel = sqli
d040: 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 54 61  te3SelectDup(pTa
d050: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  ble->pSelect);. 
d060: 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20   if( pSel ){.   
d070: 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61   n = pParse->nTa
d080: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72  b;.    sqlite3Sr
d090: 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
d0a0: 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  rs(pParse, pSel-
d0b0: 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62  >pSrc);.    pTab
d0c0: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20  le->nCol = -1;. 
d0d0: 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
d0e0: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
d0f0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c  elect(pParse, 0,
d100: 20 70 53 65 6c 29 3b 0a 20 20 20 20 70 50 61 72   pSel);.    pPar
d110: 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20  se->nTab = n;.  
d120: 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b    if( pSelTab ){
d130: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d140: 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29  Table->aCol==0 )
d150: 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ;.      pTable->
d160: 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  nCol = pSelTab->
d170: 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61 62  nCol;.      pTab
d180: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54  le->aCol = pSelT
d190: 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->aCol;.      
d1a0: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
d1b0: 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  0;.      pSelTab
d1c0: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
d1d0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
d1e0: 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29  able(0, pSelTab)
d1f0: 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ;.      pTable->
d200: 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 20 7c  pSchema->flags |
d210: 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  = DB_UnresetView
d220: 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
d230: 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
d240: 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72   = 0;.      nErr
d250: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ++;.    }.    sq
d260: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
d270: 65 28 70 53 65 6c 29 3b 0a 20 20 7d 20 65 6c 73  e(pSel);.  } els
d280: 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  e {.    nErr++;.
d290: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72    }.  return nEr
d2a0: 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  r;  .}.#endif /*
d2b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
d2c0: 57 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  W */..#ifndef SQ
d2d0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
d2e0: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
d2f0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
d300: 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64   every VIEW in d
d310: 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a  atabase idx..*/.
d320: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
d330: 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73  teViewResetAll(s
d340: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
d350: 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  idx){.  HashElem
d360: 20 2a 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61   *i;.  if( !DbHa
d370: 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  sProperty(db, id
d380: 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
d390: 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ws) ) return;.  
d3a0: 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
d3b0: 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69  First(&db->aDb[i
d3c0: 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  dx].pSchema->tbl
d3d0: 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74  Hash); i;i=sqlit
d3e0: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
d3f0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
d400: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
d410: 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  i);.    if( pTab
d420: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
d430: 20 20 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f     sqliteResetCo
d440: 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b  lumnNames(pTab);
d450: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43  .    }.  }.  DbC
d460: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c  learProperty(db,
d470: 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
d480: 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a  Views);.}.#else.
d490: 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56  # define sqliteV
d4a0: 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29  iewResetAll(A,B)
d4b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
d4c0: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
d4d0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
d4e0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
d4f0: 20 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a   the VDBE to adj
d500: 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ust the internal
d510: 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20   schema.** used 
d520: 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74  by SQLite when t
d530: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d  he btree layer m
d540: 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f  oves a table roo
d550: 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72  t page. The.** r
d560: 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61  oot-page of a ta
d570: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20  ble or index in 
d580: 64 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73  database iDb has
d590: 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46   changed from iF
d5a0: 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a  rom.** to iTo..*
d5b0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
d5c0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
d5d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f  .void sqlite3Roo
d5e0: 74 50 61 67 65 4d 6f 76 65 64 28 44 62 20 2a 70  tPageMoved(Db *p
d5f0: 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  Db, int iFrom, i
d600: 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45  nt iTo){.  HashE
d610: 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61  lem *pElem;.  Ha
d620: 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 70 48  sh *pHash;..  pH
d630: 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68  ash = &pDb->pSch
d640: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20  ema->tblHash;.  
d650: 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
d660: 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29  HashFirst(pHash)
d670: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
d680: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
d690: 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  lem)){.    Table
d6a0: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
d6b0: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
d6c0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e      if( pTab->tn
d6d0: 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
d6e0: 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20     pTab->tnum = 
d6f0: 69 54 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  iTo;.      retur
d700: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  n;.    }.  }.  p
d710: 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63  Hash = &pDb->pSc
d720: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20  hema->idxHash;. 
d730: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
d740: 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68  eHashFirst(pHash
d750: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
d760: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
d770: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65  Elem)){.    Inde
d780: 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65  x *pIdx = sqlite
d790: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
d7a0: 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74  .    if( pIdx->t
d7b0: 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  num==iFrom ){.  
d7c0: 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d      pIdx->tnum =
d7d0: 20 69 54 6f 3b 0a 20 20 20 20 20 20 72 65 74 75   iTo;.      retu
d7e0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
d7f0: 61 73 73 65 72 74 28 30 29 3b 0a 7d 0a 23 65 6e  assert(0);.}.#en
d800: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
d810: 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74   code to erase t
d820: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
d830: 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66  ot-page iTable f
d840: 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44 62  rom database iDb
d850: 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20  ..** Also write 
d860: 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74  code to modify t
d870: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
d880: 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72   table and inter
d890: 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66  nal schema.** if
d8a0: 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20   a root-page of 
d8b0: 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
d8c0: 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
d8d0: 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74  ree-layer whilst
d8e0: 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62  .** erasing iTab
d8f0: 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  le (this can hap
d900: 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
d910: 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
d920: 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  )..*/ .static vo
d930: 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61  id destroyRootPa
d940: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
d950: 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
d960: 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
d970: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
d980: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  be(pParse);.  sq
d990: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d9a0: 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54  , OP_Destroy, iT
d9b0: 61 62 6c 65 2c 20 69 44 62 29 3b 0a 23 69 66 6e  able, iDb);.#ifn
d9c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d9d0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
d9e0: 4f 50 5f 44 65 73 74 72 6f 79 20 70 75 73 68 65  OP_Destroy pushe
d9f0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 6e 74  s an integer ont
da00: 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20  o the stack. If 
da10: 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a  this integer.  *
da20: 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  * is non-zero, t
da30: 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f  hen it is the ro
da40: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
da50: 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20  f a table moved 
da60: 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e  to.  ** location
da70: 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c   iTable. The fol
da80: 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69  lowing code modi
da90: 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f  fies the sqlite_
daa0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a  master table to.
dab0: 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69    ** reflect thi
dac0: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
dad0: 20 22 23 30 22 20 69 6e 20 74 68 65 20 53 51 4c   "#0" in the SQL
dae0: 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f   is a special co
daf0: 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e  nstant that mean
db00: 73 20 77 68 61 74 65 76 65 72 20 76 61 6c 75 65  s whatever value
db10: 0a 20 20 2a 2a 20 69 73 20 6f 6e 20 74 68 65 20  .  ** is on the 
db20: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
db30: 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 52 65  .  See sqlite3Re
db40: 67 69 73 74 65 72 45 78 70 72 28 29 2e 0a 20 20  gisterExpr()..  
db50: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74  */.  sqlite3Nest
db60: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
db70: 0a 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51  .     "UPDATE %Q
db80: 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65  .%s SET rootpage
db90: 3d 25 64 20 57 48 45 52 45 20 23 30 20 41 4e 44  =%d WHERE #0 AND
dba0: 20 72 6f 6f 74 70 61 67 65 3d 23 30 22 2c 0a 20   rootpage=#0",. 
dbb0: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
dbc0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
dbd0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
dbe0: 29 2c 20 69 54 61 62 6c 65 29 3b 0a 23 65 6e 64  ), iTable);.#end
dbf0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  if.}../*.** Writ
dc00: 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65  e VDBE code to e
dc10: 72 61 73 65 20 74 61 62 6c 65 20 70 54 61 62 20  rase table pTab 
dc20: 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74  and all associat
dc30: 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69  ed indices on di
dc40: 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75  sk..** Code to u
dc50: 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  pdate the sqlite
dc60: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 61  _master tables a
dc70: 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
dc80: 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a  ma definitions.*
dc90: 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74  * in case a root
dca0: 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20  -page belonging 
dcb0: 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  to another table
dcc0: 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65   is moved by the
dcd0: 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20   btree layer.** 
dce0: 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74  is also added (t
dcf0: 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
dd00: 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
dd10: 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
dd20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
dd30: 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20  troyTable(Parse 
dd40: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
dd50: 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20 53 51  pTab){.#ifdef SQ
dd60: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
dd70: 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49  CUUM.  Index *pI
dd80: 64 78 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f  dx;.  destroyRoo
dd90: 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 54  tPage(pParse, pT
dda0: 61 62 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e  ab->tnum, pTab->
ddb0: 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78  iDb);.  for(pIdx
ddc0: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
ddd0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
dde0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74  pNext){.    dest
ddf0: 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
de00: 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  se, pIdx->tnum, 
de10: 70 49 64 78 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a  pIdx->iDb);.  }.
de20: 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68  #else.  /* If th
de30: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62  e database may b
de40: 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61  e auto-vacuum ca
de50: 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45  pable (if SQLITE
de60: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
de70: 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66  .  ** is not def
de80: 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69  ined), then it i
de90: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63  s important to c
dea0: 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f  all OP_Destroy o
deb0: 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65  n the.  ** table
dec0: 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d   and index root-
ded0: 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20  pages in order, 
dee0: 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68  starting with th
def0: 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20  e numerically . 
df00: 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74   ** largest root
df10: 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68  -page number. Th
df20: 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  is guarantees th
df30: 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72  at none of the r
df40: 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74  oot-pages.  ** t
df50: 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 69  o be destroyed i
df60: 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61  s relocated by a
df70: 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73  n earlier OP_Des
df80: 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68  troy. i.e. if th
df90: 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  e.  ** following
dfa0: 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a   were coded:.  *
dfb0: 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f  *.  ** OP_Destro
dfc0: 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20  y 4 0.  ** .... 
dfd0: 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35   ** OP_Destroy 5
dfe0: 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64   0.  **.  ** and
dff0: 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70   root page 5 hap
e000: 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20  pened to be the 
e010: 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
e020: 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a  e number in the.
e030: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74    ** database, t
e040: 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20  hen root page 5 
e050: 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74  would be moved t
e060: 6f 20 70 61 67 65 20 34 20 62 79 20 74 68 65 20  o page 4 by the 
e070: 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f  .  ** "OP_Destro
e080: 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54  y 4 0" opcode. T
e090: 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f  he subsequent "O
e0a0: 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20 77  P_Destroy 5 0" w
e0b0: 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20  ould hit.  ** a 
e0c0: 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a  free-list page..
e0d0: 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20    */.  int iTab 
e0e0: 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20  = pTab->tnum;.  
e0f0: 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d  int iDestroyed =
e100: 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20   0;..  while( 1 
e110: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
e120: 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72  dx;.    int iLar
e130: 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69  gest = 0;..    i
e140: 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30  f( iDestroyed==0
e150: 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f   || iTab<iDestro
e160: 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61  yed ){.      iLa
e170: 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20  rgest = iTab;.  
e180: 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78    }.    for(pIdx
e190: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
e1a0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
e1b0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
e1c0: 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74  t iIdx = pIdx->t
e1d0: 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  num;.      asser
e1e0: 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61  t( pIdx->pSchema
e1f0: 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
e200: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44  );.      if( (iD
e210: 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28  estroyed==0 || (
e220: 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29  iIdx<iDestroyed)
e230: 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65  ) && iIdx>iLarge
e240: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c  st ){.        iL
e250: 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20  argest = iIdx;. 
e260: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e270: 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30   if( iLargest==0
e280: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
e290: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e2a0: 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
e2b0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
e2c0: 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
e2d0: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
e2e0: 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
e2f0: 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72  age(pParse, iLar
e300: 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20  gest, iDb);.    
e310: 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69    iDestroyed = i
e320: 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20  Largest;.    }. 
e330: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
e340: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e350: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  is called to do 
e360: 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52  the work of a DR
e370: 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  OP TABLE stateme
e380: 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20  nt..** pName is 
e390: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
e3a0: 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70  table to be drop
e3b0: 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ped..*/.void sql
e3c0: 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61  ite3DropTable(Pa
e3d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
e3e0: 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
e3f0: 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45   isView, int noE
e400: 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  rr){.  Table *pT
e410: 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ab;.  Vdbe *v;. 
e420: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
e430: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
e440: 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61   iDb;..  if( pPa
e450: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
e460: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
e470: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e480: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
e490: 74 61 62 6c 65 3b 0a 20 20 61 73 73 65 72 74 28  table;.  assert(
e4a0: 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
e4b0: 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  );.  pTab = sqli
e4c0: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
e4d0: 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  Parse, pName->a[
e4e0: 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  0].zName, pName-
e4f0: 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
e500: 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  ;..  if( pTab==0
e510: 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45 72   ){.    if( noEr
e520: 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
e530: 65 33 45 72 72 6f 72 43 6c 65 61 72 28 70 50 61  e3ErrorClear(pPa
e540: 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rse);.    }.    
e550: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
e560: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20  able;.  }.  iDb 
e570: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
e580: 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
e590: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73  >pSchema);.  ass
e5a0: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
e5b0: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69  Db<db->nDb );.#i
e5c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e5d0: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
e5e0: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
e5f0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
e600: 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
e610: 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
e620: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
e630: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
e640: 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
e650: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
e660: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
e670: 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
e680: 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  Db)){.      goto
e690: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
e6a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e6b0: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
e6c0: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
e6d0: 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
e6e0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
e6f0: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
e700: 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EW;.      }else{
e710: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
e720: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57  SQLITE_DROP_VIEW
e730: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
e740: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
e750: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
e760: 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
e770: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
e780: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ROP_TEMP_TABLE;.
e790: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e7a0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
e7b0: 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20  TE_DROP_TABLE;. 
e7c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e7d0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
e7e0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
e7f0: 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  de, pTab->zName,
e800: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
e810: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
e820: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
e830: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
e840: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
e850: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54  QLITE_DELETE, pT
e860: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  ab->zName, 0, zD
e870: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
e880: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
e890: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
e8a0: 69 66 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72  if.  if( pTab->r
e8b0: 65 61 64 4f 6e 6c 79 20 7c 7c 20 70 54 61 62 3d  eadOnly || pTab=
e8c0: 3d 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53  =db->aDb[iDb].pS
e8d0: 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 29  chema->pSeqTab )
e8e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
e8f0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
e900: 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20  able %s may not 
e910: 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61  be dropped", pTa
e920: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
e930: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
e940: 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  ble;.  }..#ifnde
e950: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
e960: 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 44  EW.  /* Ensure D
e970: 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f 74  ROP TABLE is not
e980: 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77 2c   used on a view,
e990: 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20 69   and DROP VIEW i
e9a0: 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20  s not used.  ** 
e9b0: 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  on a table..  */
e9c0: 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26  .  if( isView &&
e9d0: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
e9e0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
e9f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
ea00: 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45   "use DROP TABLE
ea10: 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65   to delete table
ea20: 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
ea30: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
ea40: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
ea50: 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  }.  if( !isView 
ea60: 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
ea70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
ea80: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
ea90: 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74  "use DROP VIEW t
eaa0: 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25 73  o delete view %s
eab0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
eac0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
ead0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23  rop_table;.  }.#
eae0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
eaf0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
eb00: 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66 72  ove the table fr
eb10: 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
eb20: 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b  ble.  ** on disk
eb30: 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
eb40: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
eb50: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
eb60: 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72      Trigger *pTr
eb70: 69 67 67 65 72 3b 0a 20 20 20 20 44 62 20 2a 70  igger;.    Db *p
eb80: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
eb90: 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  b];.    sqlite3B
eba0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
ebb0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
ebc0: 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70  b);..    /* Drop
ebd0: 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73   all triggers as
ebe0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
ebf0: 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
ec00: 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 20 20  opped. Code.    
ec10: 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ** is generated 
ec20: 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65  to remove entrie
ec30: 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61  s from sqlite_ma
ec40: 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20  ster and/or.    
ec50: 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  ** sqlite_temp_m
ec60: 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65  aster if require
ec70: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54  d..    */.    pT
ec80: 72 69 67 67 65 72 20 3d 20 70 54 61 62 2d 3e 70  rigger = pTab->p
ec90: 54 72 69 67 67 65 72 3b 0a 20 20 20 20 77 68 69  Trigger;.    whi
eca0: 6c 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a  le( pTrigger ){.
ecb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
ecc0: 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d  rigger->pSchema=
ecd0: 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c  =pTab->pSchema |
ece0: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 70 54 72  | .          pTr
ecf0: 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
ed00: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
ed10: 6d 61 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ma );.      sqli
ed20: 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74  te3DropTriggerPt
ed30: 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67  r(pParse, pTrigg
ed40: 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 54  er, 1);.      pT
ed50: 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65  rigger = pTrigge
ed60: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
ed70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ed80: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
ed90: 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  NT.    /* Remove
eda0: 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20   any entries of 
edb0: 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
edc0: 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69  nce table associ
edd0: 61 74 65 64 20 77 69 74 68 0a 20 20 20 20 2a 2a  ated with.    **
ede0: 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
edf0: 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69   dropped. This i
ee00: 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68  s done before th
ee10: 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70  e table is dropp
ee20: 65 64 0a 20 20 20 20 2a 2a 20 61 74 20 74 68 65  ed.    ** at the
ee30: 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e   btree level, in
ee40: 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65   case the sqlite
ee50: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
ee60: 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
ee70: 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74  move as a result
ee80: 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61   of the drop (ca
ee90: 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f  n happen in auto
eea0: 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20  -vacuum mode).. 
eeb0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
eec0: 61 62 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20  ab->autoInc ){. 
eed0: 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
eee0: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
eef0: 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20          "DELETE 
ef00: 46 52 4f 4d 20 25 73 2e 73 71 6c 69 74 65 5f 73  FROM %s.sqlite_s
ef10: 65 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61  equence WHERE na
ef20: 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20  me=%Q",.        
ef30: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62  pDb->zName, pTab
ef40: 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b  ->zName.      );
ef50: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
ef60: 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53     /* Drop all S
ef70: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
ef80: 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74  le and index ent
ef90: 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20  ries that refer 
efa0: 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 61  to the.    ** ta
efb0: 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d  ble. The program
efc0: 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f   name loops thro
efd0: 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20 74  ugh the master t
efe0: 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73  able and deletes
eff0: 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 6f  .    ** every ro
f000: 77 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  w that refers to
f010: 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20   a table of the 
f020: 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
f030: 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 20 20 2a   one being.    *
f040: 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67  * dropped. Trigg
f050: 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20  ers are handled 
f060: 73 65 70 65 72 61 74 65 6c 79 20 62 65 63 61 75  seperately becau
f070: 73 65 20 61 20 74 72 69 67 67 65 72 20 63 61 6e  se a trigger can
f080: 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74   be.    ** creat
f090: 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64  ed in the temp d
f0a0: 61 74 61 62 61 73 65 20 74 68 61 74 20 72 65 66  atabase that ref
f0b0: 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69  ers to a table i
f0c0: 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a  n another.    **
f0d0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a   database..    *
f0e0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
f0f0: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
f100: 20 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54   .        "DELET
f110: 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
f120: 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61  RE tbl_name=%Q a
f130: 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67 67 65  nd type!='trigge
f140: 72 27 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62  r'",.        pDb
f150: 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ->zName, SCHEMA_
f160: 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61 62  TABLE(iDb), pTab
f170: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ->zName);.    if
f180: 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20  ( !isView ){.   
f190: 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28     destroyTable(
f1a0: 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
f1b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d     }..    /* Rem
f1c0: 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e  ove the table en
f1d0: 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27  try from SQLite'
f1e0: 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  s internal schem
f1f0: 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20 20  a and modify.   
f200: 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63   ** the schema c
f210: 6f 6f 6b 69 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ookie..    */.  
f220: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
f230: 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65  (v, OP_DropTable
f240: 2c 20 69 44 62 2c 20 30 2c 20 70 54 61 62 2d 3e  , iDb, 0, pTab->
f250: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
f260: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
f270: 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a  ie(db, v, iDb);.
f280: 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77    }.  sqliteView
f290: 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62  ResetAll(db, iDb
f2a0: 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61  );..exit_drop_ta
f2b0: 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  ble:.  sqlite3Sr
f2c0: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d  cListDelete(pNam
f2d0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  e);.}../*.** Thi
f2e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
f2f0: 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
f300: 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  new foreign key 
f310: 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  on the table.** 
f320: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
f330: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70  construction.  p
f340: 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e  FromCol determin
f350: 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73  es which columns
f360: 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65  .** in the curre
f370: 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74  nt table point t
f380: 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  o the foreign ke
f390: 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d  y.  If pFromCol=
f3a0: 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65  =0 then.** conne
f3b0: 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68  ct the key to th
f3c0: 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e  e last column in
f3d0: 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20  serted.  pTo is 
f3e0: 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74  the name of.** t
f3f0: 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65  he table referre
f400: 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73  d to.  pToCol is
f410: 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65   a list of table
f420: 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a  s in the other.*
f430: 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61 74  * pTo table that
f440: 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
f450: 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61   points to.  fla
f460: 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  gs contains all.
f470: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** information a
f480: 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63  bout the conflic
f490: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
f4a0: 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65  orithms specifie
f4b0: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44  d.** in the ON D
f4c0: 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45  ELETE, ON UPDATE
f4d0: 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63   and ON INSERT c
f4e0: 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  lauses..**.** An
f4f0: 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20   FKey structure 
f500: 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61  is created and a
f510: 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
f520: 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75  e currently.** u
f530: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
f540: 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d  n in the pParse-
f550: 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64  >pNewTable field
f560: 2e 20 20 54 68 65 20 6e 65 77 20 46 4b 65 79 0a  .  The new FKey.
f570: 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65 64  ** is not linked
f580: 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65 79 20   into db->aFKey 
f590: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 2d 20  at this point - 
f5a0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 68 61  that does not ha
f5b0: 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73 71  ppen.** until sq
f5c0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e  lite3EndTable().
f5d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69  .**.** The forei
f5e0: 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f  gn key is set fo
f5f0: 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63  r IMMEDIATE proc
f600: 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65  essing.  A subse
f610: 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f  quent call.** to
f620: 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
f630: 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20  eignKey() might 
f640: 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44  change this to D
f650: 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64  EFERRED..*/.void
f660: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f   sqlite3CreateFo
f670: 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73  reignKey(.  Pars
f680: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
f690: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
f6a0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
f6b0: 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a  t *pFromCol,  /*
f6c0: 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73   Columns in this
f6d0: 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e   table that poin
f6e0: 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65  t to other table
f6f0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f   */.  Token *pTo
f700: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ,          /* Na
f710: 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  me of the other 
f720: 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
f730: 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20  ist *pToCol,    
f740: 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
f750: 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
f760: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
f770: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c          /* Confl
f780: 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
f790: 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b  lgorithms. */.){
f7a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f7b0: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
f7c0: 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d  .  FKey *pFKey =
f7d0: 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d   0;.  Table *p =
f7e0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
f7f0: 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  le;.  int nByte;
f800: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
f810: 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nCol;.  char *z;
f820: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21  ..  assert( pTo!
f830: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
f840: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
f850: 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
f860: 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
f870: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  0 ){.    int iCo
f880: 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  l = p->nCol-1;. 
f890: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
f8a0: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
f8b0: 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
f8c0: 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20  ToCol->nExpr!=1 
f8d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f8e0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f8f0: 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e   "foreign key on
f900: 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20   %s".         " 
f910: 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65  should reference
f920: 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e   only one column
f930: 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20   of table %T",. 
f940: 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b          p->aCol[
f950: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f  iCol].zName, pTo
f960: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  );.      goto fk
f970: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
f980: 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  nCol = 1;.  }els
f990: 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20  e if( pToCol && 
f9a0: 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70  pToCol->nExpr!=p
f9b0: 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29  FromCol->nExpr )
f9c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
f9d0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
f9e0: 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66        "number of
f9f0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65   columns in fore
fa00: 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ign key does not
fa10: 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65   match the numbe
fa20: 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22  r of ".        "
fa30: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
fa40: 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22  eferenced table"
fa50: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  );.    goto fk_e
fa60: 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  nd;.  }else{.   
fa70: 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c   nCol = pFromCol
fa80: 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e  ->nExpr;.  }.  n
fa90: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
faa0: 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a  FKey) + nCol*siz
fab0: 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  eof(pFKey->aCol[
fac0: 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31  0]) + pTo->n + 1
fad0: 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  ;.  if( pToCol )
fae0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
faf0: 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20  <pToCol->nExpr; 
fb00: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  i++){.      nByt
fb10: 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43  e += strlen(pToC
fb20: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20  ol->a[i].zName) 
fb30: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  + 1;.    }.  }. 
fb40: 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d   pFKey = sqliteM
fb50: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a  alloc( nByte );.
fb60: 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29    if( pFKey==0 )
fb70: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
fb80: 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70  pFKey->pFrom = p
fb90: 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  ;.  pFKey->pNext
fba0: 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b  From = p->pFKey;
fbb0: 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70  .  z = (char*)&p
fbc0: 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79  FKey[1];.  pFKey
fbd0: 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75 63 74  ->aCol = (struct
fbe0: 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a   sColMap*)z;.  z
fbf0: 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63   += sizeof(struc
fc00: 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b  t sColMap)*nCol;
fc10: 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20  .  pFKey->zTo = 
fc20: 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70  z;.  memcpy(z, p
fc30: 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a  To->z, pTo->n);.
fc40: 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b    z[pTo->n] = 0;
fc50: 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31  .  z += pTo->n+1
fc60: 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  ;.  pFKey->pNext
fc70: 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d  To = 0;.  pFKey-
fc80: 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  >nCol = nCol;.  
fc90: 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
fca0: 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  ){.    pFKey->aC
fcb0: 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d  ol[0].iFrom = p-
fcc0: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65  >nCol-1;.  }else
fcd0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
fce0: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
fcf0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
fd00: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43  for(j=0; j<p->nC
fd10: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
fd20: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
fd30: 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ICmp(p->aCol[j].
fd40: 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d  zName, pFromCol-
fd50: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
fd60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b  ){.          pFK
fd70: 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f  ey->aCol[i].iFro
fd80: 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  m = j;.         
fd90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
fda0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
fdb0: 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29  if( j>=p->nCol )
fdc0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
fdd0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
fde0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e  , .          "un
fdf0: 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25  known column \"%
fe00: 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  s\" in foreign k
fe10: 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20  ey definition", 
fe20: 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d  .          pFrom
fe30: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
fe40: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
fe50: 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  k_end;.      }. 
fe60: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
fe70: 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
fe80: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
fe90: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  +){.      int n 
fea0: 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d  = strlen(pToCol-
feb0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
fec0: 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
fed0: 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20  i].zCol = z;.   
fee0: 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f     memcpy(z, pTo
fef0: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  Col->a[i].zName,
ff00: 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20   n);.      z[n] 
ff10: 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  = 0;.      z += 
ff20: 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n+1;.    }.  }. 
ff30: 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
ff40: 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d  ed = 0;.  pFKey-
ff50: 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c  >deleteConf = fl
ff60: 61 67 73 20 26 20 30 78 66 66 3b 0a 20 20 70 46  ags & 0xff;.  pF
ff70: 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20  Key->updateConf 
ff80: 3d 20 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20  = (flags >> 8 ) 
ff90: 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d  & 0xff;.  pFKey-
ffa0: 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 66  >insertConf = (f
ffb0: 6c 61 67 73 20 3e 3e 20 31 36 20 29 20 26 20 30  lags >> 16 ) & 0
ffc0: 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  xff;..  /* Link 
ffd0: 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
ffe0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20  to the table as 
fff0: 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20  the last step.. 
10000 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d   */.  p->pFKey =
10010 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20   pFKey;.  pFKey 
10020 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20  = 0;..fk_end:.  
10030 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79  sqliteFree(pFKey
10040 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  );.#endif /* !de
10050 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10060 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a  T_FOREIGN_KEY) *
10070 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  /.  sqlite3ExprL
10080 69 73 74 44 65 6c 65 74 65 28 70 46 72 6f 6d 43  istDelete(pFromC
10090 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ol);.  sqlite3Ex
100a0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 54 6f  prListDelete(pTo
100b0 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Col);.}../*.** T
100c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
100d0 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e  alled when an IN
100e0 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
100f0 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44  E or INITIALLY D
10100 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73  EFERRED.** claus
10110 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61 72  e is seen as par
10120 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b  t of a foreign k
10130 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20  ey definition.  
10140 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a  The isDeferred.*
10150 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 31  * parameter is 1
10160 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44   for INITIALLY D
10170 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f  EFERRED and 0 fo
10180 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  r INITIALLY IMME
10190 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65  DIATE..** The be
101a0 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f  havior of the mo
101b0 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61  st recently crea
101c0 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ted foreign key 
101d0 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61  is adjusted.** a
101e0 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76  ccordingly..*/.v
101f0 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 65 72  oid sqlite3Defer
10200 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65  ForeignKey(Parse
10210 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73   *pParse, int is
10220 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64  Deferred){.#ifnd
10230 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
10240 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62  OREIGN_KEY.  Tab
10250 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79  le *pTab;.  FKey
10260 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28   *pFKey;.  if( (
10270 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
10280 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20  NewTable)==0 || 
10290 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70  (pFKey = pTab->p
102a0 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72  FKey)==0 ) retur
102b0 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65  n;.  pFKey->isDe
102c0 66 65 72 72 65 64 20 3d 20 69 73 44 65 66 65 72  ferred = isDefer
102d0 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  red;.#endif.}../
102e0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
102f0 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61  de that will era
10300 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e  se and refill in
10310 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73  dex *pIdx.  This
10320 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69   is.** used to i
10330 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c  nitialize a newl
10340 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78 20  y created index 
10350 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20  or to recompute 
10360 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
10370 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65  f an index in re
10380 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e  sponse to a REIN
10390 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  DEX command..**.
103a0 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67  ** if memRootPag
103b0 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76  e is not negativ
103c0 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
103d0 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65   the index is ne
103e0 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20  wly.** created. 
103f0 20 54 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   The memory cell
10400 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65   specified by me
10410 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69  mRootPage contai
10420 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  ns the.** root p
10430 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
10440 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d  e index.  If mem
10450 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61  RootPage is nega
10460 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tive, then.** th
10470 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
10480 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20  exists and must 
10490 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
104a0 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64  e being refilled
104b0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74   and.** the root
104c0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
104d0 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b  the index is tak
104e0 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e  en from pIndex->
104f0 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tnum..*/.static 
10500 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69  void sqlite3Refi
10510 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  llIndex(Parse *p
10520 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
10530 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f  ndex, int memRoo
10540 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20  tPage){.  Table 
10550 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
10560 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20  pTable;  /* The 
10570 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e  table that is in
10580 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  dexed */.  int i
10590 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
105a0 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 42 74 72  ab;       /* Btr
105b0 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
105c0 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  or pTab */.  int
105d0 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e   iIdx = pParse->
105e0 6e 54 61 62 2b 31 3b 20 20 20 20 20 2f 2a 20 42  nTab+1;     /* B
105f0 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
10600 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20   for pIndex */. 
10610 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
10620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10630 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f  /* Address of to
10640 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  p of loop */.  i
10650 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  nt tnum;        
10660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10670 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e   Root page of in
10680 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  dex */.  Vdbe *v
10690 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
106a0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
106b0 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
106c0 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
106d0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20  ne */.  int iDb 
106e0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
106f0 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
10700 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  b, pIndex->pSche
10710 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ma);..#ifndef SQ
10720 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
10730 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71  IZATION.  if( sq
10740 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
10750 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45  Parse, SQLITE_RE
10760 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a  INDEX, pIndex->z
10770 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 70  Name, 0,.      p
10780 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
10790 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20  Db].zName ) ){. 
107a0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
107b0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75  endif..  /* Ensu
107c0 72 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  re all the requi
107d0 72 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  red collation se
107e0 71 75 65 6e 63 65 73 20 61 72 65 20 61 76 61 69  quences are avai
107f0 6c 61 62 6c 65 2e 20 54 68 69 73 0a 20 20 2a 2a  lable. This.  **
10800 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e   routine will in
10810 76 6f 6b 65 20 74 68 65 20 63 6f 6c 6c 61 74 69  voke the collati
10820 6f 6e 2d 6e 65 65 64 65 64 20 63 61 6c 6c 62 61  on-needed callba
10830 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  ck if necessary 
10840 28 61 6e 64 0a 20 20 2a 2a 20 69 66 20 6f 6e 65  (and.  ** if one
10850 20 68 61 73 20 62 65 65 6e 20 72 65 67 69 73 74   has been regist
10860 65 72 65 64 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  ered)..  */.  if
10870 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 49 6e  ( sqlite3CheckIn
10880 64 65 78 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  dexCollSeq(pPars
10890 65 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  e, pIndex) ){.  
108a0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
108b0 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77 72   /* Require a wr
108c0 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
108d0 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d  table to perform
108e0 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
108f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  */.  sqlite3Tabl
10900 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
10910 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31  b, pTab->tnum, 1
10920 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
10930 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
10940 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
10950 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
10960 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f  rn;.  if( memRoo
10970 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  tPage>=0 ){.    
10980 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10990 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
109a0 6d 65 6d 52 6f 6f 74 50 61 67 65 2c 20 30 29 3b  memRootPage, 0);
109b0 0a 20 20 20 20 74 6e 75 6d 20 3d 20 30 3b 0a 20  .    tnum = 0;. 
109c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d   }else{.    tnum
109d0 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b   = pIndex->tnum;
109e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
109f0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 65 61  AddOp(v, OP_Clea
10a00 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  r, tnum, iDb);. 
10a10 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
10a20 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
10a30 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  ger, iDb, 0);.  
10a40 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
10a50 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
10a60 69 49 64 78 2c 20 74 6e 75 6d 2c 0a 20 20 20 20  iIdx, tnum,.    
10a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a80 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e  (char*)&pIndex->
10a90 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49  keyInfo, P3_KEYI
10aa0 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  NFO);.  sqlite3O
10ab0 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
10ac0 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62   iTab, iDb, pTab
10ad0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
10ae0 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
10af0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10b00 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30  _Rewind, iTab, 0
10b10 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65  );.  sqlite3Gene
10b20 72 61 74 65 49 6e 64 65 78 4b 65 79 28 76 2c 20  rateIndexKey(v, 
10b30 70 49 6e 64 65 78 2c 20 69 54 61 62 29 3b 0a 20  pIndex, iTab);. 
10b40 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45   if( pIndex->onE
10b50 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b  rror!=OE_None ){
10b60 0a 20 20 20 20 69 6e 74 20 63 75 72 61 64 64 72  .    int curaddr
10b70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
10b80 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
10b90 20 20 69 6e 74 20 61 64 64 72 32 20 3d 20 63 75    int addr2 = cu
10ba0 72 61 64 64 72 2b 34 3b 0a 20 20 20 20 73 71 6c  raddr+4;.    sql
10bb0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
10bc0 28 76 2c 20 63 75 72 61 64 64 72 2d 31 2c 20 61  (v, curaddr-1, a
10bd0 64 64 72 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddr2);.    sqlit
10be0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10bf0 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 30  P_Rowid, iTab, 0
10c00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
10c10 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64  beAddOp(v, OP_Ad
10c20 64 49 6d 6d 2c 20 31 2c 20 30 29 3b 0a 20 20 20  dImm, 1, 0);.   
10c30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10c40 70 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71 75 65  p(v, OP_IsUnique
10c50 2c 20 69 49 64 78 2c 20 61 64 64 72 32 29 3b 0a  , iIdx, addr2);.
10c60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
10c70 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53  p3(v, OP_Halt, S
10c80 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
10c90 2c 20 4f 45 5f 41 62 6f 72 74 2c 0a 20 20 20 20  , OE_Abort,.    
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cb0 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73  "indexed columns
10cc0 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22   are not unique"
10cd0 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
10ce0 20 20 61 73 73 65 72 74 28 20 61 64 64 72 32 3d    assert( addr2=
10cf0 3d 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72  =sqlite3VdbeCurr
10d00 65 6e 74 41 64 64 72 28 76 29 20 29 3b 0a 20 20  entAddr(v) );.  
10d10 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
10d20 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e  ddOp(v, OP_IdxIn
10d30 73 65 72 74 2c 20 69 49 64 78 2c 20 30 29 3b 0a  sert, iIdx, 0);.
10d40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10d50 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  Op(v, OP_Next, i
10d60 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20  Tab, addr1+1);. 
10d70 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
10d80 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
10d90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10da0 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
10db0 69 54 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69  iTab, 0);.  sqli
10dc0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10dd0 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20  OP_Close, iIdx, 
10de0 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  0);.}../*.** Cre
10df0 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20  ate a new index 
10e00 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65  for an SQL table
10e10 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32  .  pName1.pName2
10e20 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
10e30 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e  the index .** an
10e40 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68  d pTblList is th
10e50 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
10e60 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
10e70 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68  e indexed.  Both
10e80 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c   will .** be NUL
10e90 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20  L for a primary 
10ea0 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  key or an index 
10eb0 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
10ec0 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20  to satisfy a.** 
10ed0 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
10ee0 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e  t.  If pTable an
10ef0 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c  d pIndex are NUL
10f00 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70  L, use pParse->p
10f10 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74  NewTable.** as t
10f20 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
10f30 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d  ndexed.  pParse-
10f40 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20  >pNewTable is a 
10f50 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a  table that is.**
10f60 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
10f70 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
10f80 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
10f90 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
10fa0 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
10fb0 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
10fc0 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74   indexed.  pList
10fd0 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66   will be NULL if
10fe0 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72   this.** is a pr
10ff0 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69  imary key or uni
11000 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f  que-constraint o
11010 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
11020 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a  t column added.*
11030 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  * to the table c
11040 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
11050 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a  onstruction.  .*
11060 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
11070 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72  eateIndex(.  Par
11080 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
11090 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  /* All informati
110a0 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61  on about this pa
110b0 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  rse */.  Token *
110c0 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46  pName1,     /* F
110d0 69 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64  irst part of ind
110e0 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20  ex name. May be 
110f0 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
11100 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
11110 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69  Second part of i
11120 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
11130 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c  e NULL */.  SrcL
11140 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f  ist *pTblName, /
11150 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78  * Table to index
11160 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  . Use pParse->pN
11170 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a  ewTable if 0 */.
11180 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
11190 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  t,   /* A list o
111a0 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
111b0 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
111c0 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20   onError,       
111d0 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f  /* OE_Abort, OE_
111e0 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61  Ignore, OE_Repla
111f0 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a  ce, or OE_None *
11200 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  /.  Token *pStar
11210 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52  t,     /* The CR
11220 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
11230 62 65 67 69 6e 73 20 61 20 43 52 45 41 54 45 20  begins a CREATE 
11240 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
11250 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
11260 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  ,       /* The "
11270 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74  )" that closes t
11280 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  he CREATE INDEX 
11290 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
112a0 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20  nt sortOrder,   
112b0 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20    /* Sort order 
112c0 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77  of primary key w
112d0 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20  hen pList==NULL 
112e0 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78  */.  int ifNotEx
112f0 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20  ist     /* Omit 
11300 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61  error if index a
11310 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
11320 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
11330 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61  b = 0;     /* Ta
11340 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
11350 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
11360 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54  ndex = 0;   /* T
11370 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
11380 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
11390 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *zName = 0;    
113a0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
113b0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e  index */.  int n
113c0 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
113d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
113e0 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65  racters in zName
113f0 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   */.  int i, j;.
11400 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20    Token nullId; 
11410 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74         /* Fake t
11420 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74  oken for an empt
11430 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44  y ID list */.  D
11440 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20  bFixer sFix;    
11450 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67      /* For assig
11460 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61  ning database na
11470 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f  mes to pTable */
11480 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
11490 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20  Mask;   /* 1 to 
114a0 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e  honor DESC in in
114b0 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72  dex.  0 to ignor
114c0 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  e. */.  sqlite3 
114d0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
114e0 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  ;.  Db *pDb;    
114f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11500 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20 63  specific table c
11510 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e  ontaining the in
11520 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20 2a  dexed database *
11530 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
11540 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
11550 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
11560 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  e that is being 
11570 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b  written */.  Tok
11580 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20  en *pName = 0;  
11590 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
115a0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
115b0 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  ex to create */.
115c0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
115d0 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65  t_item *pListIte
115e0 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  m; /* For loopin
115f0 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a  g over pList */.
11600 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
11610 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 54 68  Err || sqlite3Th
11620 72 65 61 64 44 61 74 61 28 29 2d 3e 6d 61 6c 6c  readData()->mall
11630 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
11640 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
11650 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
11660 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
11670 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
11680 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65   be indexed.  Re
11690 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f  turn early if no
116a0 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
116b0 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
116c0 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74  ){..    /* Use t
116d0 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65  he two-part inde
116e0 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  x name to determ
116f0 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ine the database
11700 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72   .    ** to sear
11710 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ch for the table
11720 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c  . 'Fix' the tabl
11730 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64  e name to this d
11740 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  b.    ** before 
11750 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74  looking up the t
11760 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
11770 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20   assert( pName1 
11780 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20  && pName2 );.   
11790 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
117a0 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
117b0 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
117c0 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
117d0 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20  f( iDb<0 ) goto 
117e0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
117f0 78 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  x;..#ifndef SQLI
11800 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20  TE_OMIT_TEMPDB. 
11810 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
11820 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75  ex name was unqu
11830 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69  alified, check i
11840 66 20 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a  f the the table.
11850 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70      ** is a temp
11860 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73   table. If so, s
11870 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
11880 74 6f 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  to 1..    */.   
11890 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53   pTab = sqlite3S
118a0 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61  rcListLookup(pPa
118b0 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a  rse, pTblName);.
118c0 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26      if( pName2 &
118d0 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26  & pName2->n==0 &
118e0 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e  & pTab && pTab->
118f0 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62  pSchema==db->aDb
11900 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20  [1].pSchema ){. 
11910 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20       iDb = 1;.  
11920 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
11930 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e  if( sqlite3FixIn
11940 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
11950 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20  , iDb, "index", 
11960 70 4e 61 6d 65 29 20 26 26 0a 20 20 20 20 20 20  pName) &&.      
11970 20 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c    sqlite3FixSrcL
11980 69 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e  ist(&sFix, pTblN
11990 61 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ame).    ){.    
119a0 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65    /* Because the
119b0 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63   parser construc
119c0 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d  ts pTblName from
119d0 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69   a single identi
119e0 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73  fier,.      ** s
119f0 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
11a00 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e   can never fail.
11a10 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
11a20 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  (0);.    }.    p
11a30 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
11a40 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
11a50 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e   pTblName->a[0].
11a60 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
11a70 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  pTblName->a[0].z
11a80 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69  Database);.    i
11a90 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20  f( !pTab ) goto 
11aa0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
11ab0 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  x;.    assert( d
11ac0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
11ad0 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
11ae0 6d 61 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ma );.  }else{. 
11af0 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
11b00 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20  ==0 );.    pTab 
11b10 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
11b20 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54  ble;.    if( !pT
11b30 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  ab ) goto exit_c
11b40 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
11b50 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
11b60 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
11b70 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
11b80 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d    }.  pDb = &db-
11b90 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 69 66  >aDb[iDb];..  if
11ba0 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61  ( pTab==0 || pPa
11bb0 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
11bc0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
11bd0 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  ex;.  if( pTab->
11be0 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
11bf0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
11c00 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
11c10 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
11c20 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  exed", pTab->zNa
11c30 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
11c40 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
11c50 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
11c60 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
11c70 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
11c80 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
11c90 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11ca0 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20   "views may not 
11cb0 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
11cc0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
11cd0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
11ce0 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ndif..  /*.  ** 
11cf0 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
11d00 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
11d10 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
11d20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
11d30 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
11d40 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
11d50 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
11d60 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
11d70 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
11d80 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
11d90 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
11da0 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
11db0 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
11dc0 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
11dd0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
11de0 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
11df0 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
11e00 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
11e10 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
11e20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
11e30 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
11e40 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
11e50 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
11e60 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
11e70 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  ss this index.. 
11e80 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d   **.  ** If pNam
11e90 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
11ea0 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  at we are.  ** d
11eb0 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72  ealing with a pr
11ec0 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49  imary key or UNI
11ed0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
11ee0 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65   We have to inve
11ef0 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20  nt our.  ** own 
11f00 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
11f10 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
11f20 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
11f30 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
11f40 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
11f50 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
11f60 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
11f70 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
11f80 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
11f90 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
11fa0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
11fb0 64 65 78 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  dex;.    if( SQL
11fc0 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43  ITE_OK!=sqlite3C
11fd0 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70  heckObjectName(p
11fe0 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  Parse, zName) ){
11ff0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
12000 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
12010 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62     }.    if( !db
12020 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
12030 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
12040 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
12050 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20  chema(pParse) ) 
12060 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12070 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 66  _index;.      if
12080 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  ( sqlite3FindInd
12090 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44  ex(db, zName, pD
120a0 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  b->zName)!=0 ){.
120b0 20 20 20 20 20 20 20 20 69 66 28 20 21 69 66 4e          if( !ifN
120c0 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20  otExist ){.     
120d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
120e0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
120f0 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65  dex %s already e
12100 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  xists", zName);.
12110 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12120 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
12130 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
12140 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  }.      if( sqli
12150 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
12160 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b   zName, 0)!=0 ){
12170 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12180 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
12190 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
121a0 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64  dy a table named
121b0 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
121c0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
121d0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
121e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
121f0 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  lse{.    char zB
12200 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20  uf[30];.    int 
12210 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c  n;.    Index *pL
12220 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  oop;.    for(pLo
12230 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c  op=pTab->pIndex,
12240 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f   n=1; pLoop; pLo
12250 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c  op=pLoop->pNext,
12260 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69   n++){}.    spri
12270 6e 74 66 28 7a 42 75 66 2c 22 5f 25 64 22 2c 6e  ntf(zBuf,"_%d",n
12280 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30  );.    zName = 0
12290 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
122a0 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22  String(&zName, "
122b0 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78  sqlite_autoindex
122c0 5f 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  _", pTab->zName,
122d0 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29   zBuf, (char*)0)
122e0 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
122f0 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
12300 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
12310 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
12320 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
12330 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65  o create an inde
12340 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  x..  */.#ifndef 
12350 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
12360 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
12370 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
12380 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a  b = pDb->zName;.
12390 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
123a0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
123b0 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
123c0 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
123d0 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  ), 0, zDb) ){.  
123e0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
123f0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
12400 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45  }.    i = SQLITE
12410 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20  _CREATE_INDEX;. 
12420 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
12430 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20  PDB && iDb==1 ) 
12440 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
12450 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  E_TEMP_INDEX;.  
12460 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
12470 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69  hCheck(pParse, i
12480 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  , zName, pTab->z
12490 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
124a0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
124b0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
124c0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
124d0 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20  /* If pList==0, 
124e0 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f  it means this ro
124f0 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
12500 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61   to make a prima
12510 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20  ry.  ** key out 
12520 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  of the last colu
12530 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  mn added to the 
12540 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
12550 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
12560 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
12570 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
12580 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
12590 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
125a0 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 28 75 38    nullId.z = (u8
125b0 2a 29 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61  *)pTab->aCol[pTa
125c0 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65  b->nCol-1].zName
125d0 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d  ;.    nullId.n =
125e0 20 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 6e   strlen((char*)n
125f0 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c  ullId.z);.    pL
12600 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
12610 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 30  rListAppend(0, 0
12620 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20  , &nullId);.    
12630 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67  if( pList==0 ) g
12640 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12650 69 6e 64 65 78 3b 0a 20 20 20 20 70 4c 69 73 74  index;.    pList
12660 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
12670 20 3d 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20   = sortOrder;.  
12680 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c  }..  /* .  ** Al
12690 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
126a0 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a   structure. .  *
126b0 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c  /.  nName = strl
126c0 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e  en(zName);.  pIn
126d0 64 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  dex = sqliteMall
126e0 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78  oc( sizeof(Index
126f0 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 32 20 2b 20  ) + nName + 2 + 
12700 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 0a 20 20  sizeof(int) +.  
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12720 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 69 6e        (sizeof(in
12730 74 29 2a 32 20 2b 20 73 69 7a 65 6f 66 28 43 6f  t)*2 + sizeof(Co
12740 6c 6c 53 65 71 2a 29 20 2b 20 31 29 2a 70 4c 69  llSeq*) + 1)*pLi
12750 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 69  st->nExpr );.  i
12760 66 28 20 73 71 6c 69 74 65 33 54 68 72 65 61 64  f( sqlite3Thread
12770 44 61 74 61 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61  Data()->mallocFa
12780 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74  iled ) goto exit
12790 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
127a0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
127b0 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64 65  n = (int*)&pInde
127c0 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
127d0 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a  [pList->nExpr];.
127e0 20 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45    pIndex->aiRowE
127f0 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 2a 29  st = (unsigned*)
12800 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  &pIndex->aiColum
12810 6e 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b  n[pList->nExpr];
12820 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
12830 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65   = (char*)&pInde
12840 78 2d 3e 61 69 52 6f 77 45 73 74 5b 70 4c 69 73  x->aiRowEst[pLis
12850 74 2d 3e 6e 45 78 70 72 2b 31 5d 3b 0a 20 20 70  t->nExpr+1];.  p
12860 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
12870 53 6f 72 74 4f 72 64 65 72 20 3d 20 26 70 49 6e  SortOrder = &pIn
12880 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65  dex->zName[nName
12890 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 49  +1];.  strcpy(pI
128a0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  ndex->zName, zNa
128b0 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70  me);.  pIndex->p
128c0 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20  Table = pTab;.  
128d0 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
128e0 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
128f0 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f    pIndex->onErro
12900 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 70  r = onError;.  p
12910 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78  Index->autoIndex
12920 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70   = pName==0;.  p
12930 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d  Index->pSchema =
12940 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
12950 63 68 65 6d 61 3b 0a 0a 20 20 2f 2a 20 43 68 65  chema;..  /* Che
12960 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
12970 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53  should honor DES
12980 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e  C requests on in
12990 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f  dex columns.  */
129a0 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68  .  if( pDb->pSch
129b0 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74  ema->file_format
129c0 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f  >=4 ){.    sortO
129d0 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20  rderMask = -1;  
129e0 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a   /* Honor DESC *
129f0 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  /.  }else{.    s
12a00 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30  ortOrderMask = 0
12a10 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44  ;    /* Ignore D
12a20 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  ESC */.  }..  /*
12a30 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20   Scan the names 
12a40 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  of the columns o
12a50 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
12a60 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20  e indexed and.  
12a70 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75  ** load the colu
12a80 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20  mn indices into 
12a90 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74  the Index struct
12aa0 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20  ure.  Report an 
12ab0 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e  error.  ** if an
12ac0 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20  y column is not 
12ad0 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f  found..  */.  fo
12ae0 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d  r(i=0, pListItem
12af0 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69  =pList->a; i<pLi
12b00 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
12b10 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20  pListItem++){.  
12b20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
12b30 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49 74  olName = pListIt
12b40 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 43  em->zName;.    C
12b50 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a  olumn *pTabCol;.
12b60 20 20 20 20 69 6e 74 20 72 65 71 75 65 73 74 65      int requeste
12b70 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  dSortOrder;.    
12b80 66 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c  for(j=0, pTabCol
12b90 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70  =pTab->aCol; j<p
12ba0 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20  Tab->nCol; j++, 
12bb0 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  pTabCol++){.    
12bc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
12bd0 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70  ICmp(zColName, p
12be0 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d  TabCol->zName)==
12bf0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
12c00 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62  .    if( j>=pTab
12c10 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
12c20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12c30 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
12c40 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20  s has no column 
12c50 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20  named %s",.     
12c60 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20     pTab->zName, 
12c70 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zColName);.     
12c80 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
12c90 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
12ca0 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
12cb0 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20  umn[i] = j;.    
12cc0 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  if( pListItem->p
12cd0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 61 73  Expr ){.      as
12ce0 73 65 72 74 28 20 70 4c 69 73 74 49 74 65 6d 2d  sert( pListItem-
12cf0 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b  >pExpr->pColl );
12d00 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b  .      pIndex->k
12d10 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20  eyInfo.aColl[i] 
12d20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  = pListItem->pEx
12d30 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d  pr->pColl;.    }
12d40 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 64  else{.      pInd
12d50 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  ex->keyInfo.aCol
12d60 6c 5b 69 5d 20 3d 20 70 54 61 62 2d 3e 61 43 6f  l[i] = pTab->aCo
12d70 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20  l[j].pColl;.    
12d80 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  }.    assert( pI
12d90 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  ndex->keyInfo.aC
12da0 6f 6c 6c 5b 69 5d 20 29 3b 0a 20 20 20 20 69 66  oll[i] );.    if
12db0 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
12dc0 20 26 26 20 0a 20 20 20 20 20 20 20 20 73 71 6c   && .        sql
12dd0 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71  ite3CheckCollSeq
12de0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d  (pParse, pIndex-
12df0 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69  >keyInfo.aColl[i
12e00 5d 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ]) .    ){.     
12e10 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
12e20 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
12e30 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72 74     requestedSort
12e40 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65  Order = pListIte
12e50 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73  m->sortOrder & s
12e60 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20  ortOrderMask;.  
12e70 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66    pIndex->keyInf
12e80 6f 2e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  o.aSortOrder[i] 
12e90 3d 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  = requestedSortO
12ea0 72 64 65 72 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  rder;.  }.  pInd
12eb0 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69 65  ex->keyInfo.nFie
12ec0 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ld = pList->nExp
12ed0 72 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61  r;.  sqlite3Defa
12ee0 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78  ultRowEst(pIndex
12ef0 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  );..  if( pTab==
12f00 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
12f10 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
12f20 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65   routine has bee
12f30 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  n called to crea
12f40 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  te an automatic 
12f50 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a  index as a.    *
12f60 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52  * result of a PR
12f70 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
12f80 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20  QUE clause on a 
12f90 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
12fa0 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50  n, or.    ** a P
12fb0 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
12fc0 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c  IQUE clause foll
12fd0 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e  owing the column
12fe0 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20   definitions..  
12ff0 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66    ** i.e. one of
13000 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
13010 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
13020 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29   PRIMARY KEY, y)
13030 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20  ;.    ** CREATE 
13040 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e  TABLE t(x, y, UN
13050 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20  IQUE(x, y));.   
13060 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65   **.    ** Eithe
13070 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20  r way, check to 
13080 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c 65  see if the table
13090 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75 63   already has suc
130a0 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20  h an index. If. 
130b0 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20     ** so, don't 
130c0 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67 20  bother creating 
130d0 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f  this one. This o
130e0 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20  nly applies to. 
130f0 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61     ** automatica
13100 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 69  lly created indi
13110 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64  ces. Users can d
13120 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20 77  o as they wish w
13130 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69  ith.    ** expli
13140 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20  cit indices..   
13150 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
13160 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
13170 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
13180 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
13190 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
131a0 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  nt k;.      asse
131b0 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  rt( pIdx->onErro
131c0 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20  r!=OE_None );.  
131d0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
131e0 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20  ->autoIndex );. 
131f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
13200 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  dex->onError!=OE
13210 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20  _None );..      
13220 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  if( pIdx->nColum
13230 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  n!=pIndex->nColu
13240 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
13250 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
13260 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b  pIdx->nColumn; k
13270 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
13280 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
13290 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f  k]!=pIndex->aiCo
132a0 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b  lumn[k] ) break;
132b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
132c0 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
132d0 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b 65 79  [k]!=pIndex->key
132e0 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20 29 20  Info.aColl[k] ) 
132f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69  break;.        i
13300 66 28 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f  f( pIdx->keyInfo
13310 2e 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 21 3d  .aSortOrder[k]!=
13320 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
13330 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 20 29 20  aSortOrder[k] ) 
13340 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
13350 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78       if( k==pIdx
13360 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
13370 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
13380 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e  nError!=pIndex->
13390 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  onError ){.     
133a0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
133b0 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 20  straint creates 
133c0 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61  the same index a
133d0 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  s a previous.   
133e0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
133f0 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 73  aint specified s
13400 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20  omewhere in the 
13410 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
13420 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20  tement..        
13430 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65    ** However the
13440 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
13450 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72 65  uses are differe
13460 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73  nt. If both this
13470 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63   .          ** c
13480 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
13490 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 76  e previous equiv
134a0 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74  alent constraint
134b0 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20   have explicit. 
134c0 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43           ** ON C
134d0 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
134e0 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  this is an error
134f0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65  . Otherwise, use
13500 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
13510 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  * explicitly spe
13520 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 75 72  cified behaviour
13530 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a   for the index..
13540 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
13550 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49 64         if( !(pId
13560 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
13570 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78  efault || pIndex
13580 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
13590 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20  fault) ){.      
135a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
135b0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
135c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
135d0 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43  conflicting ON C
135e0 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
135f0 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a  specified", 0);.
13600 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13610 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
13620 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
13630 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ult ){.         
13640 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72     pIdx->onError
13650 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72   = pIndex->onErr
13660 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  or;.          }.
13670 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13680 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
13690 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
136a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
136b0 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49  * Link the new I
136c0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74  ndex structure t
136d0 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20  o its table and 
136e0 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a  to the other.  *
136f0 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
13700 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e  base structures.
13710 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d   .  */.  if( db-
13720 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
13730 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
13740 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
13750 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70  nsert(&pIndex->p
13760 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
13770 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
13780 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
13790 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  x->zName, strlen
137a0 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b  (pIndex->zName)+
137b0 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  1, pIndex);.    
137c0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61  if( p ){.      a
137d0 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78  ssert( p==pIndex
137e0 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
137f0 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
13800 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  */.      goto ex
13810 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13820 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66  .    }.    db->f
13830 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
13840 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
13850 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d    if( pTblName!=
13860 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  0 ){.      pInde
13870 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  x->tnum = db->in
13880 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20  it.newTnum;.    
13890 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
138a0 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  he db->init.busy
138b0 20 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74   is 0 then creat
138c0 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64  e the index on d
138d0 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  isk.  This.  ** 
138e0 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67  involves writing
138f0 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
13900 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
13910 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20   and filling in 
13920 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77  the.  ** index w
13930 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
13940 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a  table contents..
13950 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62    **.  ** The db
13960 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30  ->init.busy is 0
13970 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 66   when the user f
13980 69 72 73 74 20 65 6e 74 65 72 73 20 61 20 43 52  irst enters a CR
13990 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a  EATE INDEX .  **
139a0 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69   command.  db->i
139b0 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 77 68  nit.busy is 1 wh
139c0 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 73  en a database is
139d0 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a   opened and .  *
139e0 2a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  * CREATE INDEX s
139f0 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65  tatements are re
13a00 61 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ad out of the ma
13a10 73 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a  ster table.  In.
13a20 20 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20    ** the latter 
13a30 63 61 73 65 20 74 68 65 20 69 6e 64 65 78 20 61  case the index a
13a40 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e  lready exists on
13a50 20 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20   disk, which is 
13a60 77 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27  why.  ** we don'
13a70 74 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61  t want to recrea
13a80 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  te it..  **.  **
13a90 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20   If pTblName==0 
13aa0 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e  it means this in
13ab0 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64  dex is generated
13ac0 20 61 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65   as a primary ke
13ad0 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45  y.  ** or UNIQUE
13ae0 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 61   constraint of a
13af0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
13b00 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20  atement.  Since 
13b10 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68  the table.  ** h
13b20 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65  as just been cre
13b30 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e  ated, it contain
13b40 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68  s no data and th
13b50 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69  e index initiali
13b60 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70  zation.  ** step
13b70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e   can be skipped.
13b80 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28  .  */.  else if(
13b90 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
13ba0 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  0 ){.    Vdbe *v
13bb0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d  ;.    char *zStm
13bc0 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20  t;.    int iMem 
13bd0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
13be0 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  ;..    v = sqlit
13bf0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
13c00 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
13c10 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
13c20 74 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20 20 20  te_index;...    
13c30 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f  /* Create the ro
13c40 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 69  otpage for the i
13c50 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ndex.    */.    
13c60 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
13c70 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
13c80 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 1, iDb);.    
13c90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13ca0 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64  (v, OP_CreateInd
13cb0 65 78 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20  ex, iDb, 0);.   
13cc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13cd0 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
13ce0 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 0a 20 20 20  , iMem, 0);..   
13cf0 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20 63   /* Gather the c
13d00 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
13d10 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58  the CREATE INDEX
13d20 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a   statement into.
13d30 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74      ** the zStmt
13d40 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f   variable.    */
13d50 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20  .    if( pStart 
13d60 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  && pEnd ){.     
13d70 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65   /* A named inde
13d80 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63  x with an explic
13d90 69 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  it CREATE INDEX 
13da0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
13db0 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
13dc0 65 33 4d 50 72 69 6e 74 66 28 22 43 52 45 41 54  e3MPrintf("CREAT
13dd0 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c  E%s INDEX %.*s",
13de0 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72  .        onError
13df0 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a  ==OE_None ? "" :
13e00 20 22 20 55 4e 49 51 55 45 22 2c 0a 20 20 20 20   " UNIQUE",.    
13e10 20 20 20 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e      pEnd->z - pN
13e20 61 6d 65 2d 3e 7a 20 2b 20 31 2c 0a 20 20 20 20  ame->z + 1,.    
13e30 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20      pName->z);. 
13e40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13e50 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20  /* An automatic 
13e60 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79  index created by
13e70 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
13e80 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
13e90 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  int */.      /* 
13ea0 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
13eb0 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20  Printf(""); */. 
13ec0 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a       zStmt = 0;.
13ed0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
13ee0 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71  d an entry in sq
13ef0 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20  lite_master for 
13f00 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a  this index.    *
13f10 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
13f20 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
13f30 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52   .        "INSER
13f40 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c  T INTO %Q.%s VAL
13f50 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25  UES('index',%Q,%
13f60 51 2c 23 30 2c 25 51 29 3b 22 2c 0a 20 20 20 20  Q,#0,%Q);",.    
13f70 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
13f80 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
13f90 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20  ABLE(iDb),.     
13fa0 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
13fb0 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
13fc0 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a  zName,.        z
13fd0 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Stmt.    );.    
13fe0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13ff0 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
14000 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
14010 65 28 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f  e(zStmt);..    /
14020 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78  * Fill the index
14030 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72   with data and r
14040 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d  eparse the schem
14050 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78  a. Code an OP_Ex
14060 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69  pire.    ** to i
14070 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72  nvalidate all pr
14080 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  e-compiled state
14090 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ments..    */.  
140a0 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29    if( pTblName )
140b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
140c0 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
140d0 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29  e, pIndex, iMem)
140e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
140f0 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20  hangeCookie(db, 
14100 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  v, iDb);.      s
14110 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
14120 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c   OP_ParseSchema,
14130 20 69 44 62 2c 20 30 2c 0a 20 20 20 20 20 20 20   iDb, 0,.       
14140 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
14150 28 22 6e 61 6d 65 3d 27 25 71 27 22 2c 20 70 49  ("name='%q'", pI
14160 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33  ndex->zName), P3
14170 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
14180 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14190 70 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20  p(v, OP_Expire, 
141a0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
141b0 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69  ..  /* When addi
141c0 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74  ng an index to t
141d0 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63  he list of indic
141e0 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20  es for a table, 
141f0 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61  make.  ** sure a
14200 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c  ll indices label
14210 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f  ed OE_Replace co
14220 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f  me after all tho
14230 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20  se labeled.  ** 
14240 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73  OE_Ignore.  This
14250 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
14260 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70  r the correct op
14270 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54  eration of UPDAT
14280 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52  E.  ** and INSER
14290 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  T..  */.  if( db
142a0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70  ->init.busy || p
142b0 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TblName==0 ){.  
142c0 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f    if( onError!=O
142d0 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61  E_Replace || pTa
142e0 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20  b->pIndex==0.   
142f0 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70        || pTab->p
14300 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
14310 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20  OE_Replace){.   
14320 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
14330 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
14340 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e  .      pTab->pIn
14350 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
14360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
14370 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70  ndex *pOther = p
14380 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
14390 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72     while( pOther
143a0 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65  ->pNext && pOthe
143b0 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f  r->pNext->onErro
143c0 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b  r!=OE_Replace ){
143d0 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20  .        pOther 
143e0 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
143f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
14400 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
14410 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
14420 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78      pOther->pNex
14430 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  t = pIndex;.    
14440 7d 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30  }.    pIndex = 0
14450 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  ;.  }..  /* Clea
14460 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74  n up before exit
14470 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61  ing */.exit_crea
14480 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20  te_index:.  if( 
14490 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 66 72  pIndex ){.    fr
144a0 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  eeIndex(pIndex);
144b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
144c0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  prListDelete(pLi
144d0 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72  st);.  sqlite3Sr
144e0 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54 62 6c  cListDelete(pTbl
144f0 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  Name);.  sqliteF
14500 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  ree(zName);.  re
14510 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  turn;.}../*.** G
14520 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
14530 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 66 69  make sure the fi
14540 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72  le format number
14550 20 69 73 20 61 74 20 6c 65 61 73 74 20 6d 69 6e   is at least min
14560 46 6f 72 6d 61 74 2e 0a 2a 2a 20 54 68 65 20 67  Format..** The g
14570 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20 77 69  enerated code wi
14580 6c 6c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  ll increase the 
14590 66 69 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62  file format numb
145a0 65 72 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  er if necessary.
145b0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
145c0 4d 69 6e 69 6d 75 6d 46 69 6c 65 46 6f 72 6d 61  MinimumFileForma
145d0 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
145e0 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 6d 69   int iDb, int mi
145f0 6e 46 6f 72 6d 61 74 29 7b 0a 20 20 56 64 62 65  nFormat){.  Vdbe
14600 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74   *v;.  v = sqlit
14610 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
14620 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
14630 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14640 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f  Op(v, OP_ReadCoo
14650 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20  kie, iDb, 1);.  
14660 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14670 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
14680 2c 20 6d 69 6e 46 6f 72 6d 61 74 2c 20 30 29 3b  , minFormat, 0);
14690 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
146a0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20  AddOp(v, OP_Ge, 
146b0 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  0, sqlite3VdbeCu
146c0 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
146d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
146e0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
146f0 67 65 72 2c 20 6d 69 6e 46 6f 72 6d 61 74 2c 20  ger, minFormat, 
14700 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
14710 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
14720 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31  etCookie, iDb, 1
14730 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
14740 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61  Fill the Index.a
14750 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20  iRowEst[] array 
14760 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66  with default inf
14770 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72  ormation - infor
14780 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20  mation.** to be 
14790 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 61 76  used when we hav
147a0 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e  e not run the AN
147b0 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  ALYZE command..*
147c0 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d  *.** aiRowEst[0]
147d0 20 69 73 20 73 75 70 70 6f 73 65 20 74 6f 20 63   is suppose to c
147e0 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65  ontain the numbe
147f0 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
14800 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53   the index..** S
14810 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b  ince we do not k
14820 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c  now, guess 1 mil
14830 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b  lion.  aiRowEst[
14840 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  1] is an estimat
14850 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  e of the.** numb
14860 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
14870 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74  e table that mat
14880 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  ch any particula
14890 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a  r value of the.*
148a0 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f  * first column o
148b0 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69  f the index.  ai
148c0 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20  RowEst[2] is an 
148d0 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
148e0 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77  number.** of row
148f0 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79  s that match any
14900 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62   particular comb
14910 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  iniation of the 
14920 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a  first 2 columns.
14930 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ** of the index.
14940 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20    And so forth. 
14950 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20   It must always 
14960 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
14970 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .*.**           
14980 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52  aiRowEst[N]<=aiR
14990 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20  owEst[N-1].**   
149a0 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74          aiRowEst
149b0 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61  [N]>=1.**.** Apa
149c0 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65  rt from that, we
149d0 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20   have little to 
149e0 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e  go on besides in
149f0 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a  tuition as to.**
14a00 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20   how aiRowEst[] 
14a10 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61  should be initia
14a20 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62  lized.  The numb
14a30 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68 65  ers generated he
14a40 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20  re.** are based 
14a50 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65  on typical value
14a60 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61  s found in actua
14a70 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f  l indices..*/.vo
14a80 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c  id sqlite3Defaul
14a90 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70  tRowEst(Index *p
14aa0 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Idx){.  unsigned
14ab0 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f   *a = pIdx->aiRo
14ac0 77 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  wEst;.  int i;. 
14ad0 20 61 73 73 65 72 74 28 20 61 21 3d 30 20 29 3b   assert( a!=0 );
14ae0 0a 20 20 61 5b 30 5d 20 3d 20 31 30 30 30 30 30  .  a[0] = 100000
14af0 30 3b 0a 20 20 66 6f 72 28 69 3d 70 49 64 78 2d  0;.  for(i=pIdx-
14b00 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d 31 3b 20  >nColumn; i>=1; 
14b10 69 2d 2d 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d  i--){.    a[i] =
14b20 20 31 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   10;.  }.  if( p
14b30 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  Idx->onError!=OE
14b40 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70  _None ){.    a[p
14b50 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20  Idx->nColumn] = 
14b60 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
14b70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
14b80 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69  l drop an existi
14b90 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20  ng named index. 
14ba0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
14bb0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
14bc0 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65  DROP INDEX state
14bd0 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
14be0 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50  lite3DropIndex(P
14bf0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
14c00 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
14c10 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49  t ifExists){.  I
14c20 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
14c30 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
14c40 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
14c50 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
14c60 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
14c70 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 54 68  Err || sqlite3Th
14c80 72 65 61 64 44 61 74 61 28 29 2d 3e 6d 61 6c 6c  readData()->mall
14c90 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
14ca0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
14cb0 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ndex;.  }.  asse
14cc0 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
14cd0 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  =1 );.  if( SQLI
14ce0 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
14cf0 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
14d00 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
14d10 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
14d20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  }.  pIndex = sql
14d30 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
14d40 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
14d50 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
14d60 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  .zDatabase);.  i
14d70 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  f( pIndex==0 ){.
14d80 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74      if( !ifExist
14d90 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
14da0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
14db0 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
14dc0 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30  x: %S", pName, 0
14dd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
14de0 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
14df0 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65   = 1;.    goto e
14e00 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
14e10 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78    }.  if( pIndex
14e20 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20  ->autoIndex ){. 
14e30 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14e40 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
14e50 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
14e60 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20  h UNIQUE ".     
14e70 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59   "or PRIMARY KEY
14e80 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e   constraint cann
14e90 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
14ea0 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  0);.    goto exi
14eb0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
14ec0 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
14ed0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
14ee0 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  b, pIndex->pSche
14ef0 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ma);.#ifndef SQL
14f00 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
14f10 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
14f20 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
14f30 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _DROP_INDEX;.   
14f40 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
14f50 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20  Index->pTable;. 
14f60 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
14f70 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
14f80 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  ].zName;.    con
14f90 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
14fa0 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
14fb0 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
14fc0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
14fd0 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
14fe0 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
14ff0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
15000 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
15010 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f      }.    if( !O
15020 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
15030 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  b ) code = SQLIT
15040 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45  E_DROP_TEMP_INDE
15050 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
15060 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
15070 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78  se, code, pIndex
15080 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  ->zName, pTab->z
15090 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
150a0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
150b0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
150c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
150d0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
150e0 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  o remove the ind
150f0 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20  ex and from the 
15100 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
15110 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
15120 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
15130 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
15140 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
15150 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22  pParse,.       "
15160 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
15170 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  s WHERE name=%Q"
15180 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ,.       db->aDb
15190 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
151a0 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a  EMA_TABLE(iDb),.
151b0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
151c0 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Name.    );.    
151d0 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
151e0 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b  kie(db, v, iDb);
151f0 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  .    destroyRoot
15200 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Page(pParse, pIn
15210 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  dex->tnum, iDb);
15220 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15230 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e  Op3(v, OP_DropIn
15240 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 70 49 6e  dex, iDb, 0, pIn
15250 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  dex->zName, 0);.
15260 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69    }..exit_drop_i
15270 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53  ndex:.  sqlite3S
15280 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61  rcListDelete(pNa
15290 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 70  me);.}../*.** pp
152a0 41 72 72 61 79 20 70 6f 69 6e 74 73 20 69 6e 74  Array points int
152b0 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 77 68  o a structure wh
152c0 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e 20  ere there is an 
152d0 61 72 72 61 79 20 70 6f 69 6e 74 65 72 0a 2a 2a  array pointer.**
152e0 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 77 6f   followed by two
152f0 20 69 6e 74 65 67 65 72 73 2e 20 54 68 65 20 66   integers. The f
15300 69 72 73 74 20 69 6e 74 65 67 65 72 20 69 73 20  irst integer is 
15310 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
15320 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
15330 20 73 74 72 75 63 74 75 72 65 20 61 72 72 61 79   structure array
15340 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e  .  The second in
15350 74 65 67 65 72 0a 2a 2a 20 69 73 20 74 68 65 20  teger.** is the 
15360 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 63 61  number of alloca
15370 74 65 64 20 73 6c 6f 74 73 20 69 6e 20 74 68 65  ted slots in the
15380 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e   array..**.** In
15390 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
153a0 65 20 73 74 72 75 63 74 75 72 65 20 6c 6f 6f 6b  e structure look
153b0 73 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65  s something like
153c0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
153d0 20 20 20 20 73 74 72 75 63 74 20 45 78 61 6d 70      struct Examp
153e0 6c 65 31 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20  le1 {.**        
153f0 20 20 73 74 72 75 63 74 20 73 75 62 45 6c 65 6d    struct subElem
15400 20 2a 61 45 6e 74 72 79 3b 0a 2a 2a 20 20 20 20   *aEntry;.**    
15410 20 20 20 20 20 20 69 6e 74 20 6e 45 6e 74 72 79        int nEntry
15420 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e  ;.**          in
15430 74 20 6e 41 6c 6c 6f 63 3b 0a 2a 2a 20 20 20 20  t nAlloc;.**    
15440 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20      }.**.** The 
15450 70 6e 45 6e 74 72 79 20 70 61 72 61 6d 65 74 65  pnEntry paramete
15460 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
15470 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 45 78  equivalent of Ex
15480 61 6d 70 6c 65 31 2e 6e 45 6e 74 72 79 2e 0a 2a  ample1.nEntry..*
15490 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
154a0 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65  e allocates a ne
154b0 77 20 73 6c 6f 74 20 69 6e 20 74 68 65 20 61 72  w slot in the ar
154c0 72 61 79 2c 20 7a 65 72 6f 73 20 69 74 20 6f 75  ray, zeros it ou
154d0 74 2c 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  t,.** and return
154e0 73 20 69 74 73 20 69 6e 64 65 78 2e 20 20 49 66  s its index.  If
154f0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 61 20   malloc fails a 
15500 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
15510 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
15520 2a 2a 20 73 7a 45 6e 74 72 79 20 69 73 20 74 68  ** szEntry is th
15530 65 20 73 69 7a 65 6f 66 20 6f 66 20 61 20 73 69  e sizeof of a si
15540 6e 67 6c 65 20 61 72 72 61 79 20 65 6e 74 72 79  ngle array entry
15550 2e 20 20 69 6e 69 74 53 69 7a 65 20 69 73 20 74  .  initSize is t
15560 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  he .** number of
15570 20 61 72 72 61 79 20 65 6e 74 72 69 65 73 20 61   array entries a
15580 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20  llocated on the 
15590 69 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61 74 69  initial allocati
155a0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
155b0 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
155c0 76 6f 69 64 20 2a 2a 70 70 41 72 72 61 79 2c 20  void **ppArray, 
155d0 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 69 6e 74  int szEntry, int
155e0 20 69 6e 69 74 53 69 7a 65 29 7b 0a 20 20 63 68   initSize){.  ch
155f0 61 72 20 2a 70 3b 0a 20 20 69 6e 74 20 2a 61 6e  ar *p;.  int *an
15600 20 3d 20 28 69 6e 74 2a 29 26 70 70 41 72 72 61   = (int*)&ppArra
15610 79 5b 31 5d 3b 0a 20 20 69 66 28 20 61 6e 5b 30  y[1];.  if( an[0
15620 5d 3e 3d 61 6e 5b 31 5d 20 29 7b 0a 20 20 20 20  ]>=an[1] ){.    
15630 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20 20 20  void *pNew;.    
15640 69 6e 74 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  int newSize;.   
15650 20 6e 65 77 53 69 7a 65 20 3d 20 61 6e 5b 31 5d   newSize = an[1]
15660 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a 20  *2 + initSize;. 
15670 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
15680 52 65 61 6c 6c 6f 63 28 2a 70 70 41 72 72 61 79  Realloc(*ppArray
15690 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e 74 72  , newSize*szEntr
156a0 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  y);.    if( pNew
156b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
156c0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
156d0 20 20 61 6e 5b 31 5d 20 3d 20 6e 65 77 53 69 7a    an[1] = newSiz
156e0 65 3b 0a 20 20 20 20 2a 70 70 41 72 72 61 79 20  e;.    *ppArray 
156f0 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 20  = pNew;.  }.  p 
15700 3d 20 2a 70 70 41 72 72 61 79 3b 0a 20 20 6d 65  = *ppArray;.  me
15710 6d 73 65 74 28 26 70 5b 61 6e 5b 30 5d 2a 73 7a  mset(&p[an[0]*sz
15720 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74  Entry], 0, szEnt
15730 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 6e  ry);.  return an
15740 5b 30 5d 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  [0]++;.}../*.** 
15750 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65  Append a new ele
15760 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65  ment to the give
15770 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74  n IdList.  Creat
15780 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69  e a new IdList i
15790 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a  f.** need be..**
157a0 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74  .** A new IdList
157b0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
157c0 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
157d0 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69  ) fails..*/.IdLi
157e0 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
157f0 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a  tAppend(IdList *
15800 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
15810 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  oken){.  int i;.
15820 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
15830 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
15840 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
15850 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
15860 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
15870 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
15880 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30  List->nAlloc = 0
15890 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 73 71 6c 69  ;.  }.  i = sqli
158a0 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
158b0 28 28 76 6f 69 64 2a 2a 29 26 70 4c 69 73 74 2d  ((void**)&pList-
158c0 3e 61 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74  >a, sizeof(pList
158d0 2d 3e 61 5b 30 5d 29 2c 20 35 29 3b 0a 20 20 69  ->a[0]), 5);.  i
158e0 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71  f( i<0 ){.    sq
158f0 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
15900 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65  e(pList);.    re
15910 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
15920 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
15930 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
15940 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a  mToken(pToken);.
15950 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
15960 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
15970 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f  an IdList..*/.vo
15980 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  id sqlite3IdList
15990 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70  Delete(IdList *p
159a0 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
159b0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
159c0 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
159d0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
159e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
159f0 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  teFree(pList->a[
15a00 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
15a10 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
15a20 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46  t->a);.  sqliteF
15a30 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  ree(pList);.}../
15a40 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
15a50 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f  index in pList o
15a60 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
15a70 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74   named zId.  Ret
15a80 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74  urn -1.** if not
15a90 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
15aa0 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
15ab0 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  x(IdList *pList,
15ac0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
15ad0 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
15ae0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
15af0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28  eturn -1;.  for(
15b00 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
15b10 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
15b20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
15b30 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
15b40 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
15b50 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
15b60 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
15b70 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
15b80 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
15b90 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e  e given SrcList.
15ba0 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
15bb0 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  rcList if.** nee
15bc0 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74  d be.  A new ent
15bd0 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  ry is created in
15be0 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65   the SrcList eve
15bf0 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e  n if pToken is N
15c00 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  ULL..**.** A new
15c10 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75   SrcList is retu
15c20 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
15c30 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
15c40 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62  .**.** If pDatab
15c50 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c  ase is not null,
15c60 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
15c70 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
15c80 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61  optional.** data
15c90 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78  base name prefix
15ca0 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22  .  Like this:  "
15cb0 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e  database.table".
15cc0 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a    The pDatabase.
15cd0 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ** points to the
15ce0 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
15cf0 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74  the pTable point
15d00 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
15d10 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53  e name..** The S
15d20 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  rcList.a[].zName
15d30 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64   field is filled
15d40 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
15d50 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74  name which might
15d60 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54  .** come from pT
15d70 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61  able (if pDataba
15d80 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66  se is NULL) or f
15d90 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20  rom pDatabase.  
15da0 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  .** SrcList.a[].
15db0 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c  zDatabase is fil
15dc0 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
15dd0 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20  abase name from 
15de0 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69  pTable,.** or wi
15df0 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61  th NULL if no da
15e00 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66  tabase is specif
15e10 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74  ied..**.** In ot
15e20 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61  her words, if ca
15e30 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ll like this:.**
15e40 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
15e50 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
15e60 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54  (A,B,0);.**.** T
15e70 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65  hen B is a table
15e80 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
15e90 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75  tabase name is u
15ea0 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20  nspecified.  If 
15eb0 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74  called.** like t
15ec0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
15ed0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
15ee0 74 41 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a  tAppend(A,B,C);.
15ef0 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20  **.** Then C is 
15f00 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
15f10 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61  nd B is the data
15f20 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72  base name..*/.Sr
15f30 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
15f40 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63 4c  cListAppend(SrcL
15f50 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
15f60 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65 6e  n *pTable, Token
15f70 20 2a 70 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *pDatabase){.  
15f80 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
15f90 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66  tem *pItem;.  if
15fa0 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
15fb0 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
15fc0 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53  Malloc( sizeof(S
15fd0 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  rcList) );.    i
15fe0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
15ff0 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
16000 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20  t->nAlloc = 1;. 
16010 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e   }.  if( pList->
16020 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c  nSrc>=pList->nAl
16030 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  loc ){.    SrcLi
16040 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c  st *pNew;.    pL
16050 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32  ist->nAlloc *= 2
16060 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
16070 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74  iteRealloc(pList
16080 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16090 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20   sizeof(*pList) 
160a0 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  + (pList->nAlloc
160b0 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  -1)*sizeof(pList
160c0 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  ->a[0]) );.    i
160d0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
160e0 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
160f0 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
16100 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
16110 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
16120 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = pNew;.  }.  p
16130 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
16140 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20  [pList->nSrc];. 
16150 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
16160 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  , sizeof(pList->
16170 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 44  a[0]));.  if( pD
16180 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61  atabase && pData
16190 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  base->z==0 ){.  
161a0 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b    pDatabase = 0;
161b0 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61  .  }.  if( pData
161c0 62 61 73 65 20 26 26 20 70 54 61 62 6c 65 20 29  base && pTable )
161d0 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65  {.    Token *pTe
161e0 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a  mp = pDatabase;.
161f0 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
16200 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62  pTable;.    pTab
16210 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a  le = pTemp;.  }.
16220 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
16230 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
16240 54 6f 6b 65 6e 28 70 54 61 62 6c 65 29 3b 0a 20  Token(pTable);. 
16250 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
16260 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
16270 72 6f 6d 54 6f 6b 65 6e 28 70 44 61 74 61 62 61  romToken(pDataba
16280 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 43  se);.  pItem->iC
16290 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 4c  ursor = -1;.  pL
162a0 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72  ist->nSrc++;.  r
162b0 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
162c0 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75 72  /*.** Assign cur
162d0 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c  sors to all tabl
162e0 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a  es in a SrcList.
162f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
16300 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
16310 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ors(Parse *pPars
16320 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  e, SrcList *pLis
16330 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
16340 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
16350 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73  em *pItem;.  ass
16360 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 73 71 6c  ert(pList || sql
16370 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
16380 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b  ->mallocFailed);
16390 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
163a0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
163b0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
163c0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
163d0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
163e0 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72   if( pItem->iCur
163f0 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a  sor>=0 ) break;.
16400 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75        pItem->iCu
16410 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
16420 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Tab++;.      if(
16430 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
16440 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
16450 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
16460 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
16470 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Item->pSelect->p
16480 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Src);.      }.  
16490 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
164a0 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74 6f   Add an alias to
164b0 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74 69   the last identi
164c0 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76 65  fier on the give
164d0 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69 73  n identifier lis
164e0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
164f0 65 33 53 72 63 4c 69 73 74 41 64 64 41 6c 69 61  e3SrcListAddAlia
16500 73 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  s(SrcList *pList
16510 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
16520 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26 26  {.  if( pList &&
16530 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29   pList->nSrc>0 )
16540 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70  {.    pList->a[p
16550 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 2e 7a 41  List->nSrc-1].zA
16560 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61  lias = sqlite3Na
16570 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b  meFromToken(pTok
16580 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  en);.  }.}../*.*
16590 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
165a0 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75  re SrcList inclu
165b0 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62  ding all its sub
165c0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f  structure..*/.vo
165d0 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
165e0 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20  tDelete(SrcList 
165f0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
16600 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
16610 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
16620 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
16630 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70   return;.  for(p
16640 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
16650 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  =0; i<pList->nSr
16660 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
16670 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
16680 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  (pItem->zDatabas
16690 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
166a0 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  ee(pItem->zName)
166b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
166c0 28 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  (pItem->zAlias);
166d0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
166e0 74 65 54 61 62 6c 65 28 30 2c 20 70 49 74 65 6d  teTable(0, pItem
166f0 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c  ->pTab);.    sql
16700 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
16710 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29  (pItem->pSelect)
16720 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
16730 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70  rDelete(pItem->p
16740 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  On);.    sqlite3
16750 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 49 74  IdListDelete(pIt
16760 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
16770 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
16780 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  ist);.}../*.** B
16790 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
167a0 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
167b0 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  e3BeginTransacti
167c0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
167d0 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73  , int type){.  s
167e0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
167f0 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a  be *v;.  int i;.
16800 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
16810 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
16820 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44  db)==0 || db->aD
16830 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
16840 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
16850 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
16860 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 2d  te3ThreadData()-
16870 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
16880 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
16890 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
168a0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
168b0 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49  ANSACTION, "BEGI
168c0 4e 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75  N", 0, 0) ) retu
168d0 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  rn;..  v = sqlit
168e0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
168f0 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65  );.  if( !v ) re
16900 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65  turn;.  if( type
16910 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b  !=TK_DEFERRED ){
16920 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
16930 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
16940 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16950 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e  AddOp(v, OP_Tran
16960 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70  saction, i, (typ
16970 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29  e==TK_EXCLUSIVE)
16980 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +1);.    }.  }. 
16990 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
169a0 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  p(v, OP_AutoComm
169b0 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  it, 0, 0);.}../*
169c0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61  .** Commit a tra
169d0 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
169e0 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72   sqlite3CommitTr
169f0 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
16a00 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
16a10 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
16a20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  *v;..  if( pPars
16a30 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
16a40 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
16a50 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
16a60 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
16a70 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
16a80 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
16a90 61 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  a()->mallocFaile
16aa0 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
16ab0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
16ac0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
16ad0 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
16ae0 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29  COMMIT", 0, 0) )
16af0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20   return;..  v = 
16b00 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
16b10 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
16b20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
16b30 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75  beAddOp(v, OP_Au
16b40 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b  toCommit, 1, 0);
16b50 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  .  }.}../*.** Ro
16b60 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
16b70 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
16b80 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e  ite3RollbackTran
16b90 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
16ba0 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
16bb0 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
16bc0 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
16bd0 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
16be0 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
16bf0 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
16c00 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
16c10 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
16c20 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
16c30 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  )->mallocFailed 
16c40 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
16c50 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
16c60 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
16c70 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f  TRANSACTION, "RO
16c80 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29  LLBACK", 0, 0) )
16c90 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20   return;..  v = 
16ca0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
16cb0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
16cc0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
16cd0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75  beAddOp(v, OP_Au
16ce0 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b  toCommit, 1, 1);
16cf0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
16d00 6b 65 20 73 75 72 65 20 74 68 65 20 54 45 4d 50  ke sure the TEMP
16d10 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
16d20 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20  n and available 
16d30 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e  for use.  Return
16d40 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
16d50 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65  f errors.  Leave
16d60 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
16d70 67 65 73 20 69 6e 20 74 68 65 20 70 50 61 72 73  ges in the pPars
16d80 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
16d90 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
16da0 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
16db0 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
16dc0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
16dd0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
16de0 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
16df0 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73  pBt==0 && !pPars
16e00 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
16e10 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
16e20 65 33 42 74 72 65 65 46 61 63 74 6f 72 79 28 64  e3BtreeFactory(d
16e30 62 2c 20 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47  b, 0, 0, MAX_PAG
16e40 45 53 2c 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e  ES, &db->aDb[1].
16e50 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pBt);.    if( rc
16e60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16e70 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
16e80 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
16e90 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74  able to open a t
16ea0 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
16eb0 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c  e ".        "fil
16ec0 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65  e for storing te
16ed0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29  mporary tables")
16ee0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
16ef0 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72  rc = rc;.      r
16f00 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
16f10 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73     if( db->flags
16f20 20 26 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   & !db->autoComm
16f30 69 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  it ){.      rc =
16f40 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
16f50 69 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b  inTrans(db->aDb[
16f60 31 5d 2e 70 42 74 2c 20 31 29 3b 0a 20 20 20 20  1].pBt, 1);.    
16f70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16f80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
16f90 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
16fa0 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
16fb0 6f 20 67 65 74 20 61 20 77 72 69 74 65 20 6c 6f  o get a write lo
16fc0 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20 20 20  ck on ".        
16fd0 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61 72 79    "the temporary
16fe0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 29   database file")
16ff0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
17000 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
17010 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
17020 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
17030 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31  ssert( db->aDb[1
17040 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 7d  ].pSchema );.  }
17050 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
17060 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
17070 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 77 69  DBE code that wi
17080 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20 73 63  ll verify the sc
17090 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20  hema cookie and 
170a0 73 74 61 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d  start.** a read-
170b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
170c0 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61 62 61  all named databa
170d0 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  se files..**.** 
170e0 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
170f0 74 68 61 74 20 61 6c 6c 20 73 63 68 65 6d 61 20  that all schema 
17100 63 6f 6f 6b 69 65 73 20 62 65 20 76 65 72 69 66  cookies be verif
17110 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72  ied and all.** r
17120 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ead transactions
17130 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
17140 72 65 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  re anything else
17150 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74   happens in.** t
17160 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e  he VDBE program.
17170 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69    But this routi
17180 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  ne can be called
17190 20 61 66 74 65 72 20 6d 75 63 68 20 6f 74 68 65   after much othe
171a0 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20 62 65  r.** code has be
171b0 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20 20 53  en generated.  S
171c0 6f 20 68 65 72 65 20 69 73 20 77 68 61 74 20 77  o here is what w
171d0 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e do:.**.** The 
171e0 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  first time this 
171f0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
17200 64 2c 20 77 65 20 63 6f 64 65 20 61 6e 20 4f 50  d, we code an OP
17210 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69  _Goto that.** wi
17220 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73 75 62  ll jump to a sub
17230 72 6f 75 74 69 6e 65 20 61 74 20 74 68 65 20 65  routine at the e
17240 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  nd of the progra
17250 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72  m.  Then we.** r
17260 65 63 6f 72 64 20 65 76 65 72 79 20 64 61 74 61  ecord every data
17270 62 61 73 65 20 74 68 61 74 20 6e 65 65 64 73 20  base that needs 
17280 69 74 73 20 73 63 68 65 6d 61 20 76 65 72 69 66  its schema verif
17290 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50  ied in the.** pP
172a0 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
172b0 20 66 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20   field.  Later, 
172c0 61 66 74 65 72 20 61 6c 6c 20 6f 74 68 65 72 20  after all other 
172d0 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a  code has been.**
172e0 20 67 65 6e 65 72 61 74 65 64 2c 20 74 68 65 20   generated, the 
172f0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
17300 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  does the cookie 
17310 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20 61 6e  verifications an
17320 64 0a 2a 2a 20 73 74 61 72 74 73 20 74 68 65 20  d.** starts the 
17330 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c  transactions wil
17340 6c 20 62 65 20 63 6f 64 65 64 20 61 6e 64 20 74  l be coded and t
17350 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61  he OP_Goto P2 va
17360 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d  lue.** will be m
17370 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ade to point to 
17380 74 68 61 74 20 73 75 62 72 6f 75 74 69 6e 65 2e  that subroutine.
17390 20 20 54 68 65 20 67 65 6e 65 72 61 74 69 6f 6e    The generation
173a0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69   of the.** cooki
173b0 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 73  e verification s
173c0 75 62 72 6f 75 74 69 6e 65 20 63 6f 64 65 20 68  ubroutine code h
173d0 61 70 70 65 6e 73 20 69 6e 20 73 71 6c 69 74 65  appens in sqlite
173e0 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
173f0 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20  .**.** If iDb<0 
17400 74 68 65 6e 20 63 6f 64 65 20 74 68 65 20 4f 50  then code the OP
17410 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e  _Goto only - don
17420 27 74 20 73 65 74 20 66 6c 61 67 20 74 6f 20 76  't set flag to v
17430 65 72 69 66 79 20 74 68 65 0a 2a 2a 20 73 63 68  erify the.** sch
17440 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74 61 62  ema on any datab
17450 61 73 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20  ases.  This can 
17460 62 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74  be used to posit
17470 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a  ion the OP_Goto.
17480 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20  ** early in the 
17490 63 6f 64 65 2c 20 62 65 66 6f 72 65 20 77 65 20  code, before we 
174a0 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64 61 74 61  know if any data
174b0 62 61 73 65 20 74 61 62 6c 65 73 20 77 69 6c 6c  base tables will
174c0 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69   be used..*/.voi
174d0 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  d sqlite3CodeVer
174e0 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20  ifySchema(Parse 
174f0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
17500 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
17510 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
17520 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d 20  nt mask;..  v = 
17530 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
17540 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
17550 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  =0 ) return;  /*
17560 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
17570 6e 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ns if there was 
17580 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f  a prior error */
17590 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
175a0 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  db;.  if( pParse
175b0 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20  ->cookieGoto==0 
175c0 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63  ){.    pParse->c
175d0 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69  ookieGoto = sqli
175e0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
175f0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31  OP_Goto, 0, 0)+1
17600 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3e  ;.  }.  if( iDb>
17610 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
17620 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  ( iDb<db->nDb );
17630 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
17640 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30  >aDb[iDb].pBt!=0
17650 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20   || iDb==1 );.  
17660 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 33 32    assert( iDb<32
17670 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 31   );.    mask = 1
17680 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66 28 20 28  <<iDb;.    if( (
17690 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
176a0 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  sk & mask)==0 ){
176b0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
176c0 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73  ookieMask |= mas
176d0 6b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  k;.      pParse-
176e0 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62  >cookieValue[iDb
176f0 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  ] = db->aDb[iDb]
17700 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
17710 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69  _cookie;.      i
17720 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
17730 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
17740 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
17750 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 50 61  TempDatabase(pPa
17760 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rse);.      }.  
17770 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
17780 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
17790 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65  ode that prepare
177a0 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f  s for doing an o
177b0 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  peration that.**
177c0 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
177d0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
177e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
177f0 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e  tarts a new tran
17800 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72  saction if we ar
17810 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69  e not already wi
17820 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61  thin.** a transa
17830 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72  ction.  If we ar
17840 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  e already within
17850 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
17860 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e  then a checkpoin
17870 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74  t.** is set if t
17880 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20  he setStatement 
17890 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75  parameter is tru
178a0 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74  e.  A checkpoint
178b0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
178c0 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73  t for operations
178d0 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c   that might fail
178e0 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74   (due to a const
178f0 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a  raint) part of.*
17900 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67  * the way throug
17910 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c  h and which will
17920 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f   need to undo so
17930 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75  me writes withou
17940 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72  t having to.** r
17950 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c  ollback the whol
17960 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
17970 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  For operations w
17980 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  here all constra
17990 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  ints.** can be c
179a0 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e  hecked before an
179b0 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  y changes are ma
179c0 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
179d0 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a  se, it is never.
179e0 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ** necessary to 
179f0 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64  undo a write and
17a00 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
17a10 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65  should not be se
17a20 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61  t..**.** Only da
17a30 74 61 62 61 73 65 20 69 44 62 20 61 6e 64 20 74  tabase iDb and t
17a40 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
17a50 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62   are made writab
17a60 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c 6c 2e  le by this call.
17a70 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20 74  .** If iDb==0, t
17a80 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e 64  hen the main and
17a90 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 73 20   temp databases 
17aa0 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c  are made writabl
17ab0 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d 3d  e.   If.** iDb==
17ac0 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20  1 then only the 
17ad0 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 69 73  temp database is
17ae0 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20   made writable. 
17af0 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e 20 74   If iDb>1 then t
17b00 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  he.** specified 
17b10 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
17b20 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20  se and the temp 
17b30 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64  database are mad
17b40 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76  e writable..*/.v
17b50 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
17b60 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50  WriteOperation(P
17b70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
17b80 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20  t setStatement, 
17b90 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
17ba0 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
17bb0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
17bc0 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
17bd0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65  n;.  sqlite3Code
17be0 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
17bf0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 50 61  rse, iDb);.  pPa
17c00 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c  rse->writeMask |
17c10 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20  = 1<<iDb;.  if( 
17c20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 26 26 20  setStatement && 
17c30 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
17c40 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
17c50 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
17c60 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62 2c 20  Statement, iDb, 
17c70 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 4f  0);.  }.  if( (O
17c80 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69 44  MIT_TEMPDB || iD
17c90 62 21 3d 31 29 20 26 26 20 70 50 61 72 73 65 2d  b!=1) && pParse-
17ca0 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 21  >db->aDb[1].pBt!
17cb0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
17cc0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
17cd0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 73 65 74  tion(pParse, set
17ce0 53 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a 20  Statement, 1);. 
17cf0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63   }.}../*.** Chec
17d00 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64  k to see if pInd
17d10 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c  ex uses the coll
17d20 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
17d30 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  Coll.  Return.**
17d40 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
17d50 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74   and false if it
17d60 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69   does not..*/.#i
17d70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17d80 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
17d90 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61   int collationMa
17da0 74 63 68 28 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  tch(CollSeq *pCo
17db0 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ll, Index *pInde
17dc0 78 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49  x){.  int n = pI
17dd0 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46  ndex->keyInfo.nF
17de0 69 65 6c 64 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  ield;.  CollSeq 
17df0 2a 2a 70 70 20 3d 20 70 49 6e 64 65 78 2d 3e 6b  **pp = pIndex->k
17e00 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 3b 0a 20 20  eyInfo.aColl;.  
17e10 77 68 69 6c 65 28 20 6e 2d 2d 20 29 7b 0a 20 20  while( n-- ){.  
17e20 20 20 69 66 28 20 2a 70 70 3d 3d 70 43 6f 6c 6c    if( *pp==pColl
17e30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
17e40 20 70 70 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74   pp++;.  }.  ret
17e50 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
17e60 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
17e70 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
17e80 70 54 61 62 20 74 68 61 74 20 75 73 65 20 74 68  pTab that use th
17e90 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
17ea0 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49  ence pColl..** I
17eb0 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20  f pColl==0 then 
17ec0 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  recompute all in
17ed0 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a  dices of pTab..*
17ee0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
17ef0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
17f00 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65  atic void reinde
17f10 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  xTable(Parse *pP
17f20 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
17f30 62 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  b, CollSeq *pCol
17f40 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  l){.  Index *pIn
17f50 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
17f60 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
17f70 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
17f80 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e  ab */..  for(pIn
17f90 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  dex=pTab->pIndex
17fa0 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
17fb0 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b  =pIndex->pNext){
17fc0 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d  .    if( pColl==
17fd0 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61  0 || collationMa
17fe0 74 63 68 28 70 43 6f 6c 6c 2c 70 49 6e 64 65 78  tch(pColl,pIndex
17ff0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
18000 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
18010 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
18020 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
18030 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ema);.      sqli
18040 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
18050 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
18060 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
18070 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
18080 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
18090 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   -1);.    }.  }.
180a0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
180b0 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
180c0 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62  dices of all tab
180d0 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  les in all datab
180e0 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a  ases where the.*
180f0 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68  * indices use th
18100 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
18110 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20  ence pColl.  If 
18120 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
18130 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69  compute.** all i
18140 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72  ndices everywher
18150 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
18160 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
18170 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  X.static void re
18180 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50  indexDatabases(P
18190 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f  arse *pParse, Co
181a0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
181b0 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
181c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
181d0 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  A single databas
181e0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
181f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18200 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
18210 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
18220 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
18230 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
18240 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
18250 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
18260 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20   HashElem *k;   
18270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18280 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
18290 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a   tables in pDb *
182a0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
182b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182c0 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
182d0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20  e database */.. 
182e0 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d   for(iDb=0, pDb=
182f0 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d  db->aDb; iDb<db-
18300 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62  >nDb; iDb++, pDb
18310 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 44 62  ++){.    if( pDb
18320 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
18330 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65      for(k=sqlite
18340 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
18350 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
18360 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48  );  k; k=sqliteH
18370 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20  ashNext(k)){.   
18380 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65     pTab = (Table
18390 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
183a0 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64  (k);.      reind
183b0 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  exTable(pParse, 
183c0 70 54 61 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  pTab, pColl);.  
183d0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
183e0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
183f0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45   code for the RE
18400 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  INDEX command..*
18410 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  *.**        REIN
18420 44 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20  DEX             
18430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
18440 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 1.**        RE
18450 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f  INDEX  <collatio
18460 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n>              
18470 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20   -- 2.**        
18480 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62  REINDEX  ?<datab
18490 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65  ase>.?<tablename
184a0 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20  >  -- 3.**      
184b0 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74    REINDEX  ?<dat
184c0 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61  abase>.?<indexna
184d0 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20  me>  -- 4.**.** 
184e0 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c  Form 1 causes al
184f0 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
18500 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
18510 73 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c  ses to be rebuil
18520 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62  t..** Form 2 reb
18530 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65  uilds all indice
18540 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
18550 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  es that use the 
18560 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69  named.** collati
18570 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f  ng function.  Fo
18580 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75  rms 3 and 4 rebu
18590 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  ild the named in
185a0 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e  dex or all.** in
185b0 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
185c0 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20   with the named 
185d0 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  table..*/.#ifnde
185e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
185f0 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74  INDEX.void sqlit
18600 65 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20  e3Reindex(Parse 
18610 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
18620 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70  pName1, Token *p
18630 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65  Name2){.  CollSe
18640 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
18650 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
18660 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62  ng sequence to b
18670 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20  e reindexed, or 
18680 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a  NULL */.  char *
18690 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
186a0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
186b0 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
186c0 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  x */.  const cha
186d0 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20  r *zDb;         
186e0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
186f0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
18700 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
18710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
18720 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
18730 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65  tabase */.  Inde
18740 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
18750 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
18760 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
18770 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e  ith pTab */.  in
18780 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
18790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
187a0 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
187b0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69  number */.  sqli
187c0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
187d0 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64  ->db;   /* The d
187e0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
187f0 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  on */.  Token *p
18800 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  ObjName;        
18810 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
18820 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
18830 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  x to be reindexe
18840 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20  d */..  /* Read 
18850 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
18860 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ema. If an error
18870 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
18880 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
18890 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e    ** and code in
188a0 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
188b0 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66  rn NULL. */.  if
188c0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
188d0 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
188e0 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
188f0 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
18900 20 70 4e 61 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e   pName1==0 || pN
18910 61 6d 65 31 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  ame1->z==0 ){.  
18920 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73    reindexDatabas
18930 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20  es(pParse, 0);. 
18940 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c     return;.  }el
18950 73 65 20 69 66 28 20 70 4e 61 6d 65 32 3d 3d 30  se if( pName2==0
18960 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30   || pName2->z==0
18970 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   ){.    pColl = 
18980 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
18990 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
189a0 28 63 68 61 72 2a 29 70 4e 61 6d 65 31 2d 3e 7a  (char*)pName1->z
189b0 2c 20 70 4e 61 6d 65 31 2d 3e 6e 2c 20 30 29 3b  , pName1->n, 0);
189c0 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
189d0 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 44  {.      reindexD
189e0 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
189f0 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72   pColl);.      r
18a00 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
18a10 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
18a20 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
18a30 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
18a40 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a  e2, &pObjName);.
18a50 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
18a60 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  turn;.  z = sqli
18a70 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
18a80 28 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 7a 44  (pObjName);.  zD
18a90 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
18aa0 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d  .zName;.  pTab =
18ab0 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
18ac0 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  e(db, z, zDb);. 
18ad0 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
18ae0 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
18af0 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a  arse, pTab, 0);.
18b00 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
18b10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
18b20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
18b30 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
18b40 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71  b, z, zDb);.  sq
18b50 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 69  liteFree(z);.  i
18b60 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
18b70 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
18b80 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
18b90 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
18ba0 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
18bb0 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
18bc0 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  ex, -1);.    ret
18bd0 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
18be0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
18bf0 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64  e, "unable to id
18c00 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63  entify the objec
18c10 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  t to be reindexe
18c20 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a        d");.}.#endif.