/ Hex Artifact Content
Login

Artifact e0cecb858aa43d983ba7cfb9437b96107f06eda2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 0a 2a 2a    ROLLBACK.**.**
02d0: 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20   $Id: build.c,v 
02e0: 31 2e 33 38 37 20 32 30 30 36 2f 30 32 2f 31 37  1.387 2006/02/17
02f0: 20 31 32 3a 32 35 3a 31 35 20 64 61 6e 69 65 6c   12:25:15 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 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ..  if( 0==sqlit
0720: 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64  e3ThreadDataRead
0730: 4f 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61 72 65  Only()->useShare
0740: 64 44 61 74 61 20 7c 7c 20 69 44 62 3c 30 20 29  dData || iDb<0 )
0750: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
0760: 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  }..  for(i=0; i<
0770: 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f  pParse->nTableLo
0780: 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  ck; i++){.    p 
0790: 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c  = &pParse->aTabl
07a0: 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69 66  eLock[i];.    if
07b0: 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26 26  ( p->iDb==iDb &&
07c0: 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20 29   p->iTab==iTab )
07d0: 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72 69  {.      p->isWri
07e0: 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73 57  teLock = (p->isW
07f0: 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57 72  riteLock || isWr
0800: 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  iteLock);.      
0810: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
0820: 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73 69  }..  nBytes = si
0830: 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29 20  zeof(TableLock) 
0840: 2a 20 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c  * (pParse->nTabl
0850: 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20 73 71 6c 69  eLock+1);.  sqli
0860: 74 65 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  teReallocOrFree(
0870: 28 76 6f 69 64 20 2a 2a 29 26 70 50 61 72 73 65  (void **)&pParse
0880: 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42  ->aTableLock, nB
0890: 79 74 65 73 29 3b 0a 20 20 69 66 28 20 70 50 61  ytes);.  if( pPa
08a0: 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  rse->aTableLock 
08b0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72  ){.    p = &pPar
08c0: 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 70  se->aTableLock[p
08d0: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
08e0: 6b 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62  k++];.    p->iDb
08f0: 20 3d 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69   = iDb;.    p->i
0900: 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Tab = iTab;.    
0910: 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d  p->isWriteLock =
0920: 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20   isWriteLock;.  
0930: 20 20 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61    p->zName = zNa
0940: 6d 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  me;.  }.}../*.**
0950: 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 61 62 6c   Code an OP_Tabl
0960: 65 4c 6f 63 6b 20 69 6e 73 74 72 75 63 74 69 6f  eLock instructio
0970: 6e 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  n for each table
0980: 20 6c 6f 63 6b 65 64 20 62 79 20 74 68 65 0a 2a   locked by the.*
0990: 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 63 6f 6e  * statement (con
09a0: 66 69 67 75 72 65 64 20 62 79 20 63 61 6c 6c 73  figured by calls
09b0: 20 74 6f 20 73 71 6c 69 74 65 33 54 61 62 6c 65   to sqlite3Table
09c0: 4c 6f 63 6b 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  Lock())..*/.stat
09d0: 69 63 20 76 6f 69 64 20 63 6f 64 65 54 61 62 6c  ic void codeTabl
09e0: 65 4c 6f 63 6b 73 28 50 61 72 73 65 20 2a 70 50  eLocks(Parse *pP
09f0: 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  arse){.  int i;.
0a00: 20 20 56 64 62 65 20 2a 70 56 64 62 65 3b 20 0a    Vdbe *pVdbe; .
0a10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
0a20: 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f  3ThreadDataReadO
0a30: 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61 72 65 64  nly()->useShared
0a40: 44 61 74 61 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Data || pParse->
0a50: 6e 54 61 62 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  nTableLock==0 );
0a60: 0a 0a 20 20 69 66 28 20 30 3d 3d 28 70 56 64 62  ..  if( 0==(pVdb
0a70: 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  e = sqlite3GetVd
0a80: 62 65 28 70 50 61 72 73 65 29 29 20 29 7b 0a 20  be(pParse)) ){. 
0a90: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
0aa0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
0ab0: 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b  rse->nTableLock;
0ac0: 20 69 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65   i++){.    Table
0ad0: 4c 6f 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73  Lock *p = &pPars
0ae0: 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d  e->aTableLock[i]
0af0: 3b 0a 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70  ;.    int p1 = p
0b00: 2d 3e 69 44 62 3b 0a 20 20 20 20 69 66 28 20 70  ->iDb;.    if( p
0b10: 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 29 7b  ->isWriteLock ){
0b20: 0a 20 20 20 20 20 20 70 31 20 3d 20 2d 31 2a 28  .      p1 = -1*(
0b30: 70 31 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p1+1);.    }.   
0b40: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
0b50: 70 56 64 62 65 2c 20 4f 50 5f 54 61 62 6c 65 4c  pVdbe, OP_TableL
0b60: 6f 63 6b 2c 20 70 31 2c 20 70 2d 3e 69 54 61 62  ock, p1, p->iTab
0b70: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  , p->zName, P3_S
0b80: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0b90: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ba0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0bb0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
0bc0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
0bd0: 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69 6e  lled after a sin
0be0: 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  gle SQL statemen
0bf0: 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61  t has been.** pa
0c00: 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45 20  rsed and a VDBE 
0c10: 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75  program to execu
0c20: 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  te that statemen
0c30: 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72  t has been.** pr
0c40: 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72 6f  epared.  This ro
0c50: 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20 66  utine puts the f
0c60: 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65 73  inishing touches
0c70: 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 20   on the.** VDBE 
0c80: 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73 65  program and rese
0c90: 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73 74  ts the pParse st
0ca0: 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20  ructure for the 
0cb0: 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a  next.** parse..*
0cc0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
0cd0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
0ce0: 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62 65  red, it might be
0cf0: 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a   the case that.*
0d00: 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20 77  * no VDBE code w
0d10: 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f  as generated..*/
0d20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69 6e  .void sqlite3Fin
0d30: 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65 20  ishCoding(Parse 
0d40: 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
0d50: 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
0d60: 2a 76 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  *v;..  if( sqlit
0d70: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
0d80: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
0d90: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20   pParse->nested 
0da0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
0db0: 21 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29  !pParse->pVdbe )
0dc0: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
0dd0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
0de0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  && pParse->nErr 
0df0: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
0e00: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
0e10: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OR;.    }.    re
0e20: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
0e30: 42 65 67 69 6e 20 62 79 20 67 65 6e 65 72 61 74  Begin by generat
0e40: 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61  ing some termina
0e50: 74 69 6f 6e 20 63 6f 64 65 20 61 74 20 74 68 65  tion code at the
0e60: 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a   end of the.  **
0e70: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 0a 20 20   vdbe program.  
0e80: 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
0e90: 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73 71 6c 69  ->db;.  v = sqli
0ea0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
0eb0: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
0ec0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
0ed0: 64 4f 70 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  dOp(v, OP_Halt, 
0ee0: 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  0, 0);..    /* T
0ef0: 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63  he cookie mask c
0f00: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74 20  ontains one bit 
0f10: 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73  for each databas
0f20: 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20  e file open..   
0f30: 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66 6f   ** (Bit 0 is fo
0f40: 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69 73  r main, bit 1 is
0f50: 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20 73   for temp, and s
0f60: 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73 20  o forth.)  Bits 
0f70: 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 66  are.    ** set f
0f80: 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65  or each database
0f90: 20 74 68 61 74 20 69 73 20 75 73 65 64 2e 20 20   that is used.  
0fa0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
0fb0: 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a 20   start a.    ** 
0fc0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65  transaction on e
0fd0: 61 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73  ach used databas
0fe0: 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79 20  e and to verify 
0ff0: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
1000: 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68  e.    ** on each
1010: 20 75 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a   used database..
1020: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1030: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
1040: 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 33 32  o>0 ){.      u32
1050: 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69 6e 74   mask;.      int
1060: 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71 6c 69   iDb;.      sqli
1070: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1080: 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  v, pParse->cooki
1090: 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20 20 20  eGoto-1);.      
10a0: 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d  for(iDb=0, mask=
10b0: 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  1; iDb<db->nDb; 
10c0: 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29  mask<<=1, iDb++)
10d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
10e0: 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 63 6f  ask & pParse->co
10f0: 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63  okieMask)==0 ) c
1100: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1110: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1120: 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  p(v, OP_Transact
1130: 69 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20  ion, iDb, (mask 
1140: 26 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d  & pParse->writeM
1150: 61 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20  ask)!=0);.      
1160: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1170: 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43  Op(v, OP_VerifyC
1180: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50 61 72  ookie, iDb, pPar
1190: 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b  se->cookieValue[
11a0: 69 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  iDb]);.      }..
11b0: 20 20 20 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c        /* Once al
11c0: 6c 20 74 68 65 20 63 6f 6f 6b 69 65 73 20 68 61  l the cookies ha
11d0: 76 65 20 62 65 65 6e 20 76 65 72 69 66 69 65 64  ve been verified
11e0: 20 61 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   and transaction
11f0: 73 20 6f 70 65 6e 65 64 2c 20 0a 20 20 20 20 20  s opened, .     
1200: 20 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 72   ** obtain the r
1210: 65 71 75 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f  equired table-lo
1220: 63 6b 73 2e 20 54 68 69 73 20 69 73 20 61 20 6e  cks. This is a n
1230: 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 74 68 65 20  o-op unless the 
1240: 0a 20 20 20 20 20 20 2a 2a 20 73 68 61 72 65 64  .      ** shared
1250: 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20 69  -cache feature i
1260: 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20  s enabled..     
1270: 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 54 61   */.      codeTa
1280: 62 6c 65 4c 6f 63 6b 73 28 70 50 61 72 73 65 29  bleLocks(pParse)
1290: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
12a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
12b0: 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  oto, 0, pParse->
12c0: 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b 0a 20 20 20  cookieGoto);.   
12d0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
12e0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20  TE_OMIT_TRACE.  
12f0: 20 20 2f 2a 20 41 64 64 20 61 20 4e 6f 2d 6f 70    /* Add a No-op
1300: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
1310: 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
1320: 20 6f 66 20 74 68 65 20 63 6f 6d 70 69 6c 65 64   of the compiled
1330: 20 53 51 4c 0a 20 20 20 20 2a 2a 20 73 74 61 74   SQL.    ** stat
1340: 65 6d 65 6e 74 20 61 73 20 69 74 73 20 50 33 20  ement as its P3 
1350: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20  argument.  This 
1360: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
1370: 74 68 65 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  the functionalit
1380: 79 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  y.    ** of the 
1390: 70 72 6f 67 72 61 6d 2e 20 0a 20 20 20 20 2a 2a  program. .    **
13a0: 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
13b0: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
13c0: 74 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28  t sqlite3_trace(
13d0: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  )..    */.    sq
13e0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
13f0: 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20 70  OP_Noop, 0, 0, p
1400: 50 61 72 73 65 2d 3e 7a 53 71 6c 2c 20 70 50 61  Parse->zSql, pPa
1410: 72 73 65 2d 3e 7a 54 61 69 6c 2d 70 50 61 72 73  rse->zTail-pPars
1420: 65 2d 3e 7a 53 71 6c 29 3b 0a 23 65 6e 64 69 66  e->zSql);.#endif
1430: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1440: 54 52 41 43 45 20 2a 2f 0a 20 20 7d 0a 0a 0a 20  TRACE */.  }... 
1450: 20 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45   /* Get the VDBE
1460: 20 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66   program ready f
1470: 6f 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a  or execution.  *
1480: 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61  /.  if( v && pPa
1490: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
14a0: 20 20 20 20 46 49 4c 45 20 2a 74 72 61 63 65 20      FILE *trace 
14b0: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
14c0: 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 29  QLITE_VdbeTrace)
14d0: 21 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a 20 30  !=0 ? stdout : 0
14e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14f0: 65 54 72 61 63 65 28 76 2c 20 74 72 61 63 65 29  eTrace(v, trace)
1500: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1510: 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70 50  eMakeReady(v, pP
1520: 61 72 73 65 2d 3e 6e 56 61 72 2c 20 70 50 61 72  arse->nVar, pPar
1530: 73 65 2d 3e 6e 4d 65 6d 2b 33 2c 0a 20 20 20 20  se->nMem+3,.    
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1550: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
1560: 62 2b 33 2c 20 70 50 61 72 73 65 2d 3e 65 78 70  b+3, pParse->exp
1570: 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50 61 72 73  lain);.    pPars
1580: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44  e->rc = SQLITE_D
1590: 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ONE;.    pParse-
15a0: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30  >colNamesSet = 0
15b0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
15c0: 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  arse->rc==SQLITE
15d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 72 73  _OK ){.    pPars
15e0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
15f0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72  RROR;.  }.  pPar
1600: 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20  se->nTab = 0;.  
1610: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30  pParse->nMem = 0
1620: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74  ;.  pParse->nSet
1630: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
1640: 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72  nVar = 0;.  pPar
1650: 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d  se->cookieMask =
1660: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   0;.  pParse->co
1670: 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a  okieGoto = 0;.}.
1680: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70  ./*.** Run the p
1690: 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67  arser and code g
16a0: 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69  enerator recursi
16b0: 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  vely in order to
16c0: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64   generate.** cod
16d0: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74  e for the SQL st
16e0: 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e  atement given on
16f0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1700: 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74  e pParse context
1710: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
1720: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1730: 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73  .  When the pars
1740: 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73  er is run recurs
1750: 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61  ively.** this wa
1760: 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f  y, the final OP_
1770: 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65  Halt is not appe
1780: 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69  nded and other i
1790: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a  nitialization.**
17a0: 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f   and finalizatio
17b0: 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74  n steps are omit
17c0: 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73  ted because thos
17d0: 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62  e are handling b
17e0: 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f  y the.** outermo
17f0: 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a  st parser..**.**
1800: 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20   Not everything 
1810: 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68  is nestable.  Th
1820: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64  is facility is d
1830: 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69  esigned to permi
1840: 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44  t.** INSERT, UPD
1850: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20  ATE, and DELETE 
1860: 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e  operations again
1870: 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  st SQLITE_MASTER
1880: 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69  .  Use.** care i
1890: 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20  f you decide to 
18a0: 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20  try to use this 
18b0: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65  routine for some
18c0: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e   other purposes.
18d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18e0: 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73  NestedParse(Pars
18f0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1900: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
1910: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1920: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ap;.  char *zSql
1930: 3b 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45 5f  ;.# define SAVE_
1940: 53 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72 73  SZ  (sizeof(Pars
1950: 65 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50 61  e) - offsetof(Pa
1960: 72 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68 61  rse,nVar)).  cha
1970: 72 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f 53  r saveBuf[SAVE_S
1980: 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Z];..  if( pPars
1990: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
19a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
19b0: 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b  se->nested<10 );
19c0: 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f    /* Nesting sho
19d0: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c  uld only be of l
19e0: 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a  imited depth */.
19f0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
1a00: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20  Format);.  zSql 
1a10: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
1a20: 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  f(zFormat, ap);.
1a30: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
1a40: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
1a50: 20 20 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20     return;   /* 
1a60: 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  A malloc must ha
1a70: 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d  ve failed */.  }
1a80: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  .  pParse->neste
1a90: 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61  d++;.  memcpy(sa
1aa0: 76 65 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e  veBuf, &pParse->
1ab0: 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  nVar, SAVE_SZ);.
1ac0: 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65    memset(&pParse
1ad0: 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f  ->nVar, 0, SAVE_
1ae0: 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75  SZ);.  sqlite3Ru
1af0: 6e 50 61 72 73 65 72 28 70 50 61 72 73 65 2c 20  nParser(pParse, 
1b00: 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 73 71 6c 69  zSql, 0);.  sqli
1b10: 74 65 46 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  teFree(zSql);.  
1b20: 6d 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e  memcpy(&pParse->
1b30: 6e 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53  nVar, saveBuf, S
1b40: 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73  AVE_SZ);.  pPars
1b50: 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a  e->nested--;.}..
1b60: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
1b70: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
1b80: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
1b90: 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  bes a particular
1ba0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62   database.** tab
1bb0: 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  le given the nam
1bc0: 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  e of that table 
1bd0: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
1be0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1bf0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
1c00: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
1c10: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
1c20: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
1c30: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
1c40: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
1c50: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
1c60: 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  d for the table 
1c70: 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  and the.** first
1c80: 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20   matching table 
1c90: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
1ca0: 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64  o checking for d
1cb0: 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a  uplicate table.*
1cc0: 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  * names is done.
1cd0: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
1ce0: 64 65 72 20 69 73 20 54 45 4d 50 20 66 69 72 73  der is TEMP firs
1cf0: 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68  t, then MAIN, th
1d00: 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69  en any.** auxili
1d10: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
1d20: 64 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54  ded using the AT
1d30: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  TACH command..**
1d40: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
1d50: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
1d60: 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  )..*/.Table *sql
1d70: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71  ite3FindTable(sq
1d80: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
1d90: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
1da0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62  nst char *zDatab
1db0: 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ase){.  Table *p
1dc0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
1dd0: 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d   assert( zName!=
1de0: 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49  0 );.  for(i=OMI
1df0: 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e  T_TEMPDB; i<db->
1e00: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
1e10: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
1e20: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
1e30: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
1e40: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
1e50: 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20  zDatabase!=0 && 
1e60: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1e70: 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44  Database, db->aD
1e80: 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f  b[j].zName) ) co
1e90: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20  ntinue;.    p = 
1ea0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
1eb0: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68  &db->aDb[j].pSch
1ec0: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e  ema->tblHash, zN
1ed0: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
1ee0: 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70  e)+1);.    if( p
1ef0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
1f00: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
1f10: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
1f20: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
1f30: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
1f40: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
1f50: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
1f60: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
1f70: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
1f80: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
1f90: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
1fa0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
1fb0: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
1fc0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
1fd0: 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f  not found.  Also
1fe0: 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72   leave an.** err
1ff0: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
2000: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
2010: 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
2020: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
2030: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c   routine and sql
2040: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20  ite3FindTable() 
2050: 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
2060: 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61  routine leaves a
2070: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2080: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
2090: 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69  sg where.** sqli
20a0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64  te3FindTable() d
20b0: 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c  oes not..*/.Tabl
20c0: 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  e *sqlite3Locate
20d0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
20e0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
20f0: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
2100: 61 72 20 2a 7a 44 62 61 73 65 29 7b 0a 20 20 54  ar *zDbase){.  T
2110: 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52  able *p;..  /* R
2120: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
2130: 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
2140: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
2150: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
2160: 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
2170: 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
2180: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
2190: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
21a0: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
21b0: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
21c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
21d0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69  .  p = sqlite3Fi
21e0: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
21f0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73  db, zName, zDbas
2200: 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  e);.  if( p==0 )
2210: 7b 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73 65  {.    if( zDbase
2220: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2230: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2240: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
2250: 3a 20 25 73 2e 25 73 22 2c 20 7a 44 62 61 73 65  : %s.%s", zDbase
2260: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  , zName);.    }e
2270: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2280: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2290: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
22a0: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
22b0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
22c0: 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
22d0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
22e0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
22f0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
2300: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2310: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
2320: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
2330: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
2340: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a  of that index.**
2350: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   and the name of
2360: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
2370: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
2380: 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e  index..** Return
2390: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
23a0: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
23b0: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
23c0: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
23d0: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a  earched for the.
23e0: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  ** table and the
23f0: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
2400: 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65  index is returne
2410: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
2420: 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74  .** for duplicat
2430: 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73  e index names is
2440: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
2450: 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20  rch order is.** 
2460: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
2470: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20   MAIN, then any 
2480: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
2490: 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69  ses added.** usi
24a0: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
24b0: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20  mmand..*/.Index 
24c0: 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65  *sqlite3FindInde
24d0: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  x(sqlite3 *db, c
24e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
24f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
2500: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  b){.  Index *p =
2510: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
2520: 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42  or(i=OMIT_TEMPDB
2530: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
2540: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  ){.    int j = (
2550: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
2560: 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20   /* Search TEMP 
2570: 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20  before MAIN */. 
2580: 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
2590: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  ma = db->aDb[j].
25a0: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28  pSchema;.    if(
25b0: 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53   zDb && sqlite3S
25c0: 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e  trICmp(zDb, db->
25d0: 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20  aDb[j].zName) ) 
25e0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
25f0: 73 65 72 74 28 20 70 53 63 68 65 6d 61 20 7c 7c  sert( pSchema ||
2600: 20 28 6a 3d 3d 31 20 26 26 20 21 64 62 2d 3e 61   (j==1 && !db->a
2610: 44 62 5b 31 5d 2e 70 42 74 29 20 29 3b 0a 20 20  Db[1].pBt) );.  
2620: 20 20 69 66 28 20 70 53 63 68 65 6d 61 20 29 7b    if( pSchema ){
2630: 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74  .      p = sqlit
2640: 65 33 48 61 73 68 46 69 6e 64 28 26 70 53 63 68  e3HashFind(&pSch
2650: 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e  ema->idxHash, zN
2660: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
2670: 65 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e)+1);.    }.   
2680: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
2690: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
26a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d  }../*.** Reclaim
26b0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64   the memory used
26c0: 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a   by an index.*/.
26d0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
26e0: 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 29 7b  Index(Index *p){
26f0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d  .  sqliteFree(p-
2700: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
2710: 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f  iteFree(p);.}../
2720: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
2730: 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d  given index from
2740: 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20   the index hash 
2750: 74 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a  table, and free.
2760: 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74  ** its memory st
2770: 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  ructures..**.** 
2780: 54 68 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d  The index is rem
2790: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  oved from the da
27a0: 74 61 62 61 73 65 20 68 61 73 68 20 74 61 62 6c  tabase hash tabl
27b0: 65 73 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20  es but.** it is 
27c0: 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  not unlinked fro
27d0: 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68 61 74  m the Table that
27e0: 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20   it indexes..** 
27f0: 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74  Unlinking from t
2800: 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65  he Table must be
2810: 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c   done by the cal
2820: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
2830: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
2840: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
2850: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64  sqlite3 *db, Ind
2860: 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20  ex *p){.  Index 
2870: 2a 70 4f 6c 64 3b 0a 20 20 63 6f 6e 73 74 20 63  *pOld;.  const c
2880: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e  har *zName = p->
2890: 7a 4e 61 6d 65 3b 0a 0a 20 20 70 4f 6c 64 20 3d  zName;..  pOld =
28a0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
28b0: 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e  rt(&p->pSchema->
28c0: 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  idxHash, zName, 
28d0: 73 74 72 6c 65 6e 28 20 7a 4e 61 6d 65 29 2b 31  strlen( zName)+1
28e0: 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
28f0: 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d  pOld==0 || pOld=
2900: 3d 70 20 29 3b 0a 20 20 66 72 65 65 49 6e 64 65  =p );.  freeInde
2910: 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  x(p);.}../*.** F
2920: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c  or the index cal
2930: 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69  led zIdxName whi
2940: 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  ch is found in t
2950: 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c  he database iDb,
2960: 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20  .** unlike that 
2970: 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54  index from its T
2980: 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65  able then remove
2990: 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a   the index from.
29a0: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  ** the index has
29b0: 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65  h table and free
29c0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75   all memory stru
29d0: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
29e0: 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  d.** with the in
29f0: 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  dex..*/.void sql
2a00: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
2a10: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  eteIndex(sqlite3
2a20: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
2a30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e  onst char *zIdxN
2a40: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
2a50: 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c 65 6e  Index;.  int len
2a60: 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 20  ;.  Hash *pHash 
2a70: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  = &db->aDb[iDb].
2a80: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
2a90: 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  ;..  len = strle
2aa0: 6e 28 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70  n(zIdxName);.  p
2ab0: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 48  Index = sqlite3H
2ac0: 61 73 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c  ashInsert(pHash,
2ad0: 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31   zIdxName, len+1
2ae0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  , 0);.  if( pInd
2af0: 65 78 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ex ){.    if( pI
2b00: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
2b10: 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  ndex==pIndex ){.
2b20: 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54        pIndex->pT
2b30: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70  able->pIndex = p
2b40: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
2b50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
2b60: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 66  ndex *p;.      f
2b70: 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61  or(p=pIndex->pTa
2b80: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  ble->pIndex; p &
2b90: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
2ba0: 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b  ex; p=p->pNext){
2bb0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20 26 26  }.      if( p &&
2bc0: 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65   p->pNext==pInde
2bd0: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  x ){.        p->
2be0: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
2bf0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
2c00: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64     }.    freeInd
2c10: 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  ex(pIndex);.  }.
2c20: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
2c30: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
2c40: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  ges;.}../*.** Er
2c50: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
2c60: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
2c70: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
2c80: 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20  sh tables of.** 
2c90: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
2ca0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
2cb0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
2cc0: 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20  claim memory.** 
2cd0: 62 65 66 6f 72 65 20 74 68 65 20 64 61 74 61 62  before the datab
2ce0: 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49 74 20  ase closes.  It 
2cf0: 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64  is also called d
2d00: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
2d10: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72  .** if there wer
2d20: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
2d30: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
2d40: 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a  saction or if a.
2d50: 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65  ** schema-cookie
2d60: 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75 72 73   mismatch occurs
2d70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 3d  ..**.** If iDb<=
2d80: 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65  0 then reset the
2d90: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
2da0: 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20   tables for all 
2db0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
2dc0: 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20 74 68  s.  If iDb>=2 th
2dd0: 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74  en reset the int
2de0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72  ernal schema for
2df0: 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e   only the.** sin
2e00: 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74  gle file indicat
2e10: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
2e20: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
2e30: 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a  Schema(sqlite3 *
2e40: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
2e50: 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73 73  int i, j;..  ass
2e60: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
2e70: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
2e80: 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d  for(i=iDb; i<db-
2e90: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
2ea0: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
2eb0: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
2ec0: 44 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Db->pSchema ){. 
2ed0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65       sqlite3Sche
2ee0: 6d 61 46 72 65 65 28 70 44 62 2d 3e 70 53 63 68  maFree(pDb->pSch
2ef0: 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ema);.    }.    
2f00: 69 66 28 20 69 44 62 3e 30 20 29 20 72 65 74 75  if( iDb>0 ) retu
2f10: 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
2f20: 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62  ( iDb==0 );.  db
2f30: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
2f40: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
2f50: 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f  ;..  /* If one o
2f60: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 61 75  r more of the au
2f70: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2f80: 20 66 69 6c 65 73 20 68 61 73 20 62 65 65 6e 20   files has been 
2f90: 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65  closed,.  ** the
2fa0: 6e 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72  n remove them fr
2fb0: 6f 6d 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  om the auxiliary
2fc0: 20 64 61 74 61 62 61 73 65 20 6c 69 73 74 2e 20   database list. 
2fd0: 20 57 65 20 74 61 6b 65 20 74 68 65 0a 20 20 2a   We take the.  *
2fe0: 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  * opportunity to
2ff0: 20 64 6f 20 74 68 69 73 20 68 65 72 65 20 73 69   do this here si
3000: 6e 63 65 20 77 65 20 68 61 76 65 20 6a 75 73 74  nce we have just
3010: 20 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20   deleted all of 
3020: 74 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20  the.  ** schema 
3030: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
3040: 74 68 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74  therefore do not
3050: 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e   have to make an
3060: 79 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74  y changes.  ** t
3070: 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 74  o any of those t
3080: 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ables..  */.  fo
3090: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
30a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
30b0: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
30c0: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
30d0: 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b  ( pDb->pBt==0 ){
30e0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
30f0: 70 41 75 78 20 26 26 20 70 44 62 2d 3e 78 46 72  pAux && pDb->xFr
3100: 65 65 41 75 78 20 29 20 70 44 62 2d 3e 78 46 72  eeAux ) pDb->xFr
3110: 65 65 41 75 78 28 70 44 62 2d 3e 70 41 75 78 29  eeAux(pDb->pAux)
3120: 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 41 75  ;.      pDb->pAu
3130: 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
3140: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
3150: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3160: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
3170: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
3180: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
3190: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
31a0: 6c 69 74 65 46 72 65 65 28 70 44 62 2d 3e 7a 4e  liteFree(pDb->zN
31b0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  ame);.      pDb-
31c0: 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  >zName = 0;.    
31d0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
31e0: 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b  }.    if( j<i ){
31f0: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a  .      db->aDb[j
3200: 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a  ] = db->aDb[i];.
3210: 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20      }.    j++;. 
3220: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d   }.  memset(&db-
3230: 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d  >aDb[j], 0, (db-
3240: 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64  >nDb-j)*sizeof(d
3250: 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64  b->aDb[j]));.  d
3260: 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66  b->nDb = j;.  if
3270: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20  ( db->nDb<=2 && 
3280: 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62  db->aDb!=db->aDb
3290: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65  Static ){.    me
32a0: 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74  mcpy(db->aDbStat
32b0: 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73  ic, db->aDb, 2*s
32c0: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d  izeof(db->aDb[0]
32d0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ));.    sqliteFr
32e0: 65 65 28 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20  ee(db->aDb);.   
32f0: 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
3300: 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a  DbStatic;.  }.}.
3310: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3320: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
3330: 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63  enever a rollbac
3340: 6b 20 6f 63 63 75 72 73 2e 20 20 49 66 20 74 68  k occurs.  If th
3350: 65 72 65 20 77 65 72 65 0a 2a 2a 20 73 63 68 65  ere were.** sche
3360: 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e  ma changes durin
3370: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
3380: 6e 2c 20 74 68 65 6e 20 77 65 20 68 61 76 65 20  n, then we have 
3390: 74 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20  to reset the.** 
33a0: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
33b0: 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f 61 64 20  bles and reload 
33c0: 74 68 65 6d 20 66 72 6f 6d 20 64 69 73 6b 2e 0a  them from disk..
33d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
33e0: 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43  ollbackInternalC
33f0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
3400: 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66  db){.  if( db->f
3410: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
3420: 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20  ternChanges ){. 
3430: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
3440: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
3450: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
3460: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3470: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
3480: 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a   commit occurs..
3490: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
34a0: 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
34b0: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
34c0: 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  ){.  db->flags &
34d0: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
34e0: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
34f0: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
3500: 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 61 20  mn names from a 
3510: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2e 0a 2a  table or view..*
3520: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
3530: 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e  liteResetColumnN
3540: 61 6d 65 73 28 54 61 62 6c 65 20 2a 70 54 61 62  ames(Table *pTab
3550: 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  le){.  int i;.  
3560: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
3570: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d  assert( pTable!=
3580: 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c  0 );.  if( (pCol
3590: 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29   = pTable->aCol)
35a0: 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  !=0 ){.    for(i
35b0: 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  =0; i<pTable->nC
35c0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
35d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
35e0: 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  ee(pCol->zName);
35f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
3600: 70 72 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70  prDelete(pCol->p
3610: 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Dflt);.      sql
3620: 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54  iteFree(pCol->zT
3630: 79 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ype);.      sqli
3640: 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 43 6f  teFree(pCol->zCo
3650: 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ll);.    }.    s
3660: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
3670: 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 70  ->aCol);.  }.  p
3680: 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b  Table->aCol = 0;
3690: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
36a0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  = 0;.}../*.** Re
36b0: 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  move the memory 
36c0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
36d0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
36e0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62  the given.** Tab
36f0: 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20  le.  No changes 
3700: 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b  are made to disk
3710: 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
3720: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3730: 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65  tine just delete
3740: 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63  s the data struc
3750: 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e  ture.  It does n
3760: 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65  ot unlink.** the
3770: 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75   table data stru
3780: 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68  cture from the h
3790: 61 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f 72 20  ash table.  Nor 
37a0: 64 6f 65 73 20 69 74 20 72 65 6d 6f 76 65 0a 2a  does it remove.*
37b0: 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 66  * foreign keys f
37c0: 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 2e 61  rom the sqlite.a
37d0: 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65 2e  FKey hash table.
37e0: 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65    But it does de
37f0: 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20  stroy.** memory 
3800: 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68  structures of th
3810: 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f  e indices and fo
3820: 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63  reign keys assoc
3830: 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74  iated with .** t
3840: 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
3850: 49 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  Indices associat
3860: 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
3870: 65 20 61 72 65 20 75 6e 6c 69 6e 6b 65 64 20 66  e are unlinked f
3880: 72 6f 6d 20 74 68 65 20 22 64 62 22 0a 2a 2a 20  rom the "db".** 
3890: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69  data structure i
38a0: 66 20 64 62 21 3d 4e 55 4c 4c 2e 20 20 49 66 20  f db!=NULL.  If 
38b0: 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63 65  db==NULL, indice
38c0: 73 20 61 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a  s attached to.**
38d0: 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 64   the table are d
38e0: 65 6c 65 74 65 64 2c 20 62 75 74 20 69 74 20 69  eleted, but it i
38f0: 73 20 61 73 73 75 6d 65 64 20 74 68 65 79 20 68  s assumed they h
3900: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
3910: 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f  .** unlinked..*/
3920: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c  .void sqlite3Del
3930: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
3940: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
3950: 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ble){.  Index *p
3960: 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20  Index, *pNext;. 
3970: 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c 20 2a 70   FKey *pFKey, *p
3980: 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20 64 62 20  NextFKey;..  db 
3990: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  = 0;..  if( pTab
39a0: 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  le==0 ) return;.
39b0: 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c  .  /* Do not del
39c0: 65 74 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e  ete the table un
39d0: 74 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63  til the referenc
39e0: 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  e count reaches 
39f0: 7a 65 72 6f 2e 20 2a 2f 0a 20 20 70 54 61 62 6c  zero. */.  pTabl
3a00: 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
3a10: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3e 30 20   pTable->nRef>0 
3a20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
3a30: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61   }.  assert( pTa
3a40: 62 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  ble->nRef==0 );.
3a50: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c  .  /* Delete all
3a60: 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
3a70: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61  ted with this ta
3a80: 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  ble.  */.  for(p
3a90: 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e  Index = pTable->
3aa0: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
3ab0: 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20  pIndex=pNext){. 
3ac0: 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65     pNext = pInde
3ad0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73  x->pNext;.    as
3ae0: 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53  sert( pIndex->pS
3af0: 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70  chema==pTable->p
3b00: 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71  Schema );.    sq
3b10: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
3b20: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d  db, pIndex);.  }
3b30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3b40: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
3b50: 59 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  Y.  /* Delete al
3b60: 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  l foreign keys a
3b70: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
3b80: 68 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65 20  his table.  The 
3b90: 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  keys.  ** should
3ba0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
3bb0: 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d  en unlinked from
3bc0: 20 74 68 65 20 64 62 2d 3e 61 46 4b 65 79 20 68   the db->aFKey h
3bd0: 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a  ash table .  */.
3be0: 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62    for(pFKey=pTab
3bf0: 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79  le->pFKey; pFKey
3c00: 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65  ; pFKey=pNextFKe
3c10: 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65  y){.    pNextFKe
3c20: 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  y = pFKey->pNext
3c30: 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  From;.    assert
3c40: 28 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  ( sqlite3HashFin
3c50: 64 28 26 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  d(&pTable->pSche
3c60: 6d 61 2d 3e 61 46 4b 65 79 2c 0a 20 20 20 20 20  ma->aFKey,.     
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c80: 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f        pFKey->zTo
3c90: 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e  , strlen(pFKey->
3ca0: 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20 29  zTo)+1)!=pFKey )
3cb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
3cc0: 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e  (pFKey);.  }.#en
3cd0: 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  dif..  /* Delete
3ce0: 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
3cf0: 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  ture itself..  *
3d00: 2f 0a 20 20 73 71 6c 69 74 65 52 65 73 65 74 43  /.  sqliteResetC
3d10: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 6c  olumnNames(pTabl
3d20: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
3d30: 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b  (pTable->zName);
3d40: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
3d50: 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  able->zColAff);.
3d60: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
3d70: 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53  elete(pTable->pS
3d80: 65 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20  elect);.#ifndef 
3d90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
3da0: 4b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  K.  sqlite3ExprD
3db0: 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 43  elete(pTable->pC
3dc0: 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20  heck);.#endif.  
3dd0: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
3de0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  e);.}../*.** Unl
3df0: 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61  ink the given ta
3e00: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73  ble from the has
3e10: 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65  h tables and the
3e20: 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74   delete the.** t
3e30: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77  able structure w
3e40: 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69  ith all its indi
3e50: 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20  ces and foreign 
3e60: 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  keys..*/.void sq
3e70: 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
3e80: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
3e90: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
3ea0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
3eb0: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
3ec0: 70 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20  p;.  FKey *pF1, 
3ed0: 2a 70 46 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b  *pF2;.  Db *pDb;
3ee0: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
3ef0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
3f00: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
3f10: 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
3f20: 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a 54  ( zTabName && zT
3f30: 61 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70  abName[0] );.  p
3f40: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
3f50: 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  b];.  p = sqlite
3f60: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
3f70: 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
3f80: 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 73 74  sh, zTabName, st
3f90: 72 6c 65 6e 28 7a 54 61 62 4e 61 6d 65 29 2b 31  rlen(zTabName)+1
3fa0: 2c 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ,0);.  if( p ){.
3fb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3fc0: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
3fd0: 20 20 20 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70      for(pF1=p->p
3fe0: 46 4b 65 79 3b 20 70 46 31 3b 20 70 46 31 3d 70  FKey; pF1; pF1=p
3ff0: 46 31 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a  F1->pNextFrom){.
4000: 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20        int nTo = 
4010: 73 74 72 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29  strlen(pF1->zTo)
4020: 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 32 20   + 1;.      pF2 
4030: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
4040: 64 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  d(&pDb->pSchema-
4050: 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f  >aFKey, pF1->zTo
4060: 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 69 66  , nTo);.      if
4070: 28 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20  ( pF2==pF1 ){.  
4080: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73        sqlite3Has
4090: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
40a0: 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46  chema->aFKey, pF
40b0: 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31  1->zTo, nTo, pF1
40c0: 2d 3e 70 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20  ->pNextTo);.    
40d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
40e0: 20 77 68 69 6c 65 28 20 70 46 32 20 26 26 20 70   while( pF2 && p
40f0: 46 32 2d 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31  F2->pNextTo!=pF1
4100: 20 29 7b 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65   ){ pF2=pF2->pNe
4110: 78 74 54 6f 3b 20 7d 0a 20 20 20 20 20 20 20 20  xtTo; }.        
4120: 69 66 28 20 70 46 32 20 29 7b 0a 20 20 20 20 20  if( pF2 ){.     
4130: 20 20 20 20 20 70 46 32 2d 3e 70 4e 65 78 74 54       pF2->pNextT
4140: 6f 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f  o = pF1->pNextTo
4150: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4160: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
4170: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
4180: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a  teTable(db, p);.
4190: 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20    }.  db->flags 
41a0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
41b0: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
41c0: 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c  * Given a token,
41d0: 20 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67   return a string
41e0: 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
41f0: 66 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  f the text of th
4200: 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69 74 68  at.** token with
4210: 20 61 6e 79 20 71 75 6f 74 61 74 69 6f 6e 73 20   any quotations 
4220: 72 65 6d 6f 76 65 64 2e 20 20 53 70 61 63 65 20  removed.  Space 
4230: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
4240: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
4250: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
4260: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
4270: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
4280: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
4290: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  ** function..**.
42a0: 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66  ** Tokens are of
42b0: 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72  ten just pointer
42c0: 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  s into the origi
42d0: 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64  nal SQL text and
42e0: 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c   so.** are not \
42f0: 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61  000 terminated a
4300: 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69  nd are not persi
4310: 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75  stent.  The retu
4320: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
4330: 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  s \000 terminate
4340: 64 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74  d and is persist
4350: 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  ent..*/.char *sq
4360: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
4370: 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  en(Token *pName)
4380: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
4390: 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
43a0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
43b0: 74 65 53 74 72 4e 44 75 70 28 28 63 68 61 72 2a  teStrNDup((char*
43c0: 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65  )pName->z, pName
43d0: 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ->n);.    sqlite
43e0: 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b  3Dequote(zName);
43f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e  .  }else{.    zN
4400: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
4410: 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a  eturn zName;.}..
4420: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73  /*.** Open the s
4430: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
4440: 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74  le stored in dat
4450: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62  abase number iDb
4460: 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e   for.** writing.
4470: 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70   The table is op
4480: 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f  ened using curso
4490: 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  r 0..*/.void sql
44a0: 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61  ite3OpenMasterTa
44b0: 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20 69 6e  ble(Parse *p, in
44c0: 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
44d0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
44e0: 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  be(p);.  sqlite3
44f0: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62  TableLock(p, iDb
4500: 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31  , MASTER_ROOT, 1
4510: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
4520: 44 62 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Db));.  sqlite3V
4530: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
4540: 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b  nteger, iDb, 0);
4550: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
4560: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
4570: 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52  ite, 0, MASTER_R
4580: 4f 4f 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  OOT);.  sqlite3V
4590: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
45a0: 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c  etNumColumns, 0,
45b0: 20 35 29 3b 20 2f 2a 20 73 71 6c 69 74 65 5f 6d   5); /* sqlite_m
45c0: 61 73 74 65 72 20 68 61 73 20 35 20 63 6f 6c 75  aster has 5 colu
45d0: 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mns */.}../*.** 
45e0: 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65  The token *pName
45f0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
4600: 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  me of a database
4610: 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20   (either "main" 
4620: 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20  or.** "temp" or 
4630: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61  the name of an a
4640: 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69  ttached db). Thi
4650: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
4660: 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f  s the.** index o
4670: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61  f the named data
4680: 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b  base in db->aDb[
4690: 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20  ], or -1 if the 
46a0: 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65  named db .** doe
46b0: 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a  s not exist..*/.
46c0: 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44  int sqlite3FindD
46d0: 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  b(sqlite3 *db, T
46e0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
46f0: 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 2f  int i = -1;    /
4700: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
4710: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  r */.  int n;   
4720: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4730: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
4740: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 44   the name */.  D
4750: 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 2f 2a  b *pDb;       /*
4760: 20 41 20 64 61 74 61 62 61 73 65 20 77 68 6f 73   A database whos
4770: 65 20 6e 61 6d 65 20 73 70 61 63 65 20 69 73 20  e name space is 
4780: 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 2a  being searched *
4790: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
47a0: 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72     /* Name we ar
47b0: 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  e searching for 
47c0: 2a 2f 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71  */..  zName = sq
47d0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
47e0: 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  en(pName);.  if(
47f0: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 6e 20   zName ){.    n 
4800: 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
4810: 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e  .    for(i=(db->
4820: 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d  nDb-1), pDb=&db-
4830: 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69  >aDb[i]; i>=0; i
4840: 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20  --, pDb--){.    
4850: 20 20 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d    if( (!OMIT_TEM
4860: 50 44 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26  PDB || i!=1 ) &&
4870: 20 6e 3d 3d 73 74 72 6c 65 6e 28 70 44 62 2d 3e   n==strlen(pDb->
4880: 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20  zName) && .     
4890: 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53       0==sqlite3S
48a0: 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d  trICmp(pDb->zNam
48b0: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
48c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
48d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
48e0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
48f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
4900: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65  .}../* The table
4910: 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67   or view or trig
4920: 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73  ger name is pass
4930: 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ed to this routi
4940: 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a  ne via tokens.**
4950: 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d   pName1 and pNam
4960: 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  e2. If the table
4970: 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20   name was fully 
4980: 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65  qualified, for e
4990: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52  xample:.**.** CR
49a0: 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79  EATE TABLE xxx.y
49b0: 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a  yy (...);.** .**
49c0: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
49d0: 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64  set to "xxx" and
49e0: 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f   pName2 "yyy". O
49f0: 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
4a00: 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   if.** the table
4a10: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c   name is not ful
4a20: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e  ly qualified, i.
4a30: 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45  e.:.**.** CREATE
4a40: 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b   TABLE yyy(...);
4a50: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d  .**.** Then pNam
4a60: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79  e1 is set to "yy
4a70: 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73  y" and pName2 is
4a80: 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   ""..**.** This 
4a90: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
4aa0: 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74   *ppUnqual point
4ab0: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
4ac0: 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31  he token (pName1
4ad0: 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74   or.** pName2) t
4ae0: 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75  hat stores the u
4af0: 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65  nqualified table
4b00: 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65   name.  The inde
4b10: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  x of the.** data
4b20: 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65  base "xxx" is re
4b30: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
4b40: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
4b50: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
4b60: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
4b70: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
4b80: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
4b90: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
4ba0: 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e1,      /* The 
4bb0: 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d  "xxx" in the nam
4bc0: 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22  e "xxx.yyy" or "
4bd0: 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  xxx" */.  Token 
4be0: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a  *pName2,      /*
4bf0: 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68   The "yyy" in th
4c00: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
4c10: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55   */.  Token **pU
4c20: 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69  nqual     /* Wri
4c30: 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  te the unqualifi
4c40: 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68  ed object name h
4c50: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
4c60: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
4c70: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
4c80: 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ase holding the 
4c90: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
4ca0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
4cb0: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 4e 61  ->db;..  if( pNa
4cc0: 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e  me2 && pName2->n
4cd0: 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
4ce0: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
4cf0: 20 29 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c   );.    *pUnqual
4d00: 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69   = pName2;.    i
4d10: 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
4d20: 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  Db(db, pName1);.
4d30: 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b      if( iDb<0 ){
4d40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
4d50: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
4d60: 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65  unknown database
4d70: 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20   %T", pName1);. 
4d80: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
4d90: 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r++;.      retur
4da0: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n -1;.    }.  }e
4db0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
4dc0: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30   db->init.iDb==0
4dd0: 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   || db->init.bus
4de0: 79 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64  y );.    iDb = d
4df0: 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20  b->init.iDb;.   
4e00: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
4e10: 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e1;.  }.  return
4e20: 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   iDb;.}../*.** T
4e30: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
4e40: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20  sed to check if 
4e50: 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67  the UTF-8 string
4e60: 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61   zName is a lega
4e70: 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64  l.** unqualified
4e80: 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20   name for a new 
4e90: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74  schema object (t
4ea0: 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65  able, index, vie
4eb0: 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29  w or.** trigger)
4ec0: 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20  . All names are 
4ed0: 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f  legal except tho
4ee0: 73 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  se that begin wi
4ef0: 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a  th the string.**
4f00: 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75   "sqlite_" (in u
4f10: 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d  pper, lower or m
4f20: 69 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73  ixed case). This
4f30: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
4f40: 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20  namespace.** is 
4f50: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
4f60: 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e  ernal use..*/.in
4f70: 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  t sqlite3CheckOb
4f80: 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a  jectName(Parse *
4f90: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
4fa0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
4fb0: 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69  ( !pParse->db->i
4fc0: 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72  nit.busy && pPar
4fd0: 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20  se->nested==0 . 
4fe0: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61           && (pPa
4ff0: 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
5000: 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68   SQLITE_WriteSch
5010: 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ema)==0.        
5020: 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53    && 0==sqlite3S
5030: 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22  trNICmp(zName, "
5040: 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a  sqlite_", 7) ){.
5050: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5060: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a  Msg(pParse, "obj
5070: 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65  ect name reserve
5080: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
5090: 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  se: %s", zName);
50a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
50b0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
50c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
50d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
50e0: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20   constructing a 
50f0: 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73  new table repres
5100: 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f  entation in memo
5110: 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  ry.  This is.** 
5120: 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76  the first of sev
5130: 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74  eral action rout
5140: 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61  ines that get ca
5150: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65  lled in response
5160: 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20  .** to a CREATE 
5170: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
5180: 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c    In particular,
5190: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
51a0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72   called.** after
51b0: 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22   seeing tokens "
51c0: 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42  CREATE" and "TAB
51d0: 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c  LE" and the tabl
51e0: 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20  e name.  The.** 
51f0: 70 53 74 61 72 74 20 74 6f 6b 65 6e 20 69 73 20  pStart token is 
5200: 74 68 65 20 43 52 45 41 54 45 20 61 6e 64 20 70  the CREATE and p
5210: 4e 61 6d 65 20 69 73 20 74 68 65 20 74 61 62 6c  Name is the tabl
5220: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 73 54  e name.  The isT
5230: 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74  emp.** flag is t
5240: 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65  rue if the table
5250: 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
5260: 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61  d in the auxilia
5270: 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  ry database.** f
5280: 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ile instead of i
5290: 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
52a0: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
52b0: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20  is normally the 
52c0: 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65  case.** when the
52d0: 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50   "TEMP" or "TEMP
52e0: 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f  ORARY" keyword o
52f0: 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e  ccurs in between
5300: 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54  .** CREATE and T
5310: 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ABLE..**.** The 
5320: 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64  new table record
5330: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
5340: 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72 73  and put in pPars
5350: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a  e->pNewTable..**
5360: 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   As more of the 
5370: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
5380: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
5390: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74  , additional act
53a0: 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20  ion.** routines 
53b0: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74  will be called t
53c0: 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72  o add more infor
53d0: 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72  mation to this r
53e0: 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65  ecord..** At the
53f0: 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41   end of the CREA
5400: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
5410: 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45  nt, the sqlite3E
5420: 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e  ndTable() routin
5430: 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74  e.** is called t
5440: 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63  o complete the c
5450: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74  onstruction of t
5460: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
5470: 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ord..*/.void sql
5480: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a  ite3StartTable(.
5490: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
54a0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
54b0: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
54c0: 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68  *pStart,   /* Th
54d0: 65 20 22 43 52 45 41 54 45 22 20 74 6f 6b 65 6e  e "CREATE" token
54e0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
54f0: 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20  me1,   /* First 
5500: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
5510: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
5520: 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
5530: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53   *pName2,   /* S
5540: 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68  econd part of th
5550: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
5560: 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ble or view */. 
5570: 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20   int isTemp,    
5580: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
5590: 73 20 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c  s is a TEMP tabl
55a0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65  e */.  int isVie
55b0: 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  w,      /* True 
55c0: 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49 45  if this is a VIE
55d0: 57 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72  W */.  int noErr
55e0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
55f0: 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61  thing if table a
5600: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
5610: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
5620: 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  ble;.  char *zNa
5630: 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e  me = 0; /* The n
5640: 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ame of the new t
5650: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
5660: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
5670: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
5680: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
5690: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
56a0: 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74  mber to create t
56b0: 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20  he table in */. 
56c0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20   Token *pName;  
56d0: 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
56e0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
56f0: 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  le to create */.
5700: 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  .  /* The table 
5710: 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20  or view name to 
5720: 63 72 65 61 74 65 20 69 73 20 70 61 73 73 65 64  create is passed
5730: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
5740: 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a   via tokens.  **
5750: 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d   pName1 and pNam
5760: 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  e2. If the table
5770: 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20   name was fully 
5780: 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65  qualified, for e
5790: 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
57a0: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
57b0: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20  xx.yyy (...);.  
57c0: 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e  ** .  ** Then pN
57d0: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
57e0: 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  xxx" and pName2 
57f0: 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74  "yyy". On the ot
5800: 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a  her hand if.  **
5810: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
5820: 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61  is not fully qua
5830: 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20  lified, i.e.:.  
5840: 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54  **.  ** CREATE T
5850: 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20  ABLE yyy(...);. 
5860: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e   **.  ** Then pN
5870: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
5880: 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  yyy" and pName2 
5890: 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  is ""..  **.  **
58a0: 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20   The call below 
58b0: 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70  sets the pName p
58c0: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
58d0: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
58e0: 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61  ame1 or.  ** pNa
58f0: 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73  me2) that stores
5900: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
5910: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65   table name. The
5920: 20 76 61 72 69 61 62 6c 65 20 69 44 62 20 69 73   variable iDb is
5930: 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65  .  ** set to the
5940: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   index of the da
5950: 74 61 62 61 73 65 20 74 68 61 74 20 74 68 65 20  tabase that the 
5960: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73  table or view is
5970: 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61   to be.  ** crea
5980: 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69  ted in..  */.  i
5990: 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
59a0: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
59b0: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
59c0: 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  &pName);.  if( i
59d0: 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
59e0: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
59f0: 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 69  B && isTemp && i
5a00: 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Db>1 ){.    /* I
5a10: 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d  f creating a tem
5a20: 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d  p table, the nam
5a30: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61  e may not be qua
5a40: 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73 71  lified */.    sq
5a50: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5a60: 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79  arse, "temporary
5a70: 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74   table name must
5a80: 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22   be unqualified"
5a90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
5aa0: 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54   }.  if( !OMIT_T
5ab0: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
5ac0: 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50  ) iDb = 1;..  pP
5ad0: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
5ae0: 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61   = *pName;.  zNa
5af0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
5b00: 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
5b10: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
5b20: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
5b30: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
5b40: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
5b50: 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
5b60: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65  ) ){.    goto be
5b70: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
5b80: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69  .  }.  if( db->i
5b90: 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54  nit.iDb==1 ) isT
5ba0: 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  emp = 1;.#ifndef
5bb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
5bc0: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73  HORIZATION.  ass
5bd0: 65 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31  ert( (isTemp & 1
5be0: 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b  )==isTemp );.  {
5bf0: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
5c00: 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64     char *zDb = d
5c10: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
5c20: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
5c30: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
5c40: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
5c50: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
5c60: 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29  isTemp), 0, zDb)
5c70: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
5c80: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
5c90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5ca0: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
5cb0: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
5cc0: 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20   && isTemp ){.  
5cd0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
5ce0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
5cf0: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  VIEW;.      }els
5d00: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
5d10: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
5d20: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20  VIEW;.      }.  
5d30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
5d40: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
5d50: 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  && isTemp ){.   
5d60: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
5d70: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
5d80: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
5d90: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
5da0: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
5db0: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20  TABLE;.      }. 
5dc0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
5dd0: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
5de0: 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d  arse, code, zNam
5df0: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
5e00: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
5e10: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
5e20: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
5e30: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
5e40: 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20   new table name 
5e50: 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65  does not collide
5e60: 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e   with an existin
5e70: 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  g.  ** index or 
5e80: 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68  table name in th
5e90: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e  e same database.
5ea0: 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72    Issue an error
5eb0: 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a   message if.  **
5ec0: 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20   it does..  */. 
5ed0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
5ee0: 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
5ef0: 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
5f00: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
5f10: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
5f20: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46  Table = sqlite3F
5f30: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
5f40: 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  me, db->aDb[iDb]
5f50: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  .zName);.  if( p
5f60: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28  Table ){.    if(
5f70: 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20   !noErr ){.     
5f80: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5f90: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
5fa0: 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %T already exist
5fb0: 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  s", pName);.    
5fc0: 7d 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  }.    goto begin
5fd0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
5fe0: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  }.  if( sqlite3F
5ff0: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
6000: 6d 65 2c 20 30 29 21 3d 30 20 26 26 20 28 69 44  me, 0)!=0 && (iD
6010: 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69  b==0 || !db->ini
6020: 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 73  t.busy) ){.    s
6030: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6040: 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73  Parse, "there is
6050: 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65   already an inde
6060: 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61  x named %s", zNa
6070: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65  me);.    goto be
6080: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6090: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20  .  }.  pTable = 
60a0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
60b0: 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
60c0: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
60d0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  {.    pParse->rc
60e0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
60f0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
6100: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65  r++;.    goto be
6110: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6120: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a  .  }.  pTable->z
6130: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
6140: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
6150: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ;.  pTable->aCol
6160: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
6170: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
6180: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30  able->pIndex = 0
6190: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68  ;.  pTable->pSch
61a0: 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ema = db->aDb[iD
61b0: 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54  b].pSchema;.  pT
61c0: 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  able->nRef = 1;.
61d0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e    if( pParse->pN
61e0: 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65  ewTable ) sqlite
61f0: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
6200: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6210: 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70  le);.  pParse->p
6220: 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  NewTable = pTabl
6230: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  e;..  /* If this
6240: 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73 71   is the magic sq
6250: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
6260: 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74 6f  ble used by auto
6270: 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20  increment,.  ** 
6280: 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f  then record a po
6290: 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74 61  inter to this ta
62a0: 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ble in the main 
62b0: 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
62c0: 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  re.  ** so that 
62d0: 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20  INSERT can find 
62e0: 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79  the table easily
62f0: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
6300: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
6310: 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NCREMENT.  if( !
6320: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26  pParse->nested &
6330: 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  & strcmp(zName, 
6340: 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  "sqlite_sequence
6350: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 61  ")==0 ){.    pTa
6360: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53  ble->pSchema->pS
6370: 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a  eqTab = pTable;.
6380: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
6390: 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e   Begin generatin
63a0: 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  g the code that 
63b0: 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20  will insert the 
63c0: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74  table record int
63d0: 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54  o.  ** the SQLIT
63e0: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20  E_MASTER table. 
63f0: 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75   Note in particu
6400: 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74  lar that we must
6410: 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61   go ahead.  ** a
6420: 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  nd allocate the 
6430: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
6440: 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72  r the table entr
6450: 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61  y now.  Before a
6460: 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20  ny.  ** PRIMARY 
6470: 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65  KEY or UNIQUE ke
6480: 79 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65  ywords are parse
6490: 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72  d.  Those keywor
64a0: 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20  ds will cause.  
64b0: 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65  ** indices to be
64c0: 20 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65   created and the
64d0: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75   table record mu
64e0: 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74  st come before t
64f0: 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  he .  ** indices
6500: 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65  .  Hence, the re
6510: 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20  cord number for 
6520: 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62  the table must b
6530: 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a  e allocated.  **
6540: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
6550: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
6560: 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47  && (v = sqlite3G
6570: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21  etVdbe(pParse))!
6580: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 62  =0 ){.    int lb
6590: 6c 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46  l;.    int fileF
65a0: 6f 72 6d 61 74 3b 0a 20 20 20 20 73 71 6c 69 74  ormat;.    sqlit
65b0: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
65c0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
65d0: 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49   iDb);..    /* I
65e0: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
65f0: 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69  t and encoding i
6600: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
6610: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74  ave not been set
6620: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
6630: 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20  em now..    */. 
6640: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6650: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f  dOp(v, OP_ReadCo
6660: 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 20 20  okie, iDb, 1);  
6670: 20 2f 2a 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20   /* file_format 
6680: 2a 2f 0a 20 20 20 20 6c 62 6c 20 3d 20 73 71 6c  */.    lbl = sql
6690: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
66a0: 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l(v);.    sqlite
66b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
66c0: 5f 49 66 2c 20 30 2c 20 6c 62 6c 29 3b 0a 20 20  _If, 0, lbl);.  
66d0: 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28    fileFormat = (
66e0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
66f0: 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74  TE_LegacyFileFmt
6700: 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
6710: 20 20 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c           1 : SQL
6720: 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
6730: 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c  _FORMAT;.    sql
6740: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6750: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c   OP_Integer, fil
6760: 65 46 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20  eFormat, 0);.   
6770: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6780: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
6790: 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20  e, iDb, 1);.    
67a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
67b0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
67c0: 45 4e 43 28 64 62 29 2c 20 30 29 3b 0a 20 20 20  ENC(db), 0);.   
67d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
67e0: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
67f0: 65 2c 20 69 44 62 2c 20 34 29 3b 0a 20 20 20 20  e, iDb, 4);.    
6800: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
6810: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b  veLabel(v, lbl);
6820: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75  ..    /* This ju
6830: 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61  st creates a pla
6840: 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64  ce-holder record
6850: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
6860: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20  aster table..   
6870: 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63   ** The record c
6880: 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20  reated does not 
6890: 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67  contain anything
68a0: 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62   yet.  It will b
68b0: 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a  e replaced.    *
68c0: 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e  * by the real en
68d0: 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65  try in code gene
68e0: 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33  rated at sqlite3
68f0: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20  EndTable()..    
6900: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  **.    ** The ro
6910: 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  wid for the new 
6920: 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 6f 6e  entry is left on
6930: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
6940: 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 54 68  stack..    ** Th
6950: 65 20 72 6f 77 69 64 20 76 61 6c 75 65 20 69 73  e rowid value is
6960: 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 63   needed by the c
6970: 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ode that sqlite3
6980: 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 0a 20 20  EndTable will.  
6990: 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 2e 0a 20    ** generate.. 
69a0: 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
69b0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
69c0: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
69d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
69e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
69f0: 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  teger, 0, 0);.  
6a00: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
6a10: 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74     {.      sqlit
6a20: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6a30: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 69  P_CreateTable, i
6a40: 44 62 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  Db, 0);.    }.  
6a50: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73    sqlite3OpenMas
6a60: 74 65 72 54 61 62 6c 65 28 70 50 61 72 73 65 2c  terTable(pParse,
6a70: 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
6a80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6a90: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 30  P_NewRowid, 0, 0
6aa0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6ab0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
6ac0: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 0, 0);.    sq
6ad0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6ae0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29  , OP_Null, 0, 0)
6af0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6b00: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 73  eAddOp(v, OP_Ins
6b10: 65 72 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ert, 0, 0);.    
6b20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6b30: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
6b40: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
6b50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6b60: 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  Pull, 1, 0);.  }
6b70: 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e  ..  /* Normal (n
6b80: 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e  on-error) return
6b90: 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a  . */.  return;..
6ba0: 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
6bb0: 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70   occurs, we jump
6bc0: 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74   here */.begin_t
6bd0: 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71  able_error:.  sq
6be0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
6bf0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
6c00: 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69  .** This macro i
6c10: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72  s used to compar
6c20: 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 69 6e  e two strings in
6c30: 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74   a case-insensit
6c40: 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49  ive manner..** I
6c50: 74 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66 61  t is slightly fa
6c60: 73 74 65 72 20 74 68 61 6e 20 63 61 6c 6c 69 6e  ster than callin
6c70: 67 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  g sqlite3StrICmp
6c80: 28 29 20 64 69 72 65 63 74 6c 79 2c 20 62 75 74  () directly, but
6c90: 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c 61 72  .** produces lar
6ca0: 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ger code..**.** 
6cb0: 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 6d 61  WARNING: This ma
6cc0: 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61  cro is not compa
6cd0: 74 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  tible with the s
6ce0: 74 72 63 6d 70 28 29 20 66 61 6d 69 6c 79 2e 20  trcmp() family. 
6cf0: 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 72  It.** returns tr
6d00: 75 65 20 69 66 20 74 68 65 20 74 77 6f 20 73 74  ue if the two st
6d10: 72 69 6e 67 73 20 61 72 65 20 65 71 75 61 6c 2c  rings are equal,
6d20: 20 6f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65   otherwise false
6d30: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 52  ..*/.#define STR
6d40: 49 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a 73 71  ICMP(x, y) (\.sq
6d50: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
6d60: 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61  r[*(unsigned cha
6d70: 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c 0a 73  r *)(x)]==   \.s
6d80: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
6d90: 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68  er[*(unsigned ch
6da0: 61 72 20 2a 29 28 79 29 5d 20 20 20 20 20 5c 0a  ar *)(y)]     \.
6db0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
6dc0: 70 28 28 78 29 2b 31 2c 28 79 29 2b 31 29 3d 3d  p((x)+1,(y)+1)==
6dd0: 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  0 )../*.** Add a
6de0: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74   new column to t
6df0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
6e00: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
6e10: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cted..**.** The 
6e20: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
6e30: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66  s routine once f
6e40: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64  or each column d
6e50: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e  eclaration.** in
6e60: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
6e70: 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69  statement.  sqli
6e80: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20  te3StartTable() 
6e90: 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66  gets called.** f
6ea0: 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e  irst to get thin
6eb0: 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20  gs going.  Then 
6ec0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
6ed0: 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a  called for each.
6ee0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f  ** column..*/.vo
6ef0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
6f00: 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  umn(Parse *pPars
6f10: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  e, Token *pName)
6f20: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
6f30: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
6f40: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
6f50: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
6f60: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
6f70: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  =0 ) return;.  z
6f80: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
6f90: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
6fa0: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
6fb0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
6fc0: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
6fd0: 0a 20 20 20 20 69 66 28 20 53 54 52 49 43 4d 50  .    if( STRICMP
6fe0: 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (z, p->aCol[i].z
6ff0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73  Name) ){.      s
7000: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7010: 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74  Parse, "duplicat
7020: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25  e column name: %
7030: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  s", z);.      sq
7040: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
7050: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
7060: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e  .  }.  if( (p->n
7070: 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Col & 0x7)==0 ){
7080: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65  .    Column *aNe
7090: 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  w;.    aNew = sq
70a0: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e  liteRealloc( p->
70b0: 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38  aCol, (p->nCol+8
70c0: 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  )*sizeof(p->aCol
70d0: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
70e0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
70f0: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
7100: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
7110: 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d   }.    p->aCol =
7120: 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f   aNew;.  }.  pCo
7130: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
7140: 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nCol];.  memset(
7150: 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCol, 0, sizeof(
7160: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
7170: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b  pCol->zName = z;
7180: 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  . .  /* If there
7190: 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63   is no type spec
71a0: 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68  ified, columns h
71b0: 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  ave the default 
71c0: 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e  affinity.  ** 'N
71d0: 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20 69  ONE'. If there i
71e0: 73 20 61 20 74 79 70 65 20 73 70 65 63 69 66 69  s a type specifi
71f0: 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33  ed, then sqlite3
7200: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20  AddColumnType() 
7210: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c  will.  ** be cal
7220: 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20  led next to set 
7230: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63  pCol->affinity c
7240: 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20  orrectly..  */. 
7250: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
7260: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
7270: 45 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a  E;.  p->nCol++;.
7280: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
7290: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
72a0: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
72b0: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
72c0: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
72d0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
72e0: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f  tatement.  A "NO
72f0: 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
7300: 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73  nt has.** been s
7310: 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e  een on a column.
7320: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
7330: 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20  ets the notNull 
7340: 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  flag on.** the c
7350: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
7360: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
7370: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
7380: 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61  te3AddNotNull(Pa
7390: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
73a0: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
73b0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
73c0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
73d0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
73e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
73f0: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66   p->nCol-1;.  if
7400: 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c  ( i>=0 ) p->aCol
7410: 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e  [i].notNull = on
7420: 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Error;.}../*.** 
7430: 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Scan the column 
7440: 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20  type name zType 
7450: 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61  (length nType) a
7460: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a  nd return the.**
7470: 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66 69   associated affi
7480: 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a  nity type..**.**
7490: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
74a0: 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65  es a case-indepe
74b0: 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20  ndent search of 
74c0: 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a  zType for the .*
74d0: 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20  * substrings in 
74e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  the following ta
74f0: 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74  ble. If one of t
7500: 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 73  he substrings is
7510: 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63  .** found, the c
7520: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66  orresponding aff
7530: 69 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e 65  inity is returne
7540: 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74  d. If zType cont
7550: 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61  ains.** more tha
7560: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62  n one of the sub
7570: 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73  strings, entries
7580: 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20   toward the top 
7590: 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  of .** the table
75a0: 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20   take priority. 
75b0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
75c0: 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e  zType is 'BLOBIN
75d0: 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  T', .** SQLITE_A
75e0: 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65  FF_INTEGER is re
75f0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75  turned..**.** Su
7600: 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66  bstring     | Af
7610: 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  finity.** ------
7620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49  ----------.** 'I
7640: 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20 53 51  NT'         | SQ
7650: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
7660: 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20 20  .** 'CHAR'      
7670: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
7680: 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20  EXT.** 'CLOB'   
7690: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
76a0: 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27  F_TEXT.** 'TEXT'
76b0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
76c0: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c  _AFF_TEXT.** 'BL
76d0: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
76e0: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 20  ITE_AFF_NONE.** 
76f0: 27 52 45 41 4c 27 20 20 20 20 20 20 20 20 7c 20  'REAL'        | 
7700: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
7710: 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20 20 20  ** 'FLOA'       
7720: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
7730: 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20 20  AL.** 'DOUB'    
7740: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
7750: 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  _REAL.**.** If n
7760: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
7770: 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f  rings in the abo
7780: 76 65 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75  ve table are fou
7790: 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46  nd,.** SQLITE_AF
77a0: 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74  F_NUMERIC is ret
77b0: 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73  urned..*/.char s
77c0: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
77d0: 70 65 28 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a  pe(const Token *
77e0: 70 54 79 70 65 29 7b 0a 20 20 75 33 32 20 68 20  pType){.  u32 h 
77f0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20  = 0;.  char aff 
7800: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  = SQLITE_AFF_NUM
7810: 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  ERIC;.  const un
7820: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e  signed char *zIn
7830: 20 3d 20 70 54 79 70 65 2d 3e 7a 3b 0a 20 20 63   = pType->z;.  c
7840: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
7850: 61 72 20 2a 7a 45 6e 64 20 3d 20 26 70 54 79 70  ar *zEnd = &pTyp
7860: 65 2d 3e 7a 5b 70 54 79 70 65 2d 3e 6e 5d 3b 0a  e->z[pType->n];.
7870: 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 21 3d 7a  .  while( zIn!=z
7880: 45 6e 64 20 29 7b 0a 20 20 20 20 68 20 3d 20 28  End ){.    h = (
7890: 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55  h<<8) + sqlite3U
78a0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 49 6e  pperToLower[*zIn
78b0: 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20  ];.    zIn++;.  
78c0: 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c    if( h==(('c'<<
78d0: 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27  24)+('h'<<16)+('
78e0: 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20  a'<<8)+'r') ){  
78f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48             /* CH
7900: 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  AR */.      aff 
7910: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
7920: 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  T; .    }else if
7930: 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b  ( h==(('c'<<24)+
7940: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
7950: 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20  8)+'b') ){      
7960: 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20   /* CLOB */.    
7970: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
7980: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c  FF_TEXT;.    }el
7990: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c  se if( h==(('t'<
79a0: 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28  <24)+('e'<<16)+(
79b0: 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20  'x'<<8)+'t') ){ 
79c0: 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f        /* TEXT */
79d0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
79e0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
79f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
7a00: 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('b'<<24)+('l'<<
7a10: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
7a20: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c  )          /* BL
7a30: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  OB */.        &&
7a40: 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46   (aff==SQLITE_AF
7a50: 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66  F_NUMERIC || aff
7a60: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
7a70: 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  L) ){.      aff 
7a80: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
7a90: 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  E;.#ifndef SQLIT
7aa0: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
7ab0: 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20  POINT.    }else 
7ac0: 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34  if( h==(('r'<<24
7ad0: 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27  )+('e'<<16)+('a'
7ae0: 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20  <<8)+'l')       
7af0: 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20     /* REAL */.  
7b00: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
7b10: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
7b20: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
7b30: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b  SQLITE_AFF_REAL;
7b40: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
7b50: 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c  ==(('f'<<24)+('l
7b60: 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b  '<<16)+('o'<<8)+
7b70: 27 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'a')          /*
7b80: 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20   FLOA */.       
7b90: 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   && aff==SQLITE_
7ba0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
7bb0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
7bc0: 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20  E_AFF_REAL;.    
7bd0: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
7be0: 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36  d'<<24)+('o'<<16
7bf0: 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20  )+('u'<<8)+'b') 
7c00: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42           /* DOUB
7c10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
7c20: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
7c30: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
7c40: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7c50: 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20  _REAL;.#endif.  
7c60: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30    }else if( (h&0
7c70: 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69  x00FFFFFF)==(('i
7c80: 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b  '<<16)+('n'<<8)+
7c90: 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e  't') ){    /* IN
7ca0: 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  T */.      aff =
7cb0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
7cc0: 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  GER;.      break
7cd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
7ce0: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
7cf0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7d00: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
7d10: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
7d20: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
7d30: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
7d40: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
7d50: 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73 74  ent.  The pFirst
7d60: 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69   token is the fi
7d70: 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20  rst.** token in 
7d80: 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20  the sequence of 
7d90: 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63  tokens that desc
7da0: 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f 66  ribe the type of
7db0: 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63   the.** column c
7dc0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
7dd0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70  onstruction.   p
7de0: 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73 74  Last is the last
7df0: 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65   token.** in the
7e00: 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20   sequence.  Use 
7e10: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
7e20: 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20   to construct a 
7e30: 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63  string.** that c
7e40: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70 65  ontains the type
7e50: 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  name of the colu
7e60: 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61  mn and store tha
7e70: 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a  t string.** in z
7e80: 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73  Type..*/ .void s
7e90: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54  qlite3AddColumnT
7ea0: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
7eb0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29  e, Token *pType)
7ec0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
7ed0: 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20  int i;.  Column 
7ee0: 2a 70 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 28 70  *pCol;..  if( (p
7ef0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
7f00: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
7f10: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
7f20: 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20  -1;.  if( i<0 ) 
7f30: 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d  return;.  pCol =
7f40: 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20   &p->aCol[i];.  
7f50: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
7f60: 3e 7a 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d  >zType);.  pCol-
7f70: 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  >zType = sqlite3
7f80: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
7f90: 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66  ype);.  pCol->af
7fa0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
7fb0: 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 54 79  AffinityType(pTy
7fc0: 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  pe);.}../*.** Th
7fd0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
7fe0: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
7ff0: 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  e for the most r
8000: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
8010: 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74  lumn.** of the t
8020: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
8030: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
8040: 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74  n..**.** Default
8050: 20 76 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f   value expressio
8060: 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74  ns must be const
8070: 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65  ant.  Raise an e
8080: 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73  xception if this
8090: 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63  .** is not the c
80a0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
80b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
80c0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
80d0: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
80e0: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
80f0: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
8100: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
8110: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65  oid sqlite3AddDe
8120: 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65  faultValue(Parse
8130: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
8140: 70 45 78 70 72 29 7b 0a 20 20 54 61 62 6c 65 20  pExpr){.  Table 
8150: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
8160: 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  ol;.  if( (p = p
8170: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
8180: 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c  )!=0 ){.    pCol
8190: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e   = &(p->aCol[p->
81a0: 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66  nCol-1]);.    if
81b0: 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  ( !sqlite3ExprIs
81c0: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
81d0: 6f 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  on(pExpr) ){.   
81e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
81f0: 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61  sg(pParse, "defa
8200: 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c  ult value of col
8210: 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20  umn [%s] is not 
8220: 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20  constant",.     
8230: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65       pCol->zName
8240: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8250: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
8260: 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66 6c  elete(pCol->pDfl
8270: 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e  t);.      pCol->
8280: 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45  pDflt = sqlite3E
8290: 78 70 72 44 75 70 28 70 45 78 70 72 29 3b 0a 20  xprDup(pExpr);. 
82a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
82b0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78  e3ExprDelete(pEx
82c0: 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  pr);.}../*.** De
82d0: 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d  signate the PRIM
82e0: 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20  ARY KEY for the 
82f0: 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73  table.  pList is
8300: 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73   a list of names
8310: 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   .** of columns 
8320: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72  that form the pr
8330: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70  imary key.  If p
8340: 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  List is NULL, th
8350: 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  en the.** most r
8360: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
8370: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
8380: 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  e is the primary
8390: 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61   key..**.** A ta
83a0: 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20  ble can have at 
83b0: 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79  most one primary
83c0: 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61   key.  If the ta
83d0: 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a  ble already has.
83e0: 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  ** a primary key
83f0: 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68   (and this is th
8400: 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79  e second primary
8410: 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74   key) then creat
8420: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  e an.** error..*
8430: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d  *.** If the PRIM
8440: 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20  ARY KEY is on a 
8450: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68  single column wh
8460: 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20  ose datatype is 
8470: 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e  INTEGER,.** then
8480: 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20   we will try to 
8490: 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  use that column 
84a0: 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53  as the rowid.  S
84b0: 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b  et the Table.iPK
84c0: 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ey.** field of t
84d0: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
84e0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  onstruction to b
84f0: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  e the index of t
8500: 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
8510: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
8520: 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69  .  Table.iPKey i
8530: 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74  s set to -1 if t
8540: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e  here is.** no IN
8550: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
8560: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
8570: 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  key is not an IN
8580: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
8590: 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  Y, then create a
85a0: 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78   unique.** index
85b0: 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e   for the key.  N
85c0: 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  o index is creat
85d0: 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50  ed for INTEGER P
85e0: 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a  RIMARY KEYs..*/.
85f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50  void sqlite3AddP
8600: 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72  rimaryKey(.  Par
8610: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
8620: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
8630: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
8640: 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  *pList,  /* List
8650: 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20   of field names 
8660: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
8670: 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
8680: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
8690: 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65  do with a unique
86a0: 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  ness conflict */
86b0: 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20  .  int autoInc, 
86c0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
86d0: 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e  the AUTOINCREMEN
86e0: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
86f0: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  sent */.  int so
8700: 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53  rtOrder     /* S
8710: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20  QLITE_SO_ASC or 
8720: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a  SQLITE_SO_DESC *
8730: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
8740: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
8750: 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  wTable;.  char *
8760: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
8770: 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20   iCol = -1, i;. 
8780: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67   if( pTab==0 ) g
8790: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
87a0: 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62  exit;.  if( pTab
87b0: 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a  ->hasPrimKey ){.
87c0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
87d0: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
87e0: 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22     "table \"%s\"
87f0: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
8800: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c  ne primary key",
8810: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
8820: 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f     goto primary_
8830: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  key_exit;.  }.  
8840: 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79  pTab->hasPrimKey
8850: 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 1;.  if( pLis
8860: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c  t==0 ){.    iCol
8870: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20   = pTab->nCol - 
8880: 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  1;.    pTab->aCo
8890: 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65  l[iCol].isPrimKe
88a0: 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 1;.  }else{.
88b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
88c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
88d0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f  ){.      for(iCo
88e0: 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
88f0: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
8900: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
8910: 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
8920: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[i].zName, pTa
8930: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
8940: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
8950: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8960: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8970: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61      if( iCol<pTa
8980: 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
8990: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43     pTab->aCol[iC
89a0: 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20  ol].isPrimKey = 
89b0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
89c0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
89d0: 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d  nExpr>1 ) iCol =
89e0: 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   -1;.  }.  if( i
89f0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
8a00: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
8a10: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
8a20: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
8a30: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65  .  }.  if( zType
8a40: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
8a50: 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47  mp(zType, "INTEG
8a60: 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ER")==0.        
8a70: 26 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51  && sortOrder==SQ
8a80: 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20  LITE_SO_ASC ){. 
8a90: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
8aa0: 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d   iCol;.    pTab-
8ab0: 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72  >keyConf = onErr
8ac0: 6f 72 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 75  or;.    pTab->au
8ad0: 74 6f 49 6e 63 20 3d 20 61 75 74 6f 49 6e 63 3b  toInc = autoInc;
8ae0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74  .  }else if( aut
8af0: 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20  oInc ){.#ifndef 
8b00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
8b10: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71  INCREMENT.    sq
8b20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8b30: 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45  arse, "AUTOINCRE
8b40: 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c  MENT is only all
8b50: 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20  owed on an ".   
8b60: 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49      "INTEGER PRI
8b70: 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64  MARY KEY");.#end
8b80: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
8b90: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
8ba0: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
8bb0: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
8bc0: 6f 72 2c 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72  or, 0, 0, sortOr
8bd0: 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69  der, 0);.    pLi
8be0: 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69  st = 0;.  }..pri
8bf0: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20  mary_key_exit:. 
8c00: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
8c10: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
8c20: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
8c30: 2a 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43  * Add a new CHEC
8c40: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20  K constraint to 
8c50: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
8c60: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
8c70: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
8c80: 73 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43  sqlite3AddCheckC
8c90: 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
8ca0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
8cb0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
8cc0: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68  t */.  Expr *pCh
8cd0: 65 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20  eckExpr  /* The 
8ce0: 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e  check expression
8cf0: 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
8d00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
8d10: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
8d20: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
8d30: 6c 65 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29  le;.  if( pTab )
8d40: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 43 48 45  {.    /* The CHE
8d50: 43 4b 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  CK expression mu
8d60: 73 74 20 62 65 20 64 75 70 6c 69 63 61 74 65 64  st be duplicated
8d70: 20 73 6f 20 74 68 61 74 20 74 6f 6b 65 6e 73 20   so that tokens 
8d80: 72 65 66 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20  refer.    ** to 
8d90: 6d 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20 61  malloced space a
8da0: 6e 64 20 6e 6f 74 20 74 68 65 20 28 65 70 68 65  nd not the (ephe
8db0: 6d 65 72 61 6c 29 20 74 65 78 74 20 6f 66 20 74  meral) text of t
8dc0: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 0a  he CREATE TABLE.
8dd0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
8de0: 20 2a 2f 0a 20 20 20 20 70 54 61 62 2d 3e 70 43   */.    pTab->pC
8df0: 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  heck = sqlite3Ex
8e00: 70 72 41 6e 64 28 70 54 61 62 2d 3e 70 43 68 65  prAnd(pTab->pChe
8e10: 63 6b 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44  ck, sqlite3ExprD
8e20: 75 70 28 70 43 68 65 63 6b 45 78 70 72 29 29 3b  up(pCheckExpr));
8e30: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
8e40: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
8e50: 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 7d 0a 0a  pCheckExpr);.}..
8e60: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
8e70: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
8e80: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
8e90: 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62  ently parsed tab
8ea0: 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20  le column.** to 
8eb0: 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65  the CollSeq give
8ec0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
8ed0: 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65  e3AddCollateType
8ee0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8ef0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
8f00: 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20  e, int nType){. 
8f10: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
8f20: 20 69 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20   i;..  if( (p = 
8f30: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
8f40: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
8f50: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
8f60: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c  ..  if( sqlite3L
8f70: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
8f80: 72 73 65 2c 20 7a 54 79 70 65 2c 20 6e 54 79 70  rse, zType, nTyp
8f90: 65 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  e) ){.    Index 
8fa0: 2a 70 49 64 78 3b 0a 20 20 20 20 70 2d 3e 61 43  *pIdx;.    p->aC
8fb0: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 73 71  ol[i].zColl = sq
8fc0: 6c 69 74 65 53 74 72 4e 44 75 70 28 7a 54 79 70  liteStrNDup(zTyp
8fd0: 65 2c 20 6e 54 79 70 65 29 3b 0a 20 20 0a 20 20  e, nType);.  .  
8fe0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
8ff0: 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61  mn is declared a
9000: 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52  s "<name> PRIMAR
9010: 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74  Y KEY COLLATE <t
9020: 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68  ype>",.    ** th
9030: 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20  en an index may 
9040: 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65  have been create
9050: 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e  d on this column
9060: 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20   before the.    
9070: 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70  ** collation typ
9080: 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72  e was added. Cor
9090: 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20  rect this if it 
90a0: 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20  is the case..   
90b0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78   */.    for(pIdx
90c0: 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  =p->pIndex; pIdx
90d0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
90e0: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
90f0: 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
9100: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
9110: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
9120: 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20  0]==i ){.       
9130: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d   pIdx->azColl[0]
9140: 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43   = p->aCol[i].zC
9150: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
9160: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9170: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
9180: 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74  turns the collat
9190: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
91a0: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
91b0: 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e   text.** encodin
91c0: 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  g identified by 
91d0: 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  the string zName
91e0: 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a  , length nName..
91f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
9200: 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  uested collation
9210: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74   sequence is not
9220: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e   available, or n
9230: 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  ot available.** 
9240: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
9250: 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c  native encoding,
9260: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
9270: 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65  actory is invoke
9280: 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20  d to.** request 
9290: 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61  it. If the colla
92a0: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65  tion factory doe
92b0: 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63  s not supply suc
92c0: 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a  h a sequence,.**
92d0: 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63   and the sequenc
92e0: 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69  e is available i
92f0: 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65  n another text e
9300: 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68  ncoding, then th
9310: 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  at is.** returne
9320: 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
9330: 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20   If no versions 
9340: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  of the requested
9350: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75   collations sequ
9360: 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62  ence are availab
9370: 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65  le, or.** anothe
9380: 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  r error occurs, 
9390: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
93a0: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65   and an error me
93b0: 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e  ssage written in
93c0: 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f  to.** pParse..*/
93d0: 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65  .CollSeq *sqlite
93e0: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50  3LocateCollSeq(P
93f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
9400: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
9410: 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 73   int nName){.  s
9420: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
9430: 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e  rse->db;.  u8 en
9440: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75  c = ENC(db);.  u
9450: 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d  8 initbusy = db-
9460: 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f  >init.busy;.  Co
9470: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20  llSeq *pColl;.. 
9480: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
9490: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
94a0: 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  enc, zName, nNam
94b0: 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20  e, initbusy);.  
94c0: 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26  if( !initbusy &&
94d0: 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f   (!pColl || !pCo
94e0: 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20  ll->xCmp) ){.   
94f0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
9500: 47 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20 70  GetCollSeq(db, p
9510: 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Coll, zName, nNa
9520: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  me);.    if( !pC
9530: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  oll ){.      if(
9540: 20 6e 4e 61 6d 65 3c 30 20 29 7b 0a 20 20 20 20   nName<0 ){.    
9550: 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c      nName = strl
9560: 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  en(zName);.     
9570: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
9580: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9590: 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74   "no such collat
95a0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 2e  ion sequence: %.
95b0: 2a 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d  *s", nName, zNam
95c0: 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20  e);.      pColl 
95d0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
95e0: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
95f0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
9600: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
9610: 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  l increment the 
9620: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a  schema cookie..*
9630: 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20  *.** The schema 
9640: 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74  cookie is used t
9650: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e  o determine when
9660: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
9670: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
9680: 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20  changes.  After 
9690: 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e  each schema chan
96a0: 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  ge, the cookie v
96b0: 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  alue.** changes.
96c0: 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73    When a process
96d0: 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65   first reads the
96e0: 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72   schema it recor
96f0: 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65  ds the.** cookie
9700: 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77  .  Thereafter, w
9710: 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20  henever it goes 
9720: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
9730: 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68  tabase,.** it ch
9740: 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  ecks the cookie 
9750: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
9760: 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20   schema has not 
9770: 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65  changed.** since
9780: 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61   it was last rea
9790: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c  d..**.** This pl
97a0: 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65  an is not comple
97b0: 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f  tely bullet-proo
97c0: 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62  f.  It is possib
97d0: 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63  le for.** the sc
97e0: 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d  hema to change m
97f0: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e  ultiple times an
9800: 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65  d for the cookie
9810: 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61   to be.** set ba
9820: 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75  ck to prior valu
9830: 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63  e.  But schema c
9840: 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65  hanges are infre
9850: 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65  quent.** and the
9860: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
9870: 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65  hitting the same
9880: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73   cookie value is
9890: 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63   only.** 1 chanc
98a0: 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77  e in 2^32.  So w
98b0: 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68  e're safe enough
98c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
98d0: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71  3ChangeCookie(sq
98e0: 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
98f0: 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *v, int iDb){.  
9900: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9910: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
9920: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
9930: 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
9940: 6b 69 65 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c  kie+1, 0);.  sql
9950: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9960: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
9970: 44 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Db, 0);.}../*.**
9980: 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d   Measure the num
9990: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
99a0: 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70  s needed to outp
99b0: 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  ut the given.** 
99c0: 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65  identifier.  The
99d0: 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
99e0: 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75   includes any qu
99f0: 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74  otes used.** but
9a00: 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64   does not includ
9a10: 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69  e the null termi
9a20: 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nator..**.** The
9a30: 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e   estimate is con
9a40: 73 65 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d  servative.  It m
9a50: 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
9a60: 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72  hat what is.** r
9a70: 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f  eally needed..*/
9a80: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e  .static int iden
9a90: 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68  tLength(const ch
9aa0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b  ar *z){.  int n;
9ab0: 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20  .  for(n=0; *z; 
9ac0: 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69  n++, z++){.    i
9ad0: 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b  f( *z=='"' ){ n+
9ae0: 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72  +; }.  }.  retur
9af0: 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  n n + 2;.}../*.*
9b00: 2a 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74  * Write an ident
9b10: 69 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65  ifier onto the e
9b20: 6e 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  nd of the given 
9b30: 73 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20  string.  Add.** 
9b40: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73  quote characters
9b50: 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73   as needed..*/.s
9b60: 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74  tatic void ident
9b70: 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  Put(char *z, int
9b80: 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53   *pIdx, char *zS
9b90: 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75  ignedIdent){.  u
9ba0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
9bb0: 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  dent = (unsigned
9bc0: 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64   char*)zSignedId
9bd0: 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ent;.  int i, j,
9be0: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
9bf0: 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a  = *pIdx;.  for(j
9c00: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
9c10: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73  ++){.    if( !is
9c20: 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29  alnum(zIdent[j])
9c30: 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27   && zIdent[j]!='
9c40: 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  _' ) break;.  }.
9c50: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a    needQuote =  z
9c60: 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69  Ident[j]!=0 || i
9c70: 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d  sdigit(zIdent[0]
9c80: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
9c90: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65      || sqlite3Ke
9ca0: 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74  ywordCode(zIdent
9cb0: 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69  , j)!=TK_ID;.  i
9cc0: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
9cd0: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66  [i++] = '"';.  f
9ce0: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
9cf0: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69  ]; j++){.    z[i
9d00: 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b  ++] = zIdent[j];
9d10: 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b  .    if( zIdent[
9d20: 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d  j]=='"' ) z[i++]
9d30: 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66   = '"';.  }.  if
9d40: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
9d50: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b  i++] = '"';.  z[
9d60: 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20  i] = 0;.  *pIdx 
9d70: 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = i;.}../*.** Ge
9d80: 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20  nerate a CREATE 
9d90: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
9da0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
9db0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62  the given.** tab
9dc0: 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68  le.  Memory to h
9dd0: 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20  old the text of 
9de0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
9df0: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
9e00: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
9e10: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
9e20: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
9e30: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
9e40: 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61  tatic char *crea
9e50: 74 65 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c  teTableStmt(Tabl
9e60: 65 20 2a 70 2c 20 69 6e 74 20 69 73 54 65 6d 70  e *p, int isTemp
9e70: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e  ){.  int i, k, n
9e80: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b  ;.  char *zStmt;
9e90: 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a  .  char *zSep, *
9ea0: 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a  zSep2, *zEnd, *z
9eb0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
9ec0: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72  ;.  n = 0;.  for
9ed0: 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c  (pCol = p->aCol,
9ee0: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
9ef0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
9f00: 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e     n += identLen
9f10: 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  gth(pCol->zName)
9f20: 3b 0a 20 20 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e  ;.    z = pCol->
9f30: 7a 54 79 70 65 3b 0a 20 20 20 20 69 66 28 20 7a  zType;.    if( z
9f40: 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 28   ){.      n += (
9f50: 73 74 72 6c 65 6e 28 7a 29 20 2b 20 31 29 3b 0a  strlen(z) + 1);.
9f60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d      }.  }.  n +=
9f70: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e   identLength(p->
9f80: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c  zName);.  if( n<
9f90: 35 30 20 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d  50 ){.    zSep =
9fa0: 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d   "";.    zSep2 =
9fb0: 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d   ",";.    zEnd =
9fc0: 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   ")";.  }else{. 
9fd0: 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22     zSep = "\n  "
9fe0: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
9ff0: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20  \n  ";.    zEnd 
a000: 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e  = "\n)";.  }.  n
a010: 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43   += 35 + 6*p->nC
a020: 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71  ol;.  zStmt = sq
a030: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e  liteMallocRaw( n
a040: 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d   );.  if( zStmt=
a050: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
a060: 20 73 74 72 63 70 79 28 7a 53 74 6d 74 2c 20 21   strcpy(zStmt, !
a070: 4f 4d 49 54 5f 54 45 4d 50 44 42 26 26 69 73 54  OMIT_TEMPDB&&isT
a080: 65 6d 70 20 3f 20 22 43 52 45 41 54 45 20 54 45  emp ? "CREATE TE
a090: 4d 50 20 54 41 42 4c 45 20 22 3a 22 43 52 45 41  MP TABLE ":"CREA
a0a0: 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b  TE TABLE ");.  k
a0b0: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29   = strlen(zStmt)
a0c0: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
a0d0: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
a0e0: 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20  );.  zStmt[k++] 
a0f0: 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f  = '(';.  for(pCo
a100: 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  l=p->aCol, i=0; 
a110: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
a120: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72  pCol++){.    str
a130: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
a140: 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73  Sep);.    k += s
a150: 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29  trlen(&zStmt[k])
a160: 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65  ;.    zSep = zSe
a170: 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74  p2;.    identPut
a180: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c  (zStmt, &k, pCol
a190: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ->zName);.    if
a1a0: 28 20 28 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79  ( (z = pCol->zTy
a1b0: 70 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  pe)!=0 ){.      
a1c0: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27  zStmt[k++] = ' '
a1d0: 3b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 26  ;.      strcpy(&
a1e0: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 29 3b 0a 20 20  zStmt[k], z);.  
a1f0: 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28      k += strlen(
a200: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  z);.    }.  }.  
a210: 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  strcpy(&zStmt[k]
a220: 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72  , zEnd);.  retur
a230: 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zStmt;.}../*.*
a240: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
a250: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f  s called to repo
a260: 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22  rt the final ")"
a270: 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73   that terminates
a280: 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41 42  .** a CREATE TAB
a290: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
a2a0: 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74  .** The table st
a2b0: 72 75 63 74 75 72 65 20 74 68 61 74 20 6f 74 68  ructure that oth
a2c0: 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  er action routin
a2d0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 62 75 69  es have been bui
a2e0: 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65  lding.** is adde
a2f0: 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61  d to the interna
a300: 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61  l hash tables, a
a310: 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72  ssuming no error
a320: 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72  s have.** occurr
a330: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74  ed..**.** An ent
a340: 72 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ry for the table
a350: 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20   is made in the 
a360: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20  master table on 
a370: 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20  disk, unless.** 
a380: 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72  this is a tempor
a390: 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d  ary table or db-
a3a0: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20  >init.busy==1.  
a3b0: 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75  When db->init.bu
a3c0: 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e  sy==1.** it mean
a3d0: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
a3e0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
a3f0: 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65  er table because
a400: 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e   we just.** conn
a410: 65 63 74 65 64 20 74 6f 20 74 68 65 20 64 61 74  ected to the dat
a420: 61 62 61 73 65 20 6f 72 20 62 65 63 61 75 73 65  abase or because
a430: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
a440: 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20  er table has.** 
a450: 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64  recently changed
a460: 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66  , so the entry f
a470: 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c  or this table al
a480: 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a  ready exists in.
a490: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ** the sqlite_ma
a4a0: 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20  ster table.  We 
a4b0: 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63  do not want to c
a4c0: 72 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a  reate it again..
a4d0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65  **.** If the pSe
a4e0: 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73  lect argument is
a4f0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65   not NULL, it me
a500: 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 72 6f  ans that this ro
a510: 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c  utine.** was cal
a520: 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
a530: 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
a540: 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41  from a .** "CREA
a550: 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20  TE TABLE ... AS 
a560: 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74  SELECT ..." stat
a570: 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75  ement.  The colu
a580: 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  mn names of.** t
a590: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c  he new table wil
a5a0: 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65 73 75  l match the resu
a5b0: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
a5c0: 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  LECT..*/.void sq
a5d0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20  lite3EndTable(. 
a5e0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
a5f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
a600: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
a610: 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20  oken *pCons,    
a620: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c         /* The ',
a630: 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68  ' token after th
a640: 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65  e last column de
a650: 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  fn. */.  Token *
a660: 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  pEnd,           
a670: 20 2f 2a 20 54 68 65 20 66 69 6e 61 6c 20 27 29   /* The final ')
a680: 27 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 43  ' token in the C
a690: 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20  REATE TABLE */. 
a6a0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
a6b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
a6c0: 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54  ct from a "CREAT
a6d0: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22  E ... AS SELECT"
a6e0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
a6f0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
a700: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
a710: 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28   int iDb;..  if(
a720: 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65   (pEnd==0 && pSe
a730: 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72  lect==0) || pPar
a740: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
a750: 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
a760: 29 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  ) ) {.    return
a770: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 70 50 61 72  ;.  }.  p = pPar
a780: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
a790: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
a7a0: 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  rn;..  assert( !
a7b0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
a7c0: 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20   !pSelect );..  
a7d0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
a7e0: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
a7f0: 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  e->db, p->pSchem
a800: 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  a);..#ifndef SQL
a810: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
a820: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65   /* Resolve name
a830: 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63  s in all CHECK c
a840: 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65 73  onstraint expres
a850: 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  sions..  */.  if
a860: 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20  ( p->pCheck ){. 
a870: 20 20 20 53 72 63 4c 69 73 74 20 73 53 72 63 3b     SrcList sSrc;
a880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a890: 20 20 20 2f 2a 20 46 61 6b 65 20 53 72 63 4c 69     /* Fake SrcLi
a8a0: 73 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70  st for pParse->p
a8b0: 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20  NewTable */.    
a8c0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8e0: 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
a8f0: 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  for pParse->pNew
a900: 54 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 6d 65  Table */..    me
a910: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
a920: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
a930: 6d 65 6d 73 65 74 28 26 73 53 72 63 2c 20 30 2c  memset(&sSrc, 0,
a940: 20 73 69 7a 65 6f 66 28 73 53 72 63 29 29 3b 0a   sizeof(sSrc));.
a950: 20 20 20 20 73 53 72 63 2e 6e 53 72 63 20 3d 20      sSrc.nSrc = 
a960: 31 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d  1;.    sSrc.a[0]
a970: 2e 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d  .zName = p->zNam
a980: 65 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d  e;.    sSrc.a[0]
a990: 2e 70 54 61 62 20 3d 20 70 3b 0a 20 20 20 20 73  .pTab = p;.    s
a9a0: 53 72 63 2e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  Src.a[0].iCursor
a9b0: 20 3d 20 2d 31 3b 0a 20 20 20 20 73 4e 43 2e 70   = -1;.    sNC.p
a9c0: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
a9d0: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
a9e0: 20 3d 20 26 73 53 72 63 3b 0a 20 20 20 20 73 4e   = &sSrc;.    sN
a9f0: 43 2e 69 73 43 68 65 63 6b 20 3d 20 31 3b 0a 20  C.isCheck = 1;. 
aa00: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
aa10: 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
aa20: 73 4e 43 2c 20 70 2d 3e 70 43 68 65 63 6b 29 20  sNC, p->pCheck) 
aa30: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  ){.      return;
aa40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
aa50: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
aa60: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29  LITE_OMIT_CHECK)
aa70: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   */..  /* If the
aa80: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
aa90: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
aaa0: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
aab0: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
aac0: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
aad0: 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70   or "sqlite_temp
aae0: 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f  _master" table o
aaf0: 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a  n the disk..  **
ab00: 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
ab10: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61   to the disk aga
ab20: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
ab30: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
ab40: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74  r.  ** for the t
ab50: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62  able from the db
ab60: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66  ->init.newTnum f
ab70: 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65  ield.  (The page
ab80: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f   number.  ** sho
ab90: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75  uld have been pu
aba0: 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73  t there by the s
abb0: 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74  qliteOpenCb rout
abc0: 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ine.).  */.  if(
abd0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
abe0: 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  {.    p->tnum = 
abf0: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
ac00: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
ac10: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
ac20: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72   then create a r
ac30: 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65  ecord for the ne
ac40: 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  w table.  ** in 
ac50: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
ac60: 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64  R table of the d
ac70: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72 65  atabase.  The re
ac80: 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  cord number.  **
ac90: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
aca0: 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64 20  le entry should 
acb0: 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74 68  already be on th
acc0: 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  e stack..  **.  
acd0: 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
ace0: 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c  TEMPORARY table,
acf0: 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79   write the entry
ad00: 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69   into the auxili
ad10: 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  ary.  ** file in
ad20: 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68  stead of into th
ad30: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
ad40: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
ad50: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
ad60: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
ad70: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
ad80: 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f  har *zType;    /
ad90: 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62  * "view" or "tab
ada0: 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  le" */.    char 
adb0: 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56  *zType2;   /* "V
adc0: 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20  IEW" or "TABLE" 
add0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
ade0: 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  mt;    /* Text o
adf0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
ae00: 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45  LE or CREATE VIE
ae10: 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a  W statement */..
ae20: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
ae30: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
ae40: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
ae50: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69  eturn;..    sqli
ae60: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ae70: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
ae80: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
ae90: 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72  the rootpage for
aea0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 61   the new table a
aeb0: 6e 64 20 70 75 73 68 20 69 74 20 6f 6e 74 6f 20  nd push it onto 
aec0: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a  the stack..    *
aed0: 2a 20 41 20 76 69 65 77 20 68 61 73 20 6e 6f 20  * A view has no 
aee0: 72 6f 6f 74 70 61 67 65 2c 20 73 6f 20 6a 75 73  rootpage, so jus
aef0: 74 20 70 75 73 68 20 61 20 7a 65 72 6f 20 6f 6e  t push a zero on
af00: 74 6f 20 74 68 65 20 73 74 61 63 6b 20 66 6f 72  to the stack for
af10: 0a 20 20 20 20 2a 2a 20 76 69 65 77 73 2e 20 20  .    ** views.  
af20: 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65  Initialize zType
af30: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
af40: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
af50: 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ( p->pSelect==0 
af60: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65  ){.      /* A re
af70: 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20  gular table */. 
af80: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61       zType = "ta
af90: 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70  ble";.      zTyp
afa0: 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69  e2 = "TABLE";.#i
afb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
afc0: 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65  T_VIEW.    }else
afd0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65  {.      /* A vie
afe0: 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65  w */.      zType
aff0: 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20   = "view";.     
b000: 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22   zType2 = "VIEW"
b010: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
b020: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
b030: 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  s a CREATE TABLE
b040: 20 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e   xx AS SELECT ..
b050: 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53  ., execute the S
b060: 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61  ELECT.    ** sta
b070: 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61  tement to popula
b080: 74 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  te the new table
b090: 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  . The root-page 
b0a0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20  number for the. 
b0b0: 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20     ** new table 
b0c0: 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  is on the top of
b0d0: 20 74 68 65 20 76 64 62 65 20 73 74 61 63 6b 2e   the vdbe stack.
b0e0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
b0f0: 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68  nce the SELECT h
b100: 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79  as been coded by
b110: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
b120: 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20  , it is in a.   
b130: 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61   ** suitable sta
b140: 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  te to query for 
b150: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
b160: 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65   and types to be
b170: 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20   used.    ** by 
b180: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20  the new table.. 
b190: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73     **.    ** A s
b1a0: 68 61 72 65 64 2d 63 61 63 68 65 20 77 72 69 74  hared-cache writ
b1b0: 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  e-lock is not re
b1c0: 71 75 69 72 65 64 20 74 6f 20 77 72 69 74 65 20  quired to write 
b1d0: 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  to the new table
b1e0: 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63  ,.    ** as a sc
b1f0: 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68  hema-lock must h
b200: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
b210: 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65   obtained to cre
b220: 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20  ate it. Since.  
b230: 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f    ** a schema-lo
b240: 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20  ck excludes all 
b250: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 75  other database u
b260: 73 65 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d  sers, the write-
b270: 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a  lock would.    *
b280: 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a  * be redundant..
b290: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
b2a0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
b2b0: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a  Table *pSelTab;.
b2c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b2d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
b2e0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
b2f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b300: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
b310: 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  Db, 0);.      sq
b320: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b330: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
b340: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  1, 0);.      pPa
b350: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20  rse->nTab = 2;. 
b360: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
b370: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
b380: 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31  ct, SRT_Table, 1
b390: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
b3a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b3b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
b3c0: 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
b3d0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
b3e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
b3f0: 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
b400: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
b410: 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65  t(pParse, 0, pSe
b420: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69  lect);.        i
b430: 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20  f( pSelTab==0 ) 
b440: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
b450: 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d  assert( p->aCol=
b460: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =0 );.        p-
b470: 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
b480: 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70  >nCol;.        p
b490: 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->aCol = pSelTab
b4a0: 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->aCol;.        
b4b0: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
b4c0: 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  0;.        pSelT
b4d0: 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
b4e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
b4f0: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c  eteTable(0, pSel
b500: 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
b510: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70    }..    /* Comp
b520: 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ute the complete
b530: 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
b540: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ATE statement */
b550: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
b560: 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   ){.      zStmt 
b570: 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d  = createTableStm
b580: 74 28 70 2c 20 70 2d 3e 70 53 63 68 65 6d 61 3d  t(p, p->pSchema=
b590: 3d 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62  =pParse->db->aDb
b5a0: 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20  [1].pSchema);.  
b5b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
b5c0: 20 3d 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 50 61   = pEnd->z - pPa
b5d0: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
b5e0: 7a 20 2b 20 31 3b 0a 20 20 20 20 20 20 7a 53 74  z + 1;.      zSt
b5f0: 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
b600: 6e 74 66 28 22 43 52 45 41 54 45 20 25 73 20 25  ntf("CREATE %s %
b610: 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c  .*s", zType2, n,
b620: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
b630: 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 7d 0a 0a 20  ken.z);.    }.. 
b640: 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72     /* A slot for
b650: 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 20   the record has 
b660: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
b670: 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20  ocated in the . 
b680: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53     ** SQLITE_MAS
b690: 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a  TER table.  We j
b6a0: 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61  ust need to upda
b6b0: 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74  te that slot wit
b6c0: 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65  h all.    ** the
b6d0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27   information we'
b6e0: 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 20 20 54  ve collected.  T
b6f0: 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
b700: 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 0a 20 20   preallocated.  
b710: 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 74 68 65    ** slot is the
b720: 20 32 6e 64 20 69 74 65 6d 20 6f 6e 20 74 68 65   2nd item on the
b730: 20 73 74 61 63 6b 2e 20 20 54 68 65 20 74 6f 70   stack.  The top
b740: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69 73   of the stack is
b750: 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74   the.    ** root
b760: 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65   page for the ne
b770: 77 20 74 61 62 6c 65 20 28 6f 72 20 61 20 30 20  w table (or a 0 
b780: 69 66 20 74 68 69 73 20 69 73 20 61 20 76 69 65  if this is a vie
b790: 77 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  w)..    */.    s
b7a0: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
b7b0: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
b7c0: 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a  "UPDATE %Q.%s ".
b7d0: 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74 79           "SET ty
b7e0: 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51  pe='%s', name=%Q
b7f0: 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72  , tbl_name=%Q, r
b800: 6f 6f 74 70 61 67 65 3d 23 30 2c 20 73 71 6c 3d  ootpage=#0, sql=
b810: 25 51 20 22 0a 20 20 20 20 20 20 20 22 57 48 45  %Q ".       "WHE
b820: 52 45 20 72 6f 77 69 64 3d 23 31 22 2c 0a 20 20  RE rowid=#1",.  
b830: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
b840: 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
b850: 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20  ABLE(iDb),.     
b860: 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d   zType,.      p-
b870: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d  >zName,.      p-
b880: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 7a 53  >zName,.      zS
b890: 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tmt.    );.    s
b8a0: 71 6c 69 74 65 46 72 65 65 28 7a 53 74 6d 74 29  qliteFree(zStmt)
b8b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
b8c0: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c  ngeCookie(db, v,
b8d0: 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
b8e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
b8f0: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a  INCREMENT.    /*
b900: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
b910: 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61   we need to crea
b920: 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71  te an sqlite_seq
b930: 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a  uence table for.
b940: 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74      ** keeping t
b950: 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72  rack of autoincr
b960: 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20  ement keys..    
b970: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 75  */.    if( p->au
b980: 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 44  toInc ){.      D
b990: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
b9a0: 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 69 66  b[iDb];.      if
b9b0: 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
b9c0: 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20  pSeqTab==0 ){.  
b9d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
b9e0: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
b9f0: 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
ba00: 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69  TE TABLE %Q.sqli
ba10: 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65  te_sequence(name
ba20: 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20  ,seq)",.        
ba30: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20    pDb->zName.   
ba40: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
ba50: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
ba60: 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65    /* Reparse eve
ba70: 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74  rything to updat
ba80: 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64  e our internal d
ba90: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a  ata structures *
baa0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
bab0: 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73 65  eOp3(v, OP_Parse
bac0: 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 0a  Schema, iDb, 0,.
bad0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
bae0: 50 72 69 6e 74 66 28 22 74 62 6c 5f 6e 61 6d 65  Printf("tbl_name
baf0: 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29  ='%q'",p->zName)
bb00: 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P3_DYNAMIC);. 
bb10: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68   }...  /* Add th
bb20: 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69  e table to the i
bb30: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
bb40: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
bb50: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
bb60: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
bb70: 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72  y && pParse->nEr
bb80: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c  r==0 ){.    Tabl
bb90: 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65  e *pOld;.    FKe
bba0: 79 20 2a 70 46 4b 65 79 3b 20 0a 20 20 20 20 53  y *pFKey; .    S
bbb0: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
bbc0: 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20   p->pSchema;.   
bbd0: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48   pOld = sqlite3H
bbe0: 61 73 68 49 6e 73 65 72 74 28 26 70 53 63 68 65  ashInsert(&pSche
bbf0: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e  ma->tblHash, p->
bc00: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d  zName, strlen(p-
bc10: 3e 7a 4e 61 6d 65 29 2b 31 2c 70 29 3b 0a 20 20  >zName)+1,p);.  
bc20: 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20    if( pOld ){.  
bc30: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
bc40: 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  Old );  /* Mallo
bc50: 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
bc60: 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e  ed inside HashIn
bc70: 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  sert() */.      
bc80: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 23 69  return;.    }.#i
bc90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
bca0: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
bcb0: 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70    for(pFKey=p->p
bcc0: 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b  FKey; pFKey; pFK
bcd0: 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  ey=pFKey->pNextF
bce0: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rom){.      int 
bcf0: 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b  nTo = strlen(pFK
bd00: 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20  ey->zTo) + 1;.  
bd10: 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74      pFKey->pNext
bd20: 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  To = sqlite3Hash
bd30: 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 61  Find(&pSchema->a
bd40: 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f  FKey, pFKey->zTo
bd50: 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73 71  , nTo);.      sq
bd60: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
bd70: 26 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c  &pSchema->aFKey,
bd80: 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f   pFKey->zTo, nTo
bd90: 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a  , pFKey);.    }.
bda0: 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72 73  #endif.    pPars
bdb0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
bdc0: 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65  ;.    db->nTable
bdd0: 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  ++;.    db->flag
bde0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
bdf0: 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e  rnChanges;..#ifn
be00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
be10: 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69  ALTERTABLE.    i
be20: 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29  f( !p->pSelect )
be30: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
be40: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e  ar *zName = (con
be50: 73 74 20 63 68 61 72 20 2a 29 70 50 61 72 73 65  st char *)pParse
be60: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a  ->sNameToken.z;.
be70: 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b        int nName;
be80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
be90: 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73  pSelect && pCons
bea0: 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20   && pEnd );.    
beb0: 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d    if( pCons->z==
bec0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  0 ){.        pCo
bed0: 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  ns = pEnd;.     
bee0: 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d   }.      nName =
bef0: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
bf00: 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 3b  Cons->z - zName;
bf10: 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c  .      p->addCol
bf20: 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71  Offset = 13 + sq
bf30: 6c 69 74 65 33 75 74 66 38 43 68 61 72 4c 65 6e  lite3utf8CharLen
bf40: 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a  (zName, nName);.
bf50: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
bf60: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
bf70: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
bf80: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
bf90: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
bfa0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
bfb0: 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
bfc0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
bfd0: 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73  eateView(.  Pars
bfe0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
bff0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
c000: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
c010: 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a   *pBegin,     /*
c020: 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
c030: 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
c040: 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
c050: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
c060: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
c070: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
c080: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
c090: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
c0a0: 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me2,     /* The 
c0b0: 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
c0c0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
c0d0: 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63   view */.  Selec
c0e0: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a  t *pSelect,   /*
c0f0: 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   A SELECT statem
c100: 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ent that will be
c110: 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65  come the new vie
c120: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
c130: 70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55  p         /* TRU
c140: 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52  E for a TEMPORAR
c150: 59 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54  Y view */.){.  T
c160: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  able *p;.  int n
c170: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
c180: 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f  ed char *z;.  To
c190: 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69  ken sEnd;.  DbFi
c1a0: 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65  xer sFix;.  Toke
c1b0: 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  n *pName;.  int 
c1c0: 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  iDb;..  if( pPar
c1d0: 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20  se->nVar>0 ){.  
c1e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
c1f0: 67 28 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d  g(pParse, "param
c200: 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c  eters are not al
c210: 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22 29  lowed in views")
c220: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
c230: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
c240: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
c250: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61    }.  sqlite3Sta
c260: 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  rtTable(pParse, 
c270: 70 42 65 67 69 6e 2c 20 70 4e 61 6d 65 31 2c 20  pBegin, pName1, 
c280: 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20  pName2, isTemp, 
c290: 31 2c 20 30 29 3b 0a 20 20 70 20 3d 20 70 50 61  1, 0);.  p = pPa
c2a0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
c2b0: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50    if( p==0 || pP
c2c0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
c2d0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
c2e0: 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a  elete(pSelect);.
c2f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
c300: 20 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74    sqlite3TwoPart
c310: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
c320: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
c330: 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71  ame);.  iDb = sq
c340: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
c350: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
c360: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 69 66  ->pSchema);.  if
c370: 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74  ( sqlite3FixInit
c380: 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
c390: 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61  iDb, "view", pNa
c3a0: 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74  me).    && sqlit
c3b0: 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69  e3FixSelect(&sFi
c3c0: 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b  x, pSelect).  ){
c3d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
c3e0: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
c3f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
c400: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20   }..  /* Make a 
c410: 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69  copy of the enti
c420: 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  re SELECT statem
c430: 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
c440: 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20   the view..  ** 
c450: 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20  This will force 
c460: 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b  all the Expr.tok
c470: 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62  en.z values to b
c480: 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20  e dynamically.  
c490: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74  ** allocated rat
c4a0: 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74  her than point t
c4b0: 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  o the input stri
c4c0: 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73  ng - which means
c4d0: 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20   that.  ** they 
c4e0: 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74  will persist aft
c4f0: 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  er the current s
c500: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61  qlite3_exec() ca
c510: 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f  ll returns..  */
c520: 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20  .  p->pSelect = 
c530: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
c540: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  (pSelect);.  sql
c550: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
c560: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28  (pSelect);.  if(
c570: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61   sqlite3MallocFa
c580: 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 72 65  iled() ){.    re
c590: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
c5a0: 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69  !pParse->db->ini
c5b0: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71  t.busy ){.    sq
c5c0: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
c5d0: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
c5e0: 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  p);.  }..  /* Lo
c5f0: 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  cate the end of 
c600: 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20  the CREATE VIEW 
c610: 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65  statement.  Make
c620: 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20   sEnd point to. 
c630: 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a   ** the end..  *
c640: 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73  /.  sEnd = pPars
c650: 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20  e->sLastToken;. 
c660: 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d   if( sEnd.z[0]!=
c670: 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d  0 && sEnd.z[0]!=
c680: 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e  ';' ){.    sEnd.
c690: 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d  z += sEnd.n;.  }
c6a0: 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20  .  sEnd.n = 0;. 
c6b0: 20 6e 20 3d 20 73 45 6e 64 2e 7a 20 2d 20 70 42   n = sEnd.z - pB
c6c0: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 28  egin->z;.  z = (
c6d0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
c6e0: 68 61 72 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a  har*)pBegin->z;.
c6f0: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
c700: 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20  (z[n-1]==';' || 
c710: 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29  isspace(z[n-1]))
c720: 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e   ){ n--; }.  sEn
c730: 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20  d.z = &z[n-1];. 
c740: 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20   sEnd.n = 1;..  
c750: 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e  /* Use sqlite3En
c760: 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20  dTable() to add 
c770: 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20  the view to the 
c780: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
c790: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
c7a0: 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  EndTable(pParse,
c7b0: 20 30 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20   0, &sEnd, 0);. 
c7c0: 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69   return;.}.#endi
c7d0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
c7e0: 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65  _VIEW */..#ifnde
c7f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
c800: 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62  EW./*.** The Tab
c810: 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61  le structure pTa
c820: 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ble is really a 
c830: 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74  VIEW.  Fill in t
c840: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  he names of.** t
c850: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
c860: 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54  e view in the pT
c870: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20  able structure. 
c880: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
c890: 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e  er.** of errors.
c8a0: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73    If an error is
c8b0: 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65   seen leave an e
c8c0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
c8d0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
c8e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
c8f0: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
c900: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
c910: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
c920: 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61  .  Table *pSelTa
c930: 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74  b;   /* A fake t
c940: 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  able from which 
c950: 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c  we get the resul
c960: 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63  t set */.  Selec
c970: 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20  t *pSel;     /* 
c980: 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  Copy of the SELE
c990: 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  CT that implemen
c9a0: 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  ts the view */. 
c9b0: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20   int nErr = 0;  
c9c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c9d0: 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
c9e0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ed */.  int n;  
c9f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
ca00: 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74  porarily holds t
ca10: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
ca20: 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f  sors assigned */
ca30: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ..  assert( pTab
ca40: 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f  le );..  /* A po
ca50: 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e  sitive nCol mean
ca60: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61  s the columns na
ca70: 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65  mes for this vie
ca80: 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61  w are.  ** alrea
ca90: 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20  dy known..  */. 
caa0: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
cab0: 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  l>0 ) return 0;.
cac0: 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65  .  /* A negative
cad0: 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69   nCol is a speci
cae0: 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e  al marker meanin
caf0: 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75  g that we are cu
cb00: 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79  rrently.  ** try
cb10: 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  ing to compute t
cb20: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  he column names.
cb30: 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68    If we enter th
cb40: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a  is routine with.
cb50: 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20    ** a negative 
cb60: 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  nCol, it means t
cb70: 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73  wo or more views
cb80: 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69   form a loop, li
cb90: 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  ke this:.  **.  
cba0: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
cbb0: 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54  EW one AS SELECT
cbc0: 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a   * FROM two;.  *
cbd0: 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
cbe0: 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20  W two AS SELECT 
cbf0: 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a  * FROM one;.  **
cc00: 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
cc10: 74 68 69 73 20 65 72 72 6f 72 20 69 73 20 63 61  this error is ca
cc20: 75 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20  ught previously 
cc30: 61 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  and so the follo
cc40: 77 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73  wing test.  ** s
cc50: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69  hould always fai
cc60: 6c 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20  l.  But we will 
cc70: 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63  leave it in plac
cc80: 65 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66  e just to be saf
cc90: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  e..  */.  if( pT
cca0: 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a  able->nCol<0 ){.
ccb0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ccc0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65  Msg(pParse, "vie
ccd0: 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72  w %s is circular
cce0: 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61  ly defined", pTa
ccf0: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  ble->zName);.   
cd00: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
cd10: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
cd20: 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f  >nCol>=0 );..  /
cd30: 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
cd40: 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77   far, it means w
cd50: 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  e need to comput
cd60: 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  e the table name
cd70: 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  s..  ** Note tha
cd80: 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  t the call to sq
cd90: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
cda0: 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78  Select() will ex
cdb0: 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a  pand any.  ** "*
cdc0: 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  " elements in th
cdd0: 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66  e results set of
cde0: 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77 69   the view and wi
cdf0: 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72  ll assign cursor
ce00: 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c  s.  ** to the el
ce10: 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52  ements of the FR
ce20: 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20  OM clause.  But 
ce30: 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  we do not want t
ce40: 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a  hese changes.  *
ce50: 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e  * to be permanen
ce60: 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75  t.  So the compu
ce70: 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f  tation is done o
ce80: 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  n a copy of the 
ce90: 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74  SELECT.  ** stat
cea0: 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e  ement that defin
ceb0: 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a  es the view..  *
cec0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
ced0: 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20  le->pSelect );. 
cee0: 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53   pSel = sqlite3S
cef0: 65 6c 65 63 74 44 75 70 28 70 54 61 62 6c 65 2d  electDup(pTable-
cf00: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28  >pSelect);.  if(
cf10: 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 6e 20 3d   pSel ){.    n =
cf20: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
cf30: 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
cf40: 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
cf50: 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72  Parse, pSel->pSr
cf60: 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  c);.    pTable->
cf70: 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 70  nCol = -1;.    p
cf80: 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
cf90: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
cfa0: 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65  t(pParse, 0, pSe
cfb0: 6c 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  l);.    pParse->
cfc0: 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66  nTab = n;.    if
cfd0: 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20  ( pSelTab ){.   
cfe0: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c     assert( pTabl
cff0: 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  e->aCol==0 );.  
d000: 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
d010: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c   = pSelTab->nCol
d020: 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ;.      pTable->
d030: 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
d040: 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c  aCol;.      pSel
d050: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
d060: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43       pSelTab->aC
d070: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ol = 0;.      sq
d080: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
d090: 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  (0, pSelTab);.  
d0a0: 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68      pTable->pSch
d0b0: 65 6d 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42  ema->flags |= DB
d0c0: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20  _UnresetViews;. 
d0d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d0e0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
d0f0: 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  ;.      nErr++;.
d100: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
d110: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
d120: 65 6c 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  el);.  } else {.
d130: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a      nErr++;.  }.
d140: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
d150: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
d160: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
d170: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d180: 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
d190: 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
d1a0: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65  n names from eve
d1b0: 72 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62  ry VIEW in datab
d1c0: 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74  ase idx..*/.stat
d1d0: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69  ic void sqliteVi
d1e0: 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74  ewResetAll(sqlit
d1f0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29  e3 *db, int idx)
d200: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
d210: 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f  .  if( !DbHasPro
d220: 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
d230: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20  B_UnresetViews) 
d240: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
d250: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
d260: 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e  t(&db->aDb[idx].
d270: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
d280: 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73  ); i;i=sqliteHas
d290: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54  hNext(i)){.    T
d2a0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
d2b0: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
d2c0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
d2d0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73  elect ){.      s
d2e0: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
d2f0: 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20  Names(pTab);.   
d300: 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72   }.  }.  DbClear
d310: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
d320: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
d330: 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  s);.}.#else.# de
d340: 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52  fine sqliteViewR
d350: 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e  esetAll(A,B).#en
d360: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
d370: 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_VIEW */../*.*
d380: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d390: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
d3a0: 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20   VDBE to adjust 
d3b0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
d3c0: 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53  ema.** used by S
d3d0: 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62  QLite when the b
d3e0: 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73  tree layer moves
d3f0: 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61   a table root pa
d400: 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d  ge. The.** root-
d410: 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
d420: 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61  or index in data
d430: 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61  base iDb has cha
d440: 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a  nged from iFrom.
d450: 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2f 0a 23 69  ** to iTo..*/.#i
d460: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d470: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69  T_AUTOVACUUM.voi
d480: 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67  d sqlite3RootPag
d490: 65 4d 6f 76 65 64 28 44 62 20 2a 70 44 62 2c 20  eMoved(Db *pDb, 
d4a0: 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
d4b0: 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  To){.  HashElem 
d4c0: 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a  *pElem;.  Hash *
d4d0: 70 48 61 73 68 3b 0a 0a 20 20 70 48 61 73 68 20  pHash;..  pHash 
d4e0: 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  = &pDb->pSchema-
d4f0: 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28  >tblHash;.  for(
d500: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
d510: 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45  First(pHash); pE
d520: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
d530: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
d540: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
d550: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
d560: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
d570: 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d  if( pTab->tnum==
d580: 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
d590: 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Tab->tnum = iTo;
d5a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
d5b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68     }.  }.  pHash
d5c0: 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
d5d0: 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72  ->idxHash;.  for
d5e0: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
d5f0: 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
d600: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
d610: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
d620: 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  )){.    Index *p
d630: 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Idx = sqliteHash
d640: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
d650: 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d   if( pIdx->tnum=
d660: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
d670: 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pIdx->tnum = iTo
d680: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
d690: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
d6a0: 72 74 28 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rt(0);.}.#endif.
d6b0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64  ./*.** Write cod
d6c0: 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74  e to erase the t
d6d0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
d6e0: 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20  age iTable from 
d6f0: 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a  database iDb..**
d700: 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65   Also write code
d710: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73   to modify the s
d720: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
d730: 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  le and internal 
d740: 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72  schema.** if a r
d750: 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74  oot-page of anot
d760: 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
d770: 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d  ed by the btree-
d780: 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20  layer whilst.** 
d790: 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28  erasing iTable (
d7a0: 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
d7b0: 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63  with an auto-vac
d7c0: 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  uum database)..*
d7d0: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  / .static void d
d7e0: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50  estroyRootPage(P
d7f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
d800: 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44  t iTable, int iD
d810: 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
d820: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
d830: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
d840: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d850: 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65  _Destroy, iTable
d860: 2c 20 69 44 62 29 3b 0a 23 69 66 6e 64 65 66 20  , iDb);.#ifndef 
d870: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
d880: 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44  VACUUM.  /* OP_D
d890: 65 73 74 72 6f 79 20 70 75 73 68 65 73 20 61 6e  estroy pushes an
d8a0: 20 69 6e 74 65 67 65 72 20 6f 6e 74 6f 20 74 68   integer onto th
d8b0: 65 20 73 74 61 63 6b 2e 20 49 66 20 74 68 69 73  e stack. If this
d8c0: 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73   integer.  ** is
d8d0: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
d8e0: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
d8f0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
d900: 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20  table moved to. 
d910: 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61   ** location iTa
d920: 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ble. The followi
d930: 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73  ng code modifies
d940: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
d950: 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a  er table to.  **
d960: 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20   reflect this.. 
d970: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 30   **.  ** The "#0
d980: 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20  " in the SQL is 
d990: 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61  a special consta
d9a0: 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68  nt that means wh
d9b0: 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a  atever value.  *
d9c0: 2a 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20  * is on the top 
d9d0: 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 20 53  of the stack.  S
d9e0: 65 65 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  ee sqlite3Regist
d9f0: 65 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a 20  erExpr()..  */. 
da00: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
da10: 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
da20: 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
da30: 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20  SET rootpage=%d 
da40: 57 48 45 52 45 20 23 30 20 41 4e 44 20 72 6f 6f  WHERE #0 AND roo
da50: 74 70 61 67 65 3d 23 30 22 2c 0a 20 20 20 20 20  tpage=#0",.     
da60: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
da70: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
da80: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69  MA_TABLE(iDb), i
da90: 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 7d  Table);.#endif.}
daa0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44  ../*.** Write VD
dab0: 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  BE code to erase
dac0: 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
dad0: 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69  all associated i
dae0: 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a  ndices on disk..
daf0: 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74  ** Code to updat
db00: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
db10: 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69  ter tables and i
db20: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64  nternal schema d
db30: 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e  efinitions.** in
db40: 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67   case a root-pag
db50: 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
db60: 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
db70: 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
db80: 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61  ee layer.** is a
db90: 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20  lso added (this 
dba0: 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20  can happen with 
dbb0: 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
dbc0: 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61  atabase)..*/.sta
dbd0: 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
dbe0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
dbf0: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
dc00: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
dc10: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
dc20: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
dc30: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
dc40: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
dc50: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
dc60: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64  b->pSchema);.  d
dc70: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
dc80: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75  Parse, pTab->tnu
dc90: 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70  m, iDb);.  for(p
dca0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
dcb0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
dcc0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64  x->pNext){.    d
dcd0: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
dce0: 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75  Parse, pIdx->tnu
dcf0: 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c  m, iDb);.  }.#el
dd00: 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  se.  /* If the d
dd10: 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61  atabase may be a
dd20: 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62  uto-vacuum capab
dd30: 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d  le (if SQLITE_OM
dd40: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
dd50: 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  ** is not define
dd60: 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69  d), then it is i
dd70: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c  mportant to call
dd80: 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74   OP_Destroy on t
dd90: 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e  he.  ** table an
dda0: 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67  d index root-pag
ddb0: 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61  es in order, sta
ddc0: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e  rting with the n
ddd0: 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a  umerically .  **
dde0: 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
ddf0: 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20  ge number. This 
de00: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
de10: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74  none of the root
de20: 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  -pages.  ** to b
de30: 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72  e destroyed is r
de40: 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65  elocated by an e
de50: 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f  arlier OP_Destro
de60: 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20  y. i.e. if the. 
de70: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65   ** following we
de80: 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20  re coded:.  **. 
de90: 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34   ** OP_Destroy 4
dea0: 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a   0.  ** ....  **
deb0: 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a   OP_Destroy 5 0.
dec0: 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f    **.  ** and ro
ded0: 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e  ot page 5 happen
dee0: 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72  ed to be the lar
def0: 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
df00: 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a  umber in the.  *
df10: 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  * database, then
df20: 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75   root page 5 wou
df30: 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70  ld be moved to p
df40: 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20  age 4 by the .  
df50: 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34  ** "OP_Destroy 4
df60: 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20   0" opcode. The 
df70: 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44  subsequent "OP_D
df80: 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c  estroy 5 0" woul
df90: 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65  d hit.  ** a fre
dfa0: 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a  e-list page..  *
dfb0: 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
dfc0: 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74  Tab->tnum;.  int
dfd0: 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b   iDestroyed = 0;
dfe0: 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
dff0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
e000: 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73  .    int iLarges
e010: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
e020: 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c  iDestroyed==0 ||
e030: 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64   iTab<iDestroyed
e040: 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65   ){.      iLarge
e050: 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d  st = iTab;.    }
e060: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
e070: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
e080: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
e090: 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  xt){.      int i
e0a0: 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d  Idx = pIdx->tnum
e0b0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e0c0: 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  pIdx->pSchema==p
e0d0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
e0e0: 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74        if( (iDest
e0f0: 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64  royed==0 || (iId
e100: 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26  x<iDestroyed)) &
e110: 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20  & iIdx>iLargest 
e120: 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67  ){.        iLarg
e130: 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20  est = iIdx;.    
e140: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
e150: 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b  ( iLargest==0 ){
e160: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
e170: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e180: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
e190: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
e1a0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
e1b0: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
e1c0: 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
e1d0: 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73  (pParse, iLarges
e1e0: 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69  t, iDb);.      i
e1f0: 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72  Destroyed = iLar
e200: 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gest;.    }.  }.
e210: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
e220: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
e230: 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65  called to do the
e240: 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20   work of a DROP 
e250: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
e260: 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65  .** pName is the
e270: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
e280: 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64  le to be dropped
e290: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e2a0: 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65  3DropTable(Parse
e2b0: 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
e2c0: 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73  t *pName, int is
e2d0: 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29  View, int noErr)
e2e0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
e2f0: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
e300: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
e310: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
e320: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
e330: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
e340: 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
e350: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
e360: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
e370: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
e380: 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70  ->nSrc==1 );.  p
e390: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
e3a0: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
e3b0: 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
e3c0: 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
e3d0: 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20 69  zDatabase);..  i
e3e0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
e3f0: 20 20 69 66 28 20 6e 6f 45 72 72 20 29 7b 0a 20    if( noErr ){. 
e400: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
e410: 72 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  rClear(pParse);.
e420: 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 65      }.    goto e
e430: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
e440: 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
e450: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
e460: 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
e470: 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ma);.  assert( i
e480: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
e490: 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65 66 20  >nDb );.#ifndef 
e4a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
e4b0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
e4c0: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
e4d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
e4e0: 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
e4f0: 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  iDb);.    const 
e500: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
e510: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
e520: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
e530: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
e540: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
e550: 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a  zTab, 0, zDb)){.
e560: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
e570: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
e580: 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
e590: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f   ){.      if( !O
e5a0: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
e5b0: 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
e5c0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
e5d0: 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  OP_TEMP_VIEW;.  
e5e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e5f0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
e600: 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20  _DROP_VIEW;.    
e610: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
e620: 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
e630: 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
e640: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
e650: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
e660: 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
e670: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
e680: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
e690: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
e6a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
e6b0: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
e6c0: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
e6d0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  ab->zName, 0, zD
e6e0: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
e6f0: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
e700: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e710: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
e720: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
e730: 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e  DELETE, pTab->zN
e740: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
e750: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
e760: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
e770: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
e780: 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c  f( pTab->readOnl
e790: 79 20 7c 7c 20 70 54 61 62 3d 3d 64 62 2d 3e 61  y || pTab==db->a
e7a0: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
e7b0: 3e 70 53 65 71 54 61 62 20 29 7b 0a 20 20 20 20  >pSeqTab ){.    
e7c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
e7d0: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
e7e0: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f  s may not be dro
e7f0: 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  pped", pTab->zNa
e800: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
e810: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
e820: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
e830: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
e840: 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41  * Ensure DROP TA
e850: 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20  BLE is not used 
e860: 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44  on a view, and D
e870: 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20  ROP VIEW is not 
e880: 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74  used.  ** on a t
e890: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
e8a0: 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d   isView && pTab-
e8b0: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
e8c0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
e8d0: 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
e8e0: 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65  DROP TABLE to de
e8f0: 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20  lete table %s", 
e900: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
e910: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
e920: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  _table;.  }.  if
e930: 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61  ( !isView && pTa
e940: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
e950: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
e960: 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
e970: 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65  ROP VIEW to dele
e980: 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61  te view %s", pTa
e990: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
e9a0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
e9b0: 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ble;.  }.#endif.
e9c0: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
e9d0: 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
e9e0: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
e9f0: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20   master table.  
ea00: 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  ** on disk..  */
ea10: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
ea20: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
ea30: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72   if( v ){.    Tr
ea40: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
ea50: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
ea60: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
ea70: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
ea80: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
ea90: 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 20  rse, 0, iDb);.. 
eaa0: 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74     /* Drop all t
eab0: 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74  riggers associat
eac0: 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
ead0: 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
eae0: 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73 20   Code.    ** is 
eaf0: 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d  generated to rem
eb00: 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ove entries from
eb10: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61   sqlite_master a
eb20: 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c  nd/or.    ** sql
eb30: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
eb40: 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  if required..   
eb50: 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72   */.    pTrigger
eb60: 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65   = pTab->pTrigge
eb70: 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54  r;.    while( pT
eb80: 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20  rigger ){.      
eb90: 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
eba0: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
ebb0: 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20  >pSchema || .   
ebc0: 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d         pTrigger-
ebd0: 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
ebe0: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
ebf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f        sqlite3Dro
ec00: 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72  pTriggerPtr(pPar
ec10: 73 65 2c 20 70 54 72 69 67 67 65 72 2c 20 31 29  se, pTrigger, 1)
ec20: 3b 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72  ;.      pTrigger
ec30: 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
ec40: 78 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  xt;.    }..#ifnd
ec50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
ec60: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
ec70: 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65   /* Remove any e
ec80: 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71  ntries of the sq
ec90: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
eca0: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
ecb0: 69 74 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  ith.    ** the t
ecc0: 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
ecd0: 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  ed. This is done
ece0: 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c   before the tabl
ecf0: 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 20  e is dropped.   
ed00: 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65   ** at the btree
ed10: 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20   level, in case 
ed20: 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
ed30: 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20  nce table needs 
ed40: 74 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61  to.    ** move a
ed50: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
ed60: 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70  e drop (can happ
ed70: 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  en in auto-vacuu
ed80: 6d 20 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a  m mode)..    */.
ed90: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 75      if( pTab->au
eda0: 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 73  toInc ){.      s
edb0: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
edc0: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
edd0: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
ede0: 73 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  s.sqlite_sequenc
edf0: 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  e WHERE name=%Q"
ee00: 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  ,.        pDb->z
ee10: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
ee20: 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
ee30: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
ee40: 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f  Drop all SQLITE_
ee50: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64  MASTER table and
ee60: 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74   index entries t
ee70: 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
ee80: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54  .    ** table. T
ee90: 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20  he program name 
eea0: 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68  loops through th
eeb0: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e master table a
eec0: 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a  nd deletes.    *
eed0: 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74  * every row that
eee0: 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
eef0: 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  le of the same n
ef00: 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62  ame as the one b
ef10: 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70  eing.    ** drop
ef20: 70 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72  ped. Triggers ar
ef30: 65 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61  e handled sepera
ef40: 74 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74  tely because a t
ef50: 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20  rigger can be.  
ef60: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20    ** created in 
ef70: 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
ef80: 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  e that refers to
ef90: 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74   a table in anot
efa0: 68 65 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  her.    ** datab
efb0: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
efc0: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
efd0: 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
efe0: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
eff0: 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c   %Q.%s WHERE tbl
f000: 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70  _name=%Q and typ
f010: 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20  e!='trigger'",. 
f020: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d         pDb->zNam
f030: 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
f040: 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  iDb), pTab->zNam
f050: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56  e);.    if( !isV
f060: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 64 65 73  iew ){.      des
f070: 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65  troyTable(pParse
f080: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 0a  , pTab);.    }..
f090: 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
f0a0: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72  e table entry fr
f0b0: 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65  om SQLite's inte
f0c0: 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20  rnal schema and 
f0d0: 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a 20 74 68  modify.    ** th
f0e0: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
f0f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
f100: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
f110: 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c  _DropTable, iDb,
f120: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   0, pTab->zName,
f130: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
f140: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
f150: 20 76 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20   v, iDb);.  }.  
f160: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
f170: 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78  ll(db, iDb);..ex
f180: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20  it_drop_table:. 
f190: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
f1a0: 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a  elete(pName);.}.
f1b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
f1c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
f1d0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f   create a new fo
f1e0: 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65  reign key on the
f1f0: 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e   table.** curren
f200: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
f210: 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f  uction.  pFromCo
f220: 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  l determines whi
f230: 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  ch columns.** in
f240: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
f250: 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  le point to the 
f260: 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66  foreign key.  If
f270: 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65   pFromCol==0 the
f280: 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65  n.** connect the
f290: 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74   key to the last
f2a0: 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64   column inserted
f2b0: 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61  .  pTo is the na
f2c0: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62  me of.** the tab
f2d0: 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20  le referred to. 
f2e0: 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73   pToCol is a lis
f2f0: 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  t of tables in t
f300: 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20  he other.** pTo 
f310: 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66  table that the f
f320: 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74  oreign key point
f330: 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e  s to.  flags con
f340: 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66  tains all.** inf
f350: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
f360: 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  he conflict reso
f370: 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
f380: 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69  s specified.** i
f390: 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c  n the ON DELETE,
f3a0: 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f   ON UPDATE and O
f3b0: 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73  N INSERT clauses
f3c0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20  ..**.** An FKey 
f3d0: 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
f3e0: 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74  ated and added t
f3f0: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
f400: 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63  ently.** under c
f410: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74  onstruction in t
f420: 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  he pParse->pNewT
f430: 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65  able field.  The
f440: 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20   new FKey.** is 
f450: 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20  not linked into 
f460: 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69  db->aFKey at thi
f470: 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64  s point - that d
f480: 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a  oes not happen.*
f490: 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 45  * until sqlite3E
f4a0: 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a  ndTable()..**.**
f4b0: 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   The foreign key
f4c0: 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45   is set for IMME
f4d0: 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67  DIATE processing
f4e0: 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  .  A subsequent 
f4f0: 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  call.** to sqlit
f500: 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
f510: 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65  y() might change
f520: 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45   this to DEFERRE
f530: 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  D..*/.void sqlit
f540: 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b  e3CreateForeignK
f550: 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
f560: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
f570: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
f580: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72  .  ExprList *pFr
f590: 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d  omCol,  /* Colum
f5a0: 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65  ns in this table
f5b0: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
f5c0: 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
f5d0: 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20  Token *pTo,     
f5e0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
f5f0: 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
f600: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
f610: 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c  ToCol,    /* Col
f620: 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65  umns in the othe
f630: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  r table */.  int
f640: 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
f650: 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
f660: 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
f670: 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  hms. */.){.#ifnd
f680: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
f690: 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65  OREIGN_KEY.  FKe
f6a0: 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20  y *pFKey = 0;.  
f6b0: 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73  Table *p = pPars
f6c0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
f6d0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  int nByte;.  int
f6e0: 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a   i;.  int nCol;.
f6f0: 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73    char *z;..  as
f700: 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a  sert( pTo!=0 );.
f710: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50    if( p==0 || pP
f720: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
f730: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20  o fk_end;.  if( 
f740: 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
f750: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
f760: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28  >nCol-1;.    if(
f770: 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66   iCol<0 ) goto f
f780: 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70  k_end;.    if( p
f790: 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
f7a0: 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
f7b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
f7c0: 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65  sg(pParse, "fore
f7d0: 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20  ign key on %s". 
f7e0: 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64          " should
f7f0: 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20   reference only 
f800: 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  one column of ta
f810: 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20  ble %T",.       
f820: 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e    p->aCol[iCol].
f830: 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20  zName, pTo);.   
f840: 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
f850: 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d      }.    nCol =
f860: 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
f870: 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
f880: 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f  ->nExpr!=pFromCo
f890: 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  l->nExpr ){.    
f8a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f8b0: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
f8c0: 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d  "number of colum
f8d0: 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  ns in foreign ke
f8e0: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
f8f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22   the number of "
f900: 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e  .        "column
f910: 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e  s in the referen
f920: 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20  ced table");.   
f930: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
f940: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20  }else{.    nCol 
f950: 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  = pFromCol->nExp
f960: 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  r;.  }.  nByte =
f970: 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20   sizeof(*pFKey) 
f980: 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46  + nCol*sizeof(pF
f990: 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20  Key->aCol[0]) + 
f9a0: 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66  pTo->n + 1;.  if
f9b0: 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
f9c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f  for(i=0; i<pToCo
f9d0: 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  l->nExpr; i++){.
f9e0: 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73        nByte += s
f9f0: 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b  trlen(pToCol->a[
fa00: 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
fa10: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
fa20: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
fa30: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
fa40: 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20  pFKey==0 ) goto 
fa50: 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d  fk_end;.  pFKey-
fa60: 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46  >pFrom = p;.  pF
fa70: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d  Key->pNextFrom =
fa80: 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d   p->pFKey;.  z =
fa90: 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31   (char*)&pFKey[1
faa0: 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  ];.  pFKey->aCol
fab0: 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d   = (struct sColM
fac0: 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69  ap*)z;.  z += si
fad0: 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c  zeof(struct sCol
fae0: 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b  Map)*nCol;.  pFK
faf0: 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d  ey->zTo = z;.  m
fb00: 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c  emcpy(z, pTo->z,
fb10: 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54   pTo->n);.  z[pT
fb20: 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b  o->n] = 0;.  z +
fb30: 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46  = pTo->n+1;.  pF
fb40: 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30  Key->pNextTo = 0
fb50: 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20  ;.  pFKey->nCol 
fb60: 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46  = nCol;.  if( pF
fb70: 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
fb80: 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e   pFKey->aCol[0].
fb90: 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  iFrom = p->nCol-
fba0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
fbb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
fbc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
fbd0: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
fbe0: 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b  0; j<p->nCol; j+
fbf0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
fc00: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
fc10: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
fc20: 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
fc30: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
fc40: 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43         pFKey->aC
fc50: 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b  ol[i].iFrom = j;
fc60: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
fc70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fc80: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e    }.      if( j>
fc90: 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  =p->nCol ){.    
fca0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
fcb0: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
fcc0: 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20         "unknown 
fcd0: 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e  column \"%s\" in
fce0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
fcf0: 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20  inition", .     
fd00: 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61       pFromCol->a
fd10: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
fd20: 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
fd30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
fd40: 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20   }.  if( pToCol 
fd50: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
fd60: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
fd70: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
fd80: 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  en(pToCol->a[i].
fd90: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
fda0: 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
fdb0: 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d  l = z;.      mem
fdc0: 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  cpy(z, pToCol->a
fdd0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  [i].zName, n);. 
fde0: 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20       z[n] = 0;. 
fdf0: 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20       z += n+1;. 
fe00: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
fe10: 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30  ->isDeferred = 0
fe20: 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74  ;.  pFKey->delet
fe30: 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20  eConf = flags & 
fe40: 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75  0xff;.  pFKey->u
fe50: 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61  pdateConf = (fla
fe60: 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66  gs >> 8 ) & 0xff
fe70: 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72  ;.  pFKey->inser
fe80: 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e  tConf = (flags >
fe90: 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a  > 16 ) & 0xff;..
fea0: 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
feb0: 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
fec0: 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
fed0: 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
fee0: 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
fef0: 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
ff00: 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
ff10: 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 23 65 6e  Free(pFKey);.#en
ff20: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
ff30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
ff40: 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71  IGN_KEY) */.  sq
ff50: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
ff60: 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20  ete(pFromCol);. 
ff70: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ff80: 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a  Delete(pToCol);.
ff90: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
ffa0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
ffb0: 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c  when an INITIALL
ffc0: 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49  Y IMMEDIATE or I
ffd0: 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
ffe0: 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73  D.** clause is s
fff0: 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61  een as part of a
10000 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
10010 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73  inition.  The is
10020 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61  Deferred.** para
10030 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49  meter is 1 for I
10040 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
10050 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54  D and 0 for INIT
10060 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e  IALLY IMMEDIATE.
10070 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72  .** The behavior
10080 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
10090 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f  ently created fo
100a0 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a  reign key is adj
100b0 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69  usted.** accordi
100c0 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ngly..*/.void sq
100d0 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
100e0 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72  nKey(Parse *pPar
100f0 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72  se, int isDeferr
10100 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ed){.#ifndef SQL
10110 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
10120 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54  _KEY.  Table *pT
10130 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  ab;.  FKey *pFKe
10140 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d  y;.  if( (pTab =
10150 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
10160 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79  le)==0 || (pFKey
10170 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d   = pTab->pFKey)=
10180 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
10190 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
101a0 20 3d 20 69 73 44 65 66 65 72 72 65 64 3b 0a 23   = isDeferred;.#
101b0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  endif.}../*.** G
101c0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
101d0 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64  t will erase and
101e0 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70   refill index *p
101f0 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  Idx.  This is.**
10200 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c   used to initial
10210 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61  ize a newly crea
10220 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20  ted index or to 
10230 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  recompute the.**
10240 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69   content of an i
10250 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65  ndex in response
10260 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f   to a REINDEX co
10270 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20  mmand..**.** if 
10280 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e  memRootPage is n
10290 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20  ot negative, it 
102a0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 69  means that the i
102b0 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a  ndex is newly.**
102c0 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 6d   created.  The m
102d0 65 6d 6f 72 79 20 63 65 6c 6c 20 73 70 65 63 69  emory cell speci
102e0 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50  fied by memRootP
102f0 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  age contains the
10300 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  .** root page nu
10310 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
10320 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61  x.  If memRootPa
10330 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
10340 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65  then.** the inde
10350 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
10360 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65   and must be cle
10370 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ared before bein
10380 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a  g refilled and.*
10390 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * the root page 
103a0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
103b0 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  dex is taken fro
103c0 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a  m pIndex->tnum..
103d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
103e0 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
103f0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
10400 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20   Index *pIndex, 
10410 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29  int memRootPage)
10420 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
10430 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
10440 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  ;  /* The table 
10450 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20  that is indexed 
10460 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
10470 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 20 20 20  pParse->nTab;   
10480 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
10490 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61  sor used for pTa
104a0 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20  b */.  int iIdx 
104b0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 31  = pParse->nTab+1
104c0 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63  ;     /* Btree c
104d0 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
104e0 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61  Index */.  int a
104f0 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  ddr1;           
10500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
10510 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c  ress of top of l
10520 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75  oop */.  int tnu
10530 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
10540 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
10550 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  page of index */
10560 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
10570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10580 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
10590 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72  de into this vir
105a0 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a  tual machine */.
105b0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b    KeyInfo *pKey;
105c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105d0 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20   /* KeyInfo for 
105e0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
105f0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
10600 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
10610 2d 3e 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  ->db, pIndex->pS
10620 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
10630 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
10640 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
10650 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
10660 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
10670 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78  _REINDEX, pIndex
10680 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20  ->zName, 0,.    
10690 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44    pParse->db->aD
106a0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29  b[iDb].zName ) )
106b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
106c0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
106d0 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  equire a write-l
106e0 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
106f0 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73   to perform this
10700 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
10710 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
10720 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
10730 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61  ab->tnum, 1, pTa
10740 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20  b->zName);..  v 
10750 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
10760 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
10770 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
10780 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
10790 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
107a0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
107b0 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 52 6f  P_MemLoad, memRo
107c0 6f 74 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  otPage, 0);.    
107d0 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tnum = 0;.  }els
107e0 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49  e{.    tnum = pI
107f0 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20  ndex->tnum;.    
10800 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10810 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e  (v, OP_Clear, tn
10820 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20  um, iDb);.  }.  
10830 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10840 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
10850 69 44 62 2c 20 30 29 3b 0a 20 20 70 4b 65 79 20  iDb, 0);.  pKey 
10860 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
10870 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
10880 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  ndex);.  sqlite3
10890 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
108a0 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74  enWrite, iIdx, t
108b0 6e 75 6d 2c 20 28 63 68 61 72 20 2a 29 70 4b 65  num, (char *)pKe
108c0 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  y, P3_KEYINFO_HA
108d0 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74 65  NDOFF);.  sqlite
108e0 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
108f0 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
10900 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
10910 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
10920 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10930 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
10940 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65   0);.  sqlite3Ge
10950 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 76  nerateIndexKey(v
10960 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62 29 3b  , pIndex, iTab);
10970 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f  .  if( pIndex->o
10980 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
10990 29 7b 0a 20 20 20 20 69 6e 74 20 63 75 72 61 64  ){.    int curad
109a0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
109b0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
109c0 20 20 20 20 69 6e 74 20 61 64 64 72 32 20 3d 20      int addr2 = 
109d0 63 75 72 61 64 64 72 2b 34 3b 0a 20 20 20 20 73  curaddr+4;.    s
109e0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
109f0 50 32 28 76 2c 20 63 75 72 61 64 64 72 2d 31 2c  P2(v, curaddr-1,
10a00 20 61 64 64 72 32 29 3b 0a 20 20 20 20 73 71 6c   addr2);.    sql
10a10 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10a20 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c   OP_Rowid, iTab,
10a30 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
10a40 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10a50 41 64 64 49 6d 6d 2c 20 31 2c 20 30 29 3b 0a 20  AddImm, 1, 0);. 
10a60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10a70 64 4f 70 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71  dOp(v, OP_IsUniq
10a80 75 65 2c 20 69 49 64 78 2c 20 61 64 64 72 32 29  ue, iIdx, addr2)
10a90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10aa0 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  eOp3(v, OP_Halt,
10ab0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
10ac0 4e 54 2c 20 4f 45 5f 41 62 6f 72 74 2c 0a 20 20  NT, OE_Abort,.  
10ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ae0 20 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d    "indexed colum
10af0 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75  ns are not uniqu
10b00 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  e", P3_STATIC);.
10b10 20 20 20 20 61 73 73 65 72 74 28 20 61 64 64 72      assert( addr
10b20 32 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 43 75  2==sqlite3VdbeCu
10b30 72 72 65 6e 74 41 64 64 72 28 76 29 20 29 3b 0a  rrentAddr(v) );.
10b40 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
10b50 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
10b60 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 30 29  Insert, iIdx, 0)
10b70 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
10b80 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
10b90 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b   iTab, addr1+1);
10ba0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
10bb0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
10bc0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
10bd0 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
10be0 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 73 71  , iTab, 0);.  sq
10bf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10c00 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78  , OP_Close, iIdx
10c10 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  , 0);.}../*.** C
10c20 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  reate a new inde
10c30 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62  x for an SQL tab
10c40 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d  le.  pName1.pNam
10c50 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  e2 is the name o
10c60 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  f the index .** 
10c70 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20  and pTblList is 
10c80 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
10c90 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
10ca0 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
10cb0 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
10cc0 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
10cd0 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
10ce0 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
10cf0 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
10d00 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
10d10 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
10d20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
10d30 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
10d40 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
10d50 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
10d60 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
10d70 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
10d80 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
10d90 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
10da0 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
10db0 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
10dc0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
10dd0 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
10de0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
10df0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
10e00 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
10e10 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
10e20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
10e30 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
10e40 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
10e50 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
10e60 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
10e70 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
10e80 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
10e90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10ea0 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
10eb0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10ec0 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61    /* All informa
10ed0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
10ee0 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  parse */.  Token
10ef0 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
10f00 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69   First part of i
10f10 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
10f20 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  e NULL */.  Toke
10f30 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
10f40 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
10f50 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
10f60 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72   be NULL */.  Sr
10f70 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c  cList *pTblName,
10f80 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64   /* Table to ind
10f90 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e  ex. Use pParse->
10fa0 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a  pNewTable if 0 *
10fb0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
10fc0 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74  ist,   /* A list
10fd0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
10fe0 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
10ff0 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
11000 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
11010 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
11020 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
11030 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
11040 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  art,     /* The 
11050 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
11060 74 20 62 65 67 69 6e 73 20 61 20 43 52 45 41 54  t begins a CREAT
11070 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
11080 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45  t */.  Token *pE
11090 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  nd,       /* The
110a0 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73   ")" that closes
110b0 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
110c0 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  X statement */. 
110d0 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20   int sortOrder, 
110e0 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65      /* Sort orde
110f0 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79  r of primary key
11100 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c   when pList==NUL
11110 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74  L */.  int ifNot
11120 45 78 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69  Exist     /* Omi
11130 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78  t error if index
11140 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
11150 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
11160 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Tab = 0;     /* 
11170 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
11180 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
11190 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a  pIndex = 0;   /*
111a0 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
111b0 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68   created */.  ch
111c0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20  ar *zName = 0;  
111d0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
111e0 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
111f0 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
11200 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
11210 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61  haracters in zNa
11220 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  me */.  int i, j
11230 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64  ;.  Token nullId
11240 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65  ;        /* Fake
11250 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d   token for an em
11260 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20  pty ID list */. 
11270 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20   DbFixer sFix;  
11280 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73        /* For ass
11290 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  igning database 
112a0 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20  names to pTable 
112b0 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
112c0 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74  erMask;   /* 1 t
112d0 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20  o honor DESC in 
112e0 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e  index.  0 to ign
112f0 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ore. */.  sqlite
11300 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
11310 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  db;.  Db *pDb;  
11320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11330 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65  e specific table
11340 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
11350 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65  indexed database
11360 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
11370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
11380 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
11390 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e  ase that is bein
113a0 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54  g written */.  T
113b0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
113c0 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
113d0 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  ed name of the i
113e0 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a  ndex to create *
113f0 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  /.  struct ExprL
11400 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49  ist_item *pListI
11410 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  tem; /* For loop
11420 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a  ing over pList *
11430 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  /.  int nCol;.  
11440 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a  int nExtra = 0;.
11450 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a    char *zExtra;.
11460 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
11470 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61  Err || sqlite3Ma
11480 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a  llocFailed() ){.
11490 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
114a0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
114b0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
114c0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
114d0 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
114e0 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69    Return early i
114f0 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  f not found..  *
11500 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65  /.  if( pTblName
11510 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55  !=0 ){..    /* U
11520 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20  se the two-part 
11530 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65  index name to de
11540 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61  termine the data
11550 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20  base .    ** to 
11560 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74  search for the t
11570 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20  able. 'Fix' the 
11580 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
11590 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66  is db.    ** bef
115a0 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74  ore looking up t
115b0 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  he table..    */
115c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
115d0 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b  me1 && pName2 );
115e0 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
115f0 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
11600 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
11610 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
11620 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67     if( iDb<0 ) g
11630 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
11640 69 6e 64 65 78 3b 0a 0a 23 69 66 6e 64 65 66 20  index;..#ifndef 
11650 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50  SQLITE_OMIT_TEMP
11660 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  DB.    /* If the
11670 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20   index name was 
11680 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65  unqualified, che
11690 63 6b 20 69 66 20 74 68 65 20 74 68 65 20 74 61  ck if the the ta
116a0 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  ble.    ** is a 
116b0 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73  temp table. If s
116c0 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  o, set the datab
116d0 61 73 65 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2f  ase to 1..    */
116e0 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
116f0 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70  te3SrcListLookup
11700 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d  (pParse, pTblNam
11710 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d  e);.    if( pNam
11720 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d  e2 && pName2->n=
11730 3d 30 20 26 26 20 70 54 61 62 20 26 26 20 70 54  =0 && pTab && pT
11740 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  ab->pSchema==db-
11750 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
11760 29 7b 0a 20 20 20 20 20 20 69 44 62 20 3d 20 31  ){.      iDb = 1
11770 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
11780 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
11790 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50  ixInit(&sFix, pP
117a0 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65  arse, iDb, "inde
117b0 78 22 2c 20 70 4e 61 6d 65 29 20 26 26 0a 20 20  x", pName) &&.  
117c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 78        sqlite3Fix
117d0 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70  SrcList(&sFix, p
117e0 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20 29 7b 0a  TblName).    ){.
117f0 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
11800 20 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e 73   the parser cons
11810 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d 65 20  tructs pTblName 
11820 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69 64  from a single id
11830 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20 20 20  entifier,.      
11840 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  ** sqlite3FixSrc
11850 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72 20 66  List can never f
11860 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ail. */.      as
11870 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20  sert(0);.    }. 
11880 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
11890 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
118a0 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61  rse, pTblName->a
118b0 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  [0].zName, .    
118c0 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b      pTblName->a[
118d0 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
118e0 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67     if( !pTab ) g
118f0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
11900 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72  index;.    asser
11910 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t( db->aDb[iDb].
11920 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
11930 53 63 68 65 6d 61 20 29 3b 0a 20 20 7d 65 6c 73  Schema );.  }els
11940 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
11950 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Name==0 );.    p
11960 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
11970 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28  ewTable;.    if(
11980 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78   !pTab ) goto ex
11990 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
119a0 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
119b0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
119c0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
119d0 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20  a);.  }.  pDb = 
119e0 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a  &db->aDb[iDb];..
119f0 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c    if( pTab==0 ||
11a00 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
11a10 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
11a20 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54  _index;.  if( pT
11a30 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  ab->readOnly ){.
11a40 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11a50 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
11a60 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65  le %s may not be
11a70 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d   indexed", pTab-
11a80 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
11a90 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
11aa0 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  dex;.  }.#ifndef
11ab0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
11ac0 57 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53  W.  if( pTab->pS
11ad0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
11ae0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11af0 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20  rse, "views may 
11b00 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
11b10 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
11b20 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11b30 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20  }.#endif..  /*. 
11b40 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d   ** Find the nam
11b50 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  e of the index. 
11b60 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
11b70 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
11b80 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64  another.  ** ind
11b90 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68  ex or table with
11ba0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
11bb0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65   .  **.  ** Exce
11bc0 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72  ption:  If we ar
11bd0 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61  e reading the na
11be0 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74  mes of permanent
11bf0 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68   indices from th
11c00 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  e.  ** sqlite_ma
11c10 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61  ster table (beca
11c20 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  use some other p
11c30 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74  rocess changed t
11c40 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20  he schema) and. 
11c50 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   ** one of the i
11c60 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69  ndex names colli
11c70 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d  des with the nam
11c80 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79  e of a temporary
11c90 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69   table or.  ** i
11ca0 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69  ndex, then we wi
11cb0 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70  ll continue to p
11cc0 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65  rocess this inde
11cd0 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  x..  **.  ** If 
11ce0 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  pName==0 it mean
11cf0 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20  s that we are.  
11d00 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  ** dealing with 
11d10 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
11d20 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
11d30 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  nt.  We have to 
11d40 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20  invent our.  ** 
11d50 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  own name..  */. 
11d60 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
11d70 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
11d80 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
11d90 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 53  Name);.    if( S
11da0 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
11db0 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
11dc0 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  se) ) goto exit_
11dd0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11de0 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
11df0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
11e00 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
11e10 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
11e20 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
11e30 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
11e40 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
11e50 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
11e60 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
11e70 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
11e80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ){.      if( SQL
11e90 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
11ea0 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
11eb0 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  ) ) goto exit_cr
11ec0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
11ed0 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
11ee0 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
11ef0 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30  , pDb->zName)!=0
11f00 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
11f10 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20  !ifNotExist ){. 
11f20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11f30 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11f40 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61   "index %s alrea
11f50 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d  dy exists", zNam
11f60 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
11f70 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
11f80 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11f90 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
11fa0 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
11fb0 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d  (db, zName, 0)!=
11fc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
11fd0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11fe0 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
11ff0 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e  lready a table n
12000 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29  amed %s", zName)
12010 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
12020 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12030 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
12050 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20  r zBuf[30];.    
12060 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78  int n;.    Index
12070 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72   *pLoop;.    for
12080 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e  (pLoop=pTab->pIn
12090 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b  dex, n=1; pLoop;
120a0 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e   pLoop=pLoop->pN
120b0 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  ext, n++){}.    
120c0 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 5f 25  sprintf(zBuf,"_%
120d0 64 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65  d",n);.    zName
120e0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
120f0 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d  3SetString(&zNam
12100 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69  e, "sqlite_autoi
12110 6e 64 65 78 5f 22 2c 20 70 54 61 62 2d 3e 7a 4e  ndex_", pTab->zN
12120 61 6d 65 2c 20 7a 42 75 66 2c 20 28 63 68 61 72  ame, zBuf, (char
12130 2a 29 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  *)0);.    if( zN
12140 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
12150 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
12160 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
12170 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69   for authorizati
12180 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  on to create an 
12190 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e  index..  */.#ifn
121a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
121b0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
121c0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
121d0 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61   *zDb = pDb->zNa
121e0 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
121f0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
12200 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
12210 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
12220 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29  (iDb), 0, zDb) )
12230 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
12240 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12250 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51      }.    i = SQ
12260 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
12270 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  X;.    if( !OMIT
12280 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
12290 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43  1 ) i = SQLITE_C
122a0 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
122b0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
122c0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
122d0 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61  e, i, zName, pTa
122e0 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
122f0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
12300 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12310 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
12320 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d  ..  /* If pList=
12330 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69  =0, it means thi
12340 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
12350 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70  lled to make a p
12360 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20  rimary.  ** key 
12370 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20  out of the last 
12380 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20  column added to 
12390 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
123a0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20  construction..  
123b0 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66  ** So create a f
123c0 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75  ake list to simu
123d0 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a  late this..  */.
123e0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
123f0 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d  {.    nullId.z =
12400 20 28 75 38 2a 29 70 54 61 62 2d 3e 61 43 6f 6c   (u8*)pTab->aCol
12410 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a  [pTab->nCol-1].z
12420 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64  Name;.    nullId
12430 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68 61  .n = strlen((cha
12440 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20  r*)nullId.z);.  
12450 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
12460 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
12470 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a  0, 0, &nullId);.
12480 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
12490 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
124a0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70  ate_index;.    p
124b0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  List->a[0].sortO
124c0 72 64 65 72 20 3d 20 73 6f 72 74 4f 72 64 65 72  rder = sortOrder
124d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75  ;.  }..  /* Figu
124e0 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
124f0 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
12500 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 73  re required to s
12510 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a  tore explicitly.
12520 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63    ** specified c
12530 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
12540 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20  e names..  */.  
12550 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
12560 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
12570 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
12580 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
12590 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  pr;.    if( pExp
125a0 72 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72  r ){.      nExtr
125b0 61 20 2b 3d 20 28 31 20 2b 20 73 74 72 6c 65 6e  a += (1 + strlen
125c0 28 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a  (pExpr->pColl->z
125d0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Name));.    }.  
125e0 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c  }..  /* .  ** Al
125f0 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
12600 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a   structure. .  *
12610 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c  /.  nName = strl
12620 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 43 6f  en(zName);.  nCo
12630 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  l = pList->nExpr
12640 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  ;.  pIndex = sql
12650 69 74 65 4d 61 6c 6c 6f 63 28 20 0a 20 20 20 20  iteMalloc( .    
12660 20 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20    sizeof(Index) 
12670 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  +              /
12680 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  * Index structur
12690 65 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65  e  */.      size
126a0 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 20 2b 20 20  of(int)*nCol +  
126b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
126c0 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a  x.aiColumn   */.
126d0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74        sizeof(int
126e0 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20  )*(nCol+1) +    
126f0 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f     /* Index.aiRo
12700 77 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20  wEst   */.      
12710 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 2a 6e  sizeof(char *)*n
12720 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 2f 2a 20  Col +        /* 
12730 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20  Index.azColl    
12740 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
12750 28 75 38 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20  (u8)*nCol +     
12760 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
12770 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20  aSortOrder */.  
12780 20 20 20 20 6e 4e 61 6d 65 20 2b 20 31 20 2b 20      nName + 1 + 
12790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127a0 20 2f 2a 20 49 6e 64 65 78 2e 7a 4e 61 6d 65 20   /* Index.zName 
127b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e 45       */.      nE
127c0 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20  xtra            
127d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
127e0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
127f0 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 29 3b 0a 20   names */.  );. 
12800 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c   if( sqlite3Mall
12810 6f 63 46 61 69 6c 65 64 28 29 20 29 20 67 6f 74  ocFailed() ) got
12820 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
12830 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  dex;.  pIndex->a
12840 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29  zColl = (char**)
12850 28 26 70 49 6e 64 65 78 5b 31 5d 29 3b 0a 20 20  (&pIndex[1]);.  
12860 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
12870 20 3d 20 28 69 6e 74 20 2a 29 28 26 70 49 6e 64   = (int *)(&pInd
12880 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 5d  ex->azColl[nCol]
12890 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 52  );.  pIndex->aiR
128a0 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65  owEst = (unsigne
128b0 64 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69  d *)(&pIndex->ai
128c0 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d 29 3b 0a 20  Column[nCol]);. 
128d0 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
128e0 64 65 72 20 3d 20 28 75 38 20 2a 29 28 26 70 49  der = (u8 *)(&pI
128f0 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b 6e  ndex->aiRowEst[n
12900 43 6f 6c 2b 31 5d 29 3b 0a 20 20 70 49 6e 64 65  Col+1]);.  pInde
12910 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  x->zName = (char
12920 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 53 6f   *)(&pIndex->aSo
12930 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 29 3b 0a  rtOrder[nCol]);.
12940 20 20 7a 45 78 74 72 61 20 3d 20 28 63 68 61 72    zExtra = (char
12950 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 7a 4e 61   *)(&pIndex->zNa
12960 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29 3b 0a 20 20  me[nName+1]);.  
12970 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a  strcpy(pIndex->z
12980 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Name, zName);.  
12990 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d  pIndex->pTable =
129a0 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d   pTab;.  pIndex-
129b0 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74  >nColumn = pList
129c0 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65  ->nExpr;.  pInde
129d0 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45  x->onError = onE
129e0 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  rror;.  pIndex->
129f0 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d  autoIndex = pNam
12a00 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  e==0;.  pIndex->
12a10 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
12a20 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a  b[iDb].pSchema;.
12a30 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
12a40 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20  ee if we should 
12a50 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65  honor DESC reque
12a60 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c  sts on index col
12a70 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  umns.  */.  if( 
12a80 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69  pDb->pSchema->fi
12a90 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a  le_format>=4 ){.
12aa0 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73      sortOrderMas
12ab0 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e  k = -1;   /* Hon
12ac0 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c  or DESC */.  }el
12ad0 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65  se{.    sortOrde
12ae0 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a  rMask = 0;    /*
12af0 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a   Ignore DESC */.
12b00 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74    }..  /* Scan t
12b10 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
12b20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74  columns of the t
12b30 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
12b40 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64  ed and.  ** load
12b50 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69   the column indi
12b60 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64  ces into the Ind
12b70 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  ex structure.  R
12b80 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20  eport an error. 
12b90 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d   ** if any colum
12ba0 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  n is not found..
12bb0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
12bc0 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d  pListItem=pList-
12bd0 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  >a; i<pList->nEx
12be0 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74  pr; i++, pListIt
12bf0 65 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74  em++){.    const
12c00 20 63 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65 20   char *zColName 
12c10 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e 61  = pListItem->zNa
12c20 6d 65 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a  me;.    Column *
12c30 70 54 61 62 43 6f 6c 3b 0a 20 20 20 20 69 6e 74  pTabCol;.    int
12c40 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72   requestedSortOr
12c50 64 65 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  der;.    char *z
12c60 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
12c70 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
12c80 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f  tion sequence */
12c90 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70  ..    for(j=0, p
12ca0 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  TabCol=pTab->aCo
12cb0 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; j<pTab->nCol;
12cc0 20 6a 2b 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b 29   j++, pTabCol++)
12cd0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
12ce0 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6c 4e  te3StrICmp(zColN
12cf0 61 6d 65 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e  ame, pTabCol->zN
12d00 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
12d10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
12d20 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  >=pTab->nCol ){.
12d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
12d40 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
12d50 61 62 6c 65 20 25 73 20 68 61 73 20 6e 6f 20 63  able %s has no c
12d60 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c  olumn named %s",
12d70 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
12d80 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b  Name, zColName);
12d90 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
12da0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
12db0 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
12dc0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a  >aiColumn[i] = j
12dd0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 49  ;.    if( pListI
12de0 74 65 6d 2d 3e 70 45 78 70 72 20 29 7b 0a 20 20  tem->pExpr ){.  
12df0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
12e00 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43  tItem->pExpr->pC
12e10 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f  oll );.      zCo
12e20 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20  ll = zExtra;.   
12e30 20 20 20 73 74 72 63 70 79 28 7a 45 78 74 72 61     strcpy(zExtra
12e40 2c 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  , pListItem->pEx
12e50 70 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  pr->pColl->zName
12e60 29 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20  );.      zExtra 
12e70 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 43 6f 6c 6c  += (strlen(zColl
12e80 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73  ) + 1);.    }els
12e90 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  e{.      zColl =
12ea0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
12eb0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28 20  Coll;.      if( 
12ec0 21 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !zColl ){.      
12ed0 20 20 7a 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44    zColl = db->pD
12ee0 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a  fltColl->zName;.
12ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12f00 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
12f10 62 75 73 79 20 26 26 20 21 73 71 6c 69 74 65 33  busy && !sqlite3
12f20 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
12f30 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29  arse, zColl, -1)
12f40 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
12f50 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12f60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
12f70 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20  ex->azColl[i] = 
12f80 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65  zColl;.    reque
12f90 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20  stedSortOrder = 
12fa0 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f  pListItem->sortO
12fb0 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72  rder & sortOrder
12fc0 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78  Mask;.    pIndex
12fd0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
12fe0 3d 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  = requestedSortO
12ff0 72 64 65 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rder;.  }.  sqli
13000 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
13010 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28  (pIndex);..  if(
13020 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70   pTab==pParse->p
13030 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  NewTable ){.    
13040 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
13050 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  has been called 
13060 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74  to create an aut
13070 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20  omatic index as 
13080 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20  a.    ** result 
13090 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  of a PRIMARY KEY
130a0 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
130b0 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65  e on a column de
130c0 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20  finition, or.   
130d0 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45   ** a PRIMARY KE
130e0 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
130f0 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  se following the
13100 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
13110 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e  ons..    ** i.e.
13120 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a   one of:.    **.
13130 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41      ** CREATE TA
13140 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20  BLE t(x PRIMARY 
13150 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20  KEY, y);.    ** 
13160 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
13170 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79  , y, UNIQUE(x, y
13180 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ));.    **.    *
13190 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68  * Either way, ch
131a0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
131b0 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
131c0 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65  has such an inde
131d0 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c  x. If.    ** so,
131e0 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72   don't bother cr
131f0 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e  eating this one.
13200 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69   This only appli
13210 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74  es to.    ** aut
13220 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74  omatically creat
13230 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72  ed indices. User
13240 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79  s can do as they
13250 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a   wish with.    *
13260 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63  * explicit indic
13270 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49  es..    */.    I
13280 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
13290 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
132a0 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
132b0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
132c0 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
132d0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
132e0 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
132f0 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
13300 74 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64  t( pIdx->autoInd
13310 65 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ex );.      asse
13320 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  rt( pIndex->onEr
13330 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
13340 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
13350 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78  >nColumn!=pIndex
13360 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  ->nColumn ) cont
13370 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
13380 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f  k=0; k<pIdx->nCo
13390 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  lumn; k++){.    
133a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
133b0 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  z1 = pIdx->azCol
133c0 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f  l[k];.        co
133d0 6e 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 70  nst char *z2 = p
133e0 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d  Index->azColl[k]
133f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
13400 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21  dx->aiColumn[k]!
13410 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  =pIndex->aiColum
13420 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  n[k] ) break;.  
13430 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
13440 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 21 3d 70  aSortOrder[k]!=p
13450 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
13460 72 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  r[k] ) break;.  
13470 20 20 20 20 20 20 69 66 28 20 7a 31 21 3d 7a 32        if( z1!=z2
13480 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
13490 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65  mp(z1, z2) ) bre
134a0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
134b0 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e    if( k==pIdx->n
134c0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
134d0 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
134e0 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45  ror!=pIndex->onE
134f0 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rror ){.        
13500 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72    /* This constr
13510 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65  aint creates the
13520 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61   same index as a
13530 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
13540 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
13550 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65  t specified some
13560 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45  where in the CRE
13570 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
13580 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ent..          *
13590 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e  * However the ON
135a0 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
135b0 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e  s are different.
135c0 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20   If both this . 
135d0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
135e0 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70  traint and the p
135f0 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65  revious equivale
13600 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  nt constraint ha
13610 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20  ve explicit.    
13620 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46        ** ON CONF
13630 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69  LICT clauses thi
13640 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f  s is an error. O
13650 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
13660 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  e.          ** e
13670 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
13680 69 65 64 20 62 65 68 61 76 69 6f 75 72 20 66 6f  ied behaviour fo
13690 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  r the index..   
136a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
136b0 20 20 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e      if( !(pIdx->
136c0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
136d0 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f  ult || pIndex->o
136e0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
136f0 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lt) ){.         
13700 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13710 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
13720 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e              "con
13730 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46  flicting ON CONF
13740 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73 70 65  LICT clauses spe
13750 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20  cified", 0);.   
13760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13770 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
13780 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
13790 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
137a0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  pIdx->onError = 
137b0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b  pIndex->onError;
137c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
137d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
137e0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
137f0 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
13800 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c     }.  }..  /* L
13810 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65  ink the new Inde
13820 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  x structure to i
13830 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20  ts table and to 
13840 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69  the other.  ** i
13850 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
13860 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20  e structures. . 
13870 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
13880 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49  it.busy ){.    I
13890 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d  ndex *p;.    p =
138a0 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
138b0 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68  rt(&pIndex->pSch
138c0 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20  ema->idxHash, . 
138d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138e0 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
138f0 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49  zName, strlen(pI
13900 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20  ndex->zName)+1, 
13910 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28  pIndex);.    if(
13920 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65   p ){.      asse
13930 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b  rt( p==pIndex );
13940 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
13950 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
13960 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
13970 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
13980 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67    }.    db->flag
13990 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
139a0 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69  rnChanges;.    i
139b0 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
139c0 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
139d0 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
139e0 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20  newTnum;.    }. 
139f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
13a00 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
13a10 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74   0 then create t
13a20 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b  he index on disk
13a30 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76  .  This.  ** inv
13a40 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68  olves writing th
13a50 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  e index into the
13a60 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
13a70 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  d filling in the
13a80 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68  .  ** index with
13a90 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
13aa0 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a  le contents..  *
13ab0 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69  *.  ** The db->i
13ac0 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 77 68  nit.busy is 0 wh
13ad0 65 6e 20 74 68 65 20 75 73 65 72 20 66 69 72 73  en the user firs
13ae0 74 20 65 6e 74 65 72 73 20 61 20 43 52 45 41 54  t enters a CREAT
13af0 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f  E INDEX .  ** co
13b00 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74  mmand.  db->init
13b10 2e 62 75 73 79 20 69 73 20 31 20 77 68 65 6e 20  .busy is 1 when 
13b20 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  a database is op
13b30 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43  ened and .  ** C
13b40 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
13b50 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64 20  ements are read 
13b60 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65  out of the maste
13b70 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a  r table.  In.  *
13b80 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73  * the latter cas
13b90 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65  e the index alre
13ba0 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69  ady exists on di
13bb0 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68 79  sk, which is why
13bc0 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77  .  ** we don't w
13bd0 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20  ant to recreate 
13be0 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  it..  **.  ** If
13bf0 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20   pTblName==0 it 
13c00 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78  means this index
13c10 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73   is generated as
13c20 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20   a primary key. 
13c30 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f   ** or UNIQUE co
13c40 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52  nstraint of a CR
13c50 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
13c60 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65  ment.  Since the
13c70 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20   table.  ** has 
13c80 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65  just been create
13c90 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e  d, it contains n
13ca0 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69  o data and the i
13cb0 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  ndex initializat
13cc0 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61  ion.  ** step ca
13cd0 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
13ce0 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62  */.  else if( db
13cf0 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
13d00 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  {.    Vdbe *v;. 
13d10 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a     char *zStmt;.
13d20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70      int iMem = p
13d30 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 0a  Parse->nMem++;..
13d40 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
13d50 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
13d60 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67      if( v==0 ) g
13d70 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
13d80 69 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20  index;...    /* 
13d90 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70  Create the rootp
13da0 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65  age for the inde
13db0 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  x.    */.    sql
13dc0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
13dd0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
13de0 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  1, iDb);.    sql
13df0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
13e00 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c   OP_CreateIndex,
13e10 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71   iDb, 0);.    sq
13e20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13e30 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
13e40 4d 65 6d 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  Mem, 0);..    /*
13e50 20 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70   Gather the comp
13e60 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
13e70 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
13e80 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20  atement into.   
13e90 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61   ** the zStmt va
13ea0 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20  riable.    */.  
13eb0 20 20 69 66 28 20 70 53 74 61 72 74 20 26 26 20    if( pStart && 
13ec0 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pEnd ){.      /*
13ed0 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77   A named index w
13ee0 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20  ith an explicit 
13ef0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
13f00 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  tement */.      
13f10 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
13f20 50 72 69 6e 74 66 28 22 43 52 45 41 54 45 25 73  Printf("CREATE%s
13f30 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20   INDEX %.*s",.  
13f40 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f        onError==O
13f50 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20  E_None ? "" : " 
13f60 55 4e 49 51 55 45 22 2c 0a 20 20 20 20 20 20 20  UNIQUE",.       
13f70 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65   pEnd->z - pName
13f80 2d 3e 7a 20 2b 20 31 2c 0a 20 20 20 20 20 20 20  ->z + 1,.       
13f90 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20   pName->z);.    
13fa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
13fb0 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  An automatic ind
13fc0 65 78 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ex created by a 
13fd0 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
13fe0 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
13ff0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74   */.      /* zSt
14000 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
14010 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20  ntf(""); */.    
14020 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    zStmt = 0;.   
14030 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61   }..    /* Add a
14040 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74  n entry in sqlit
14050 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69  e_master for thi
14060 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20  s index.    */. 
14070 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
14080 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
14090 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
140a0 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53  NTO %Q.%s VALUES
140b0 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23  ('index',%Q,%Q,#
140c0 30 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20  0,%Q);",.       
140d0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
140e0 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
140f0 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20  E(iDb),.        
14100 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20  pIndex->zName,. 
14110 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
14120 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d  me,.        zStm
14130 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  t.    );.    sql
14140 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
14150 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
14160 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
14170 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  Stmt);..    /* F
14180 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69  ill the index wi
14190 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70 61  th data and repa
141a0 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20  rse the schema. 
141b0 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72  Code an OP_Expir
141c0 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61  e.    ** to inva
141d0 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63  lidate all pre-c
141e0 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
141f0 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ts..    */.    i
14200 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20  f( pTblName ){. 
14210 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
14220 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
14230 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20  pIndex, iMem);. 
14240 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e       sqlite3Chan
14250 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20  geCookie(db, v, 
14260 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
14270 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
14280 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44  _ParseSchema, iD
14290 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73  b, 0,.         s
142a0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 6e  qlite3MPrintf("n
142b0 61 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e 64 65  ame='%q'", pInde
142c0 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59  x->zName), P3_DY
142d0 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73 71  NAMIC);.      sq
142e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
142f0 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c 20  , OP_Expire, 0, 
14300 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
14310 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20   /* When adding 
14320 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20  an index to the 
14330 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20  list of indices 
14340 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b  for a table, mak
14350 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20  e.  ** sure all 
14360 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20  indices labeled 
14370 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20  OE_Replace come 
14380 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20  after all those 
14390 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f  labeled.  ** OE_
143a0 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73  Ignore.  This is
143b0 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74   necessary for t
143c0 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  he correct opera
143d0 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a 20  tion of UPDATE. 
143e0 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a   ** and INSERT..
143f0 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
14400 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c  nit.busy || pTbl
14410 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Name==0 ){.    i
14420 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  f( onError!=OE_R
14430 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e  eplace || pTab->
14440 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20  pIndex==0.      
14450 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64     || pTab->pInd
14460 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
14470 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20  Replace){.      
14480 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
14490 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
144a0 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78      pTab->pIndex
144b0 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
144c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
144d0 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62  x *pOther = pTab
144e0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
144f0 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70  while( pOther->p
14500 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e  Next && pOther->
14510 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d  pNext->onError!=
14520 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20  OE_Replace ){.  
14530 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70        pOther = p
14540 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
14550 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64      }.      pInd
14560 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68  ex->pNext = pOth
14570 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
14580 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d   pOther->pNext =
14590 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20   pIndex;.    }. 
145a0 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20     pIndex = 0;. 
145b0 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75   }..  /* Clean u
145c0 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  p before exiting
145d0 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f   */.exit_create_
145e0 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e  index:.  if( pIn
145f0 64 65 78 20 29 7b 0a 20 20 20 20 66 72 65 65 49  dex ){.    freeI
14600 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
14610 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  }.  sqlite3ExprL
14620 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
14630 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  ;.  sqlite3SrcLi
14640 73 74 44 65 6c 65 74 65 28 70 54 62 6c 4e 61 6d  stDelete(pTblNam
14650 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
14660 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  (zName);.  retur
14670 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  n;.}../*.** Gene
14680 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 61 6b  rate code to mak
14690 65 20 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  e sure the file 
146a0 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20 69 73  format number is
146b0 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 6f 72   at least minFor
146c0 6d 61 74 2e 0a 2a 2a 20 54 68 65 20 67 65 6e 65  mat..** The gene
146d0 72 61 74 65 64 20 63 6f 64 65 20 77 69 6c 6c 20  rated code will 
146e0 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c  increase the fil
146f0 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20  e format number 
14700 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f  if necessary..*/
14710 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 69 6e  .void sqlite3Min
14720 69 6d 75 6d 46 69 6c 65 46 6f 72 6d 61 74 28 50  imumFileFormat(P
14730 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
14740 74 20 69 44 62 2c 20 69 6e 74 20 6d 69 6e 46 6f  t iDb, int minFo
14750 72 6d 61 74 29 7b 0a 20 20 56 64 62 65 20 2a 76  rmat){.  Vdbe *v
14760 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ;.  v = sqlite3G
14770 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
14780 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
14790 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
147a0 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65  v, OP_ReadCookie
147b0 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 73  , iDb, 1);.    s
147c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
147d0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d  v, OP_Integer, m
147e0 69 6e 46 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20  inFormat, 0);.  
147f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14800 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20 30 2c 20  Op(v, OP_Ge, 0, 
14810 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
14820 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
14830 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14840 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
14850 2c 20 6d 69 6e 46 6f 72 6d 61 74 2c 20 30 29 3b  , minFormat, 0);
14860 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14870 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43  AddOp(v, OP_SetC
14880 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a  ookie, iDb, 1);.
14890 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c    }.}../*.** Fil
148a0 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f  l the Index.aiRo
148b0 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74  wEst[] array wit
148c0 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d  h default inform
148d0 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74  ation - informat
148e0 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65  ion.** to be use
148f0 64 20 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e  d when we have n
14900 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59  ot run the ANALY
14910 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  ZE command..**.*
14920 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73  * aiRowEst[0] is
14930 20 73 75 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74   suppose to cont
14940 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ain the number o
14950 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
14960 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63  e index..** Sinc
14970 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  e we do not know
14980 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f  , guess 1 millio
14990 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20  n.  aiRowEst[1] 
149a0 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
149b0 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  f the.** number 
149c0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
149d0 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20  able that match 
149e0 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 76  any particular v
149f0 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  alue of the.** f
14a00 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  irst column of t
14a10 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77  he index.  aiRow
14a20 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74  Est[2] is an est
14a30 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
14a40 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74  ber.** of rows t
14a50 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61  hat match any pa
14a60 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69  rticular combini
14a70 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72  ation of the fir
14a80 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  st 2 columns.** 
14a90 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41  of the index.  A
14aa0 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74  nd so forth.  It
14ab0 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20   must always be 
14ac0 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a  the case that.*.
14ad0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52  **           aiR
14ae0 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45  owEst[N]<=aiRowE
14af0 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20  st[N-1].**      
14b00 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d       aiRowEst[N]
14b10 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20  >=1.**.** Apart 
14b20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61  from that, we ha
14b30 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20  ve little to go 
14b40 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75 69  on besides intui
14b50 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f  tion as to.** ho
14b60 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f  w aiRowEst[] sho
14b70 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  uld be initializ
14b80 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73  ed.  The numbers
14b90 20 67 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a   generated here.
14ba0 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20  ** are based on 
14bb0 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66  typical values f
14bc0 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69  ound in actual i
14bd0 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ndices..*/.void 
14be0 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f  sqlite3DefaultRo
14bf0 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78  wEst(Index *pIdx
14c00 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 2a 61  ){.  unsigned *a
14c10 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73   = pIdx->aiRowEs
14c20 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  t;.  int i;.  as
14c30 73 65 72 74 28 20 61 21 3d 30 20 29 3b 0a 20 20  sert( a!=0 );.  
14c40 61 5b 30 5d 20 3d 20 31 30 30 30 30 30 30 3b 0a  a[0] = 1000000;.
14c50 20 20 66 6f 72 28 69 3d 70 49 64 78 2d 3e 6e 43    for(i=pIdx->nC
14c60 6f 6c 75 6d 6e 3b 20 69 3e 3d 31 3b 20 69 2d 2d  olumn; i>=1; i--
14c70 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 31 30  ){.    a[i] = 10
14c80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78  ;.  }.  if( pIdx
14c90 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
14ca0 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70 49 64 78  ne ){.    a[pIdx
14cb0 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a  ->nColumn] = 1;.
14cc0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
14cd0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
14ce0 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
14cf0 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68  named index.  Th
14d00 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d  is routine.** im
14d10 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f  plements the DRO
14d20 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  P INDEX statemen
14d30 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
14d40 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  e3DropIndex(Pars
14d50 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
14d60 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
14d70 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65  fExists){.  Inde
14d80 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62  x *pIndex;.  Vdb
14d90 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
14da0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
14db0 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
14dc0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
14dd0 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f   || sqlite3Mallo
14de0 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20  cFailed() ){.   
14df0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14e00 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73  index;.  }.  ass
14e10 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
14e20 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ==1 );.  if( SQL
14e30 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
14e40 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
14e50 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
14e60 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
14e70 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
14e80 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
14e90 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  b, pName->a[0].z
14ea0 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
14eb0 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
14ec0 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
14ed0 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73  .    if( !ifExis
14ee0 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts ){.      sqli
14ef0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14f00 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
14f10 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20  ex: %S", pName, 
14f20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  0);.    }.    pP
14f30 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
14f40 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  a = 1;.    goto 
14f50 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
14f60 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
14f70 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a  x->autoIndex ){.
14f80 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14f90 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
14fa0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
14fb0 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20  th UNIQUE ".    
14fc0 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45    "or PRIMARY KE
14fd0 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Y constraint can
14fe0 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
14ff0 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78   0);.    goto ex
15000 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
15010 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
15020 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
15030 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  db, pIndex->pSch
15040 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ema);.#ifndef SQ
15050 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
15060 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
15070 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  int code = SQLIT
15080 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20  E_DROP_INDEX;.  
15090 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
150a0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a  pIndex->pTable;.
150b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
150c0 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
150d0 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  b].zName;.    co
150e0 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
150f0 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
15100 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  b);.    if( sqli
15110 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
15120 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
15130 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
15140 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
15150 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
15160 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
15170 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
15180 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49  Db ) code = SQLI
15190 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44  TE_DROP_TEMP_IND
151a0 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
151b0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
151c0 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65  rse, code, pInde
151d0 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  x->zName, pTab->
151e0 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
151f0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
15200 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
15210 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
15220 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
15230 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  to remove the in
15240 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65  dex and from the
15250 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f   master table */
15260 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
15270 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
15280 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
15290 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
152a0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
152b0 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
152c0 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  %s WHERE name=%Q
152d0 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ",.       db->aD
152e0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
152f0 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
15300 0a 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  .       pIndex->
15310 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20  zName.    );.   
15320 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
15330 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29  okie(db, v, iDb)
15340 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  ;.    destroyRoo
15350 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
15360 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  ndex->tnum, iDb)
15370 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15380 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 49  eOp3(v, OP_DropI
15390 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 70 49  ndex, iDb, 0, pI
153a0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
153b0 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  .  }..exit_drop_
153c0 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33  index:.  sqlite3
153d0 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e  SrcListDelete(pN
153e0 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  ame);.}../*.** p
153f0 70 41 72 72 61 79 20 70 6f 69 6e 74 73 20 69 6e  pArray points in
15400 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 77  to a structure w
15410 68 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e  here there is an
15420 20 61 72 72 61 79 20 70 6f 69 6e 74 65 72 0a 2a   array pointer.*
15430 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 77  * followed by tw
15440 6f 20 69 6e 74 65 67 65 72 73 2e 20 54 68 65 20  o integers. The 
15450 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 69 73  first integer is
15460 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
15470 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
15480 65 20 73 74 72 75 63 74 75 72 65 20 61 72 72 61  e structure arra
15490 79 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 69  y.  The second i
154a0 6e 74 65 67 65 72 0a 2a 2a 20 69 73 20 74 68 65  nteger.** is the
154b0 20 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 63   number of alloc
154c0 61 74 65 64 20 73 6c 6f 74 73 20 69 6e 20 74 68  ated slots in th
154d0 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  e array..**.** I
154e0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
154f0 68 65 20 73 74 72 75 63 74 75 72 65 20 6c 6f 6f  he structure loo
15500 6b 73 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b  ks something lik
15510 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
15520 20 20 20 20 20 73 74 72 75 63 74 20 45 78 61 6d       struct Exam
15530 70 6c 65 31 20 7b 0a 2a 2a 20 20 20 20 20 20 20  ple1 {.**       
15540 20 20 20 73 74 72 75 63 74 20 73 75 62 45 6c 65     struct subEle
15550 6d 20 2a 61 45 6e 74 72 79 3b 0a 2a 2a 20 20 20  m *aEntry;.**   
15560 20 20 20 20 20 20 20 69 6e 74 20 6e 45 6e 74 72         int nEntr
15570 79 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  y;.**          i
15580 6e 74 20 6e 41 6c 6c 6f 63 3b 0a 2a 2a 20 20 20  nt nAlloc;.**   
15590 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65       }.**.** The
155a0 20 70 6e 45 6e 74 72 79 20 70 61 72 61 6d 65 74   pnEntry paramet
155b0 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  er points to the
155c0 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 45   equivalent of E
155d0 78 61 6d 70 6c 65 31 2e 6e 45 6e 74 72 79 2e 0a  xample1.nEntry..
155e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
155f0 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e  ne allocates a n
15600 65 77 20 73 6c 6f 74 20 69 6e 20 74 68 65 20 61  ew slot in the a
15610 72 72 61 79 2c 20 7a 65 72 6f 73 20 69 74 20 6f  rray, zeros it o
15620 75 74 2c 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  ut,.** and retur
15630 6e 73 20 69 74 73 20 69 6e 64 65 78 2e 20 20 49  ns its index.  I
15640 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 61  f malloc fails a
15650 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
15660 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
15670 0a 2a 2a 20 73 7a 45 6e 74 72 79 20 69 73 20 74  .** szEntry is t
15680 68 65 20 73 69 7a 65 6f 66 20 6f 66 20 61 20 73  he sizeof of a s
15690 69 6e 67 6c 65 20 61 72 72 61 79 20 65 6e 74 72  ingle array entr
156a0 79 2e 20 20 69 6e 69 74 53 69 7a 65 20 69 73 20  y.  initSize is 
156b0 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f  the .** number o
156c0 66 20 61 72 72 61 79 20 65 6e 74 72 69 65 73 20  f array entries 
156d0 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  allocated on the
156e0 20 69 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61 74   initial allocat
156f0 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
15700 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
15710 28 76 6f 69 64 20 2a 2a 70 70 41 72 72 61 79 2c  (void **ppArray,
15720 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 69 6e   int szEntry, in
15730 74 20 69 6e 69 74 53 69 7a 65 29 7b 0a 20 20 63  t initSize){.  c
15740 68 61 72 20 2a 70 3b 0a 20 20 69 6e 74 20 2a 61  har *p;.  int *a
15750 6e 20 3d 20 28 69 6e 74 2a 29 26 70 70 41 72 72  n = (int*)&ppArr
15760 61 79 5b 31 5d 3b 0a 20 20 69 66 28 20 61 6e 5b  ay[1];.  if( an[
15770 30 5d 3e 3d 61 6e 5b 31 5d 20 29 7b 0a 20 20 20  0]>=an[1] ){.   
15780 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20 20   void *pNew;.   
15790 20 69 6e 74 20 6e 65 77 53 69 7a 65 3b 0a 20 20   int newSize;.  
157a0 20 20 6e 65 77 53 69 7a 65 20 3d 20 61 6e 5b 31    newSize = an[1
157b0 5d 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a  ]*2 + initSize;.
157c0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
157d0 65 52 65 61 6c 6c 6f 63 28 2a 70 70 41 72 72 61  eRealloc(*ppArra
157e0 79 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e 74  y, newSize*szEnt
157f0 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ry);.    if( pNe
15800 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  w==0 ){.      re
15810 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
15820 20 20 20 61 6e 5b 31 5d 20 3d 20 6e 65 77 53 69     an[1] = newSi
15830 7a 65 3b 0a 20 20 20 20 2a 70 70 41 72 72 61 79  ze;.    *ppArray
15840 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = pNew;.  }.  p
15850 20 3d 20 2a 70 70 41 72 72 61 79 3b 0a 20 20 6d   = *ppArray;.  m
15860 65 6d 73 65 74 28 26 70 5b 61 6e 5b 30 5d 2a 73  emset(&p[an[0]*s
15870 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e  zEntry], 0, szEn
15880 74 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  try);.  return a
15890 6e 5b 30 5d 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n[0]++;.}../*.**
158a0 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
158b0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
158c0 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
158d0 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
158e0 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
158f0 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
15900 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
15910 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
15920 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
15930 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
15940 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20  stAppend(IdList 
15950 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
15960 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  Token){.  int i;
15970 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
15980 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
15990 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
159a0 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
159b0 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
159c0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
159d0 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
159e0 30 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 73 71 6c  0;.  }.  i = sql
159f0 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
15a00 65 28 28 76 6f 69 64 2a 2a 29 26 70 4c 69 73 74  e((void**)&pList
15a10 2d 3e 61 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  ->a, sizeof(pLis
15a20 74 2d 3e 61 5b 30 5d 29 2c 20 35 29 3b 0a 20 20  t->a[0]), 5);.  
15a30 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73  if( i<0 ){.    s
15a40 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
15a50 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  te(pList);.    r
15a60 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
15a70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
15a80 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
15a90 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b  omToken(pToken);
15aa0 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
15ab0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
15ac0 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76   an IdList..*/.v
15ad0 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73  oid sqlite3IdLis
15ae0 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a  tDelete(IdList *
15af0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
15b00 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
15b10 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
15b20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
15b30 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  d; i++){.    sql
15b40 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
15b50 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
15b60 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
15b70 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
15b80 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
15b90 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
15ba0 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20   index in pList 
15bb0 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  of the identifie
15bc0 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65  r named zId.  Re
15bd0 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f  turn -1.** if no
15be0 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  t found..*/.int 
15bf0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
15c00 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  ex(IdList *pList
15c10 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
15c20 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ame){.  int i;. 
15c30 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
15c40 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72  return -1;.  for
15c50 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
15c60 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Id; i++){.    if
15c70 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
15c80 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
15c90 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  me, zName)==0 ) 
15ca0 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
15cb0 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
15cc0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
15cd0 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
15ce0 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
15cf0 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
15d00 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65  SrcList if.** ne
15d10 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e  ed be.  A new en
15d20 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69  try is created i
15d30 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76  n the SrcList ev
15d40 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20  en if pToken is 
15d50 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  NULL..**.** A ne
15d60 77 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74  w SrcList is ret
15d70 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
15d80 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
15d90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61  ..**.** If pData
15da0 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  base is not null
15db0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
15dc0 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
15dd0 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74   optional.** dat
15de0 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69  abase name prefi
15df0 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20  x.  Like this:  
15e00 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22  "database.table"
15e10 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65  .  The pDatabase
15e20 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
15e30 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
15e40 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e   the pTable poin
15e50 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ts to the databa
15e60 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20  se name..** The 
15e70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d  SrcList.a[].zNam
15e80 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65  e field is fille
15e90 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
15ea0 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68   name which migh
15eb0 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70  t.** come from p
15ec0 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62  Table (if pDatab
15ed0 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20  ase is NULL) or 
15ee0 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20  from pDatabase. 
15ef0 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d   .** SrcList.a[]
15f00 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69  .zDatabase is fi
15f10 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
15f20 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d  tabase name from
15f30 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77   pTable,.** or w
15f40 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64  ith NULL if no d
15f50 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69  atabase is speci
15f60 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  fied..**.** In o
15f70 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63  ther words, if c
15f80 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  all like this:.*
15f90 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
15fa0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
15fb0 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20  d(A,B,0);.**.** 
15fc0 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c  Then B is a tabl
15fd0 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  e name and the d
15fe0 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
15ff0 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66  unspecified.  If
16000 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20   called.** like 
16010 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
16020 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
16030 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b  stAppend(A,B,C);
16040 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73  .**.** Then C is
16050 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
16060 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74  and B is the dat
16070 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53  abase name..*/.S
16080 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
16090 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63  rcListAppend(Src
160a0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
160b0 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65  en *pTable, Toke
160c0 6e 20 2a 70 44 61 74 61 62 61 73 65 29 7b 0a 20  n *pDatabase){. 
160d0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
160e0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
160f0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
16100 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
16110 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
16120 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  SrcList) );.    
16130 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
16140 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69  eturn 0;.    pLi
16150 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a  st->nAlloc = 1;.
16160 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
16170 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41  >nSrc>=pList->nA
16180 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c  lloc ){.    SrcL
16190 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70  ist *pNew;.    p
161a0 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20  List->nAlloc *= 
161b0 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  2;.    pNew = sq
161c0 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73  liteRealloc(pLis
161d0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
161e0 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29    sizeof(*pList)
161f0 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f   + (pList->nAllo
16200 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73  c-1)*sizeof(pLis
16210 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20  t->a[0]) );.    
16220 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
16230 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
16240 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
16250 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
16260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
16270 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  t = pNew;.  }.  
16280 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
16290 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a  a[pList->nSrc];.
162a0 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20    memset(pItem, 
162b0 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  0, sizeof(pList-
162c0 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70  >a[0]));.  if( p
162d0 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74  Database && pDat
162e0 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  abase->z==0 ){. 
162f0 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30     pDatabase = 0
16300 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74  ;.  }.  if( pDat
16310 61 62 61 73 65 20 26 26 20 70 54 61 62 6c 65 20  abase && pTable 
16320 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  ){.    Token *pT
16330 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b  emp = pDatabase;
16340 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
16350 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61   pTable;.    pTa
16360 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d  ble = pTemp;.  }
16370 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  .  pItem->zName 
16380 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
16390 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 29 3b 0a  mToken(pTable);.
163a0 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61    pItem->zDataba
163b0 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  se = sqlite3Name
163c0 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 61 74 61 62  FromToken(pDatab
163d0 61 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 69  ase);.  pItem->i
163e0 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70  Cursor = -1;.  p
163f0 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65  Item->isPopulate
16400 64 20 3d 20 30 3b 0a 20 20 70 4c 69 73 74 2d 3e  d = 0;.  pList->
16410 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  nSrc++;.  return
16420 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
16430 20 41 73 73 69 67 6e 20 63 75 72 73 6f 72 73 20   Assign cursors 
16440 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  to all tables in
16450 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f   a SrcList.*/.vo
16460 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
16470 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50  tAssignCursors(P
16480 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
16490 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
164a0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
164b0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
164c0 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70  Item;.  assert(p
164d0 4c 69 73 74 20 7c 7c 20 73 71 6c 69 74 65 33 4d  List || sqlite3M
164e0 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 3b  allocFailed() );
164f0 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
16500 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
16510 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
16520 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
16530 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
16540 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72   if( pItem->iCur
16550 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a  sor>=0 ) break;.
16560 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75        pItem->iCu
16570 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
16580 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Tab++;.      if(
16590 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
165a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
165b0 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
165c0 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
165d0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Item->pSelect->p
165e0 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Src);.      }.  
165f0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
16600 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74 6f   Add an alias to
16610 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74 69   the last identi
16620 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76 65  fier on the give
16630 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69 73  n identifier lis
16640 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
16650 65 33 53 72 63 4c 69 73 74 41 64 64 41 6c 69 61  e3SrcListAddAlia
16660 73 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  s(SrcList *pList
16670 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
16680 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26 26  {.  if( pList &&
16690 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29   pList->nSrc>0 )
166a0 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70  {.    pList->a[p
166b0 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 2e 7a 41  List->nSrc-1].zA
166c0 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61  lias = sqlite3Na
166d0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b  meFromToken(pTok
166e0 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  en);.  }.}../*.*
166f0 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
16700 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75  re SrcList inclu
16710 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62  ding all its sub
16720 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f  structure..*/.vo
16730 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
16740 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20  tDelete(SrcList 
16750 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
16760 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
16770 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
16780 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
16790 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70   return;.  for(p
167a0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
167b0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  =0; i<pList->nSr
167c0 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
167d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
167e0 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  (pItem->zDatabas
167f0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
16800 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  ee(pItem->zName)
16810 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
16820 28 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  (pItem->zAlias);
16830 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
16840 74 65 54 61 62 6c 65 28 30 2c 20 70 49 74 65 6d  teTable(0, pItem
16850 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c  ->pTab);.    sql
16860 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
16870 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29  (pItem->pSelect)
16880 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
16890 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70  rDelete(pItem->p
168a0 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  On);.    sqlite3
168b0 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 49 74  IdListDelete(pIt
168c0 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
168d0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
168e0 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  ist);.}../*.** B
168f0 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
16900 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
16910 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  e3BeginTransacti
16920 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
16930 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73  , int type){.  s
16940 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
16950 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a  be *v;.  int i;.
16960 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
16970 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
16980 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44  db)==0 || db->aD
16990 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
169a0 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
169b0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
169c0 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
169d0 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  ) ) return;.  if
169e0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
169f0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
16a00 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
16a10 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 20  BEGIN", 0, 0) ) 
16a20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
16a30 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
16a40 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20  arse);.  if( !v 
16a50 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
16a60 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45  type!=TK_DEFERRE
16a70 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  D ){.    for(i=0
16a80 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
16a90 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16aa0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
16ab0 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20  Transaction, i, 
16ac0 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53  (type==TK_EXCLUS
16ad0 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  IVE)+1);.    }. 
16ae0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
16af0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f  AddOp(v, OP_Auto
16b00 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d  Commit, 0, 0);.}
16b10 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
16b20 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
16b30 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d  void sqlite3Comm
16b40 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  itTransaction(Pa
16b50 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
16b60 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
16b70 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70  dbe *v;..  if( p
16b80 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
16b90 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
16ba0 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  | db->aDb[0].pBt
16bb0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
16bc0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
16bd0 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f   || sqlite3Mallo
16be0 63 46 61 69 6c 65 64 28 29 20 29 20 72 65 74 75  cFailed() ) retu
16bf0 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
16c00 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
16c10 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
16c20 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c  CTION, "COMMIT",
16c30 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
16c40 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
16c50 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
16c60 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
16c70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
16c80 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
16c90 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 1, 0);.  }.}..
16ca0 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
16cb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
16cc0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
16cd0 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
16ce0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
16cf0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
16d00 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
16d10 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
16d20 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
16d30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
16d40 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
16d50 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
16d60 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c  rr || sqlite3Mal
16d70 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20 72 65  locFailed() ) re
16d80 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
16d90 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
16da0 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
16db0 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41  SACTION, "ROLLBA
16dc0 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  CK", 0, 0) ) ret
16dd0 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  urn;..  v = sqli
16de0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
16df0 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
16e00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16e10 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  dOp(v, OP_AutoCo
16e20 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d  mmit, 1, 1);.  }
16e30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
16e40 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74  ure the TEMP dat
16e50 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e  abase is open an
16e60 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
16e70 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
16e80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
16e90 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79  rors.  Leave any
16ea0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
16eb0 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
16ec0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
16ed0 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
16ee0 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70  atabase(Parse *p
16ef0 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
16f00 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
16f10 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44  db;.  if( db->aD
16f20 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21  b[1].pBt==0 && !
16f30 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
16f40 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
16f50 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 63 74  sqlite3BtreeFact
16f60 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20 4d 41  ory(db, 0, 0, MA
16f70 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 61 44  X_PAGES, &db->aD
16f80 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69  b[1].pBt);.    i
16f90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16fa0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16fb0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
16fc0 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  , "unable to ope
16fd0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61  n a temporary da
16fe0 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20  tabase ".       
16ff0 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69   "file for stori
17000 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
17010 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61  les");.      pPa
17020 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
17030 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
17040 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
17050 66 6c 61 67 73 20 26 20 21 64 62 2d 3e 61 75 74  flags & !db->aut
17060 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  oCommit ){.     
17070 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
17080 65 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62 2d  eeBeginTrans(db-
17090 3e 61 44 62 5b 31 5d 2e 70 42 74 2c 20 31 29 3b  >aDb[1].pBt, 1);
170a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
170b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
170c0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
170d0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
170e0 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72 69  ble to get a wri
170f0 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20  te lock on ".   
17100 20 20 20 20 20 20 20 22 74 68 65 20 74 65 6d 70         "the temp
17110 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 66  orary database f
17120 69 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20 70  ile");.        p
17130 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a  Parse->rc = rc;.
17140 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
17150 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17160 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
17170 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
17180 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
17190 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
171a0 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68  ate VDBE code th
171b0 61 74 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74  at will verify t
171c0 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
171d0 20 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20   and start.** a 
171e0 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
171f0 20 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64   for all named d
17200 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a  atabase files..*
17210 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72  *.** It is impor
17220 74 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63  tant that all sc
17230 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20  hema cookies be 
17240 76 65 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c  verified and all
17250 0a 2a 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63  .** read transac
17260 74 69 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64  tions be started
17270 20 62 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67   before anything
17280 20 65 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e   else happens in
17290 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f  .** the VDBE pro
172a0 67 72 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20  gram.  But this 
172b0 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63  routine can be c
172c0 61 6c 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68  alled after much
172d0 20 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68   other.** code h
172e0 61 73 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65  as been generate
172f0 64 2e 20 20 53 6f 20 68 65 72 65 20 69 73 20 77  d.  So here is w
17300 68 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a  hat we do:.**.**
17310 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
17320 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
17330 63 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20  called, we code 
17340 61 6e 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a  an OP_Goto that.
17350 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20  ** will jump to 
17360 61 20 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20  a subroutine at 
17370 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
17380 72 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65  rogram.  Then we
17390 0a 2a 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79  .** record every
173a0 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 6e   database that n
173b0 65 65 64 73 20 69 74 73 20 73 63 68 65 6d 61 20  eeds its schema 
173c0 76 65 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a  verified in the.
173d0 2a 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  ** pParse->cooki
173e0 65 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61  eMask field.  La
173f0 74 65 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f  ter, after all o
17400 74 68 65 72 20 63 6f 64 65 20 68 61 73 20 62 65  ther code has be
17410 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c  en.** generated,
17420 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
17430 74 68 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f  that does the co
17440 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f  okie verificatio
17450 6e 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73  ns and.** starts
17460 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
17470 73 20 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20  s will be coded 
17480 61 6e 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20  and the OP_Goto 
17490 50 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c  P2 value.** will
174a0 20 62 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e   be made to poin
174b0 74 20 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75  t to that subrou
174c0 74 69 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72  tine.  The gener
174d0 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ation of the.** 
174e0 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74  cookie verificat
174f0 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63  ion subroutine c
17500 6f 64 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73  ode happens in s
17510 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
17520 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  ng()..**.** If i
17530 44 62 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 74  Db<0 then code t
17540 68 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20  he OP_Goto only 
17550 2d 20 64 6f 6e 27 74 20 73 65 74 20 66 6c 61 67  - don't set flag
17560 20 74 6f 20 76 65 72 69 66 79 20 74 68 65 0a 2a   to verify the.*
17570 2a 20 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20  * schema on any 
17580 64 61 74 61 62 61 73 65 73 2e 20 20 54 68 69 73  databases.  This
17590 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
175a0 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f  position the OP_
175b0 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e  Goto.** early in
175c0 20 74 68 65 20 63 6f 64 65 2c 20 62 65 66 6f 72   the code, befor
175d0 65 20 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79  e we know if any
175e0 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 73   database tables
175f0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a   will be used..*
17600 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
17610 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50  deVerifySchema(P
17620 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
17630 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65  t iDb){.  sqlite
17640 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
17650 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20  ;.  int mask;.. 
17660 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
17670 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
17680 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
17690 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20  ;  /* This only 
176a0 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 72 65  happens if there
176b0 20 77 61 73 20 61 20 70 72 69 6f 72 20 65 72 72   was a prior err
176c0 6f 72 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  or */.  db = pPa
176d0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
176e0 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
176f0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72  o==0 ){.    pPar
17700 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d  se->cookieGoto =
17710 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17720 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
17730 20 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28   0)+1;.  }.  if(
17740 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61   iDb>=0 ){.    a
17750 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e  ssert( iDb<db->n
17760 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Db );.    assert
17770 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ( db->aDb[iDb].p
17780 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20  Bt!=0 || iDb==1 
17790 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
177a0 44 62 3c 33 32 20 29 3b 0a 20 20 20 20 6d 61 73  Db<32 );.    mas
177b0 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 20 20  k = 1<<iDb;.    
177c0 69 66 28 20 28 70 50 61 72 73 65 2d 3e 63 6f 6f  if( (pParse->coo
177d0 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d  kieMask & mask)=
177e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  =0 ){.      pPar
177f0 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c  se->cookieMask |
17800 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 50  = mask;.      pP
17810 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75  arse->cookieValu
17820 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62  e[iDb] = db->aDb
17830 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73  [iDb].pSchema->s
17840 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20  chema_cookie;.  
17850 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
17860 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
17870 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
17880 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
17890 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
178a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
178b0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
178c0 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72  DBE code that pr
178d0 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67  epares for doing
178e0 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68   an operation th
178f0 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
17900 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ge the database.
17910 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
17920 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77  ine starts a new
17930 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
17940 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61  we are not alrea
17950 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74  dy within.** a t
17960 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
17970 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77  we are already w
17980 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
17990 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63  ion, then a chec
179a0 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74  kpoint.** is set
179b0 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65   if the setState
179c0 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69  ment parameter i
179d0 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b  s true.  A check
179e0 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  point should.** 
179f0 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61  be set for opera
17a00 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74  tions that might
17a10 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20   fail (due to a 
17a20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74  constraint) part
17a30 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74   of.** the way t
17a40 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68  hrough and which
17a50 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e   will need to un
17a60 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77  do some writes w
17a70 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
17a80 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  .** rollback the
17a90 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69   whole transacti
17aa0 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69  on.  For operati
17ab0 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f  ons where all co
17ac0 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e  nstraints.** can
17ad0 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f   be checked befo
17ae0 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61  re any changes a
17af0 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
17b00 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e  atabase, it is n
17b10 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72  ever.** necessar
17b20 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74  y to undo a writ
17b30 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70  e and the checkp
17b40 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  oint should not 
17b50 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  be set..**.** On
17b60 6c 79 20 64 61 74 61 62 61 73 65 20 69 44 62 20  ly database iDb 
17b70 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61 74  and the temp dat
17b80 61 62 61 73 65 20 61 72 65 20 6d 61 64 65 20 77  abase are made w
17b90 72 69 74 61 62 6c 65 20 62 79 20 74 68 69 73 20  ritable by this 
17ba0 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d  call..** If iDb=
17bb0 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69  =0, then the mai
17bc0 6e 20 61 6e 64 20 74 65 6d 70 20 64 61 74 61 62  n and temp datab
17bd0 61 73 65 73 20 61 72 65 20 6d 61 64 65 20 77 72  ases are made wr
17be0 69 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20  itable.   If.** 
17bf0 69 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79  iDb==1 then only
17c00 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
17c10 73 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61  se is made writa
17c20 62 6c 65 2e 20 20 49 66 20 69 44 62 3e 31 20 74  ble.  If iDb>1 t
17c30 68 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  hen the.** speci
17c40 66 69 65 64 20 61 75 78 69 6c 69 61 72 79 20 64  fied auxiliary d
17c50 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20  atabase and the 
17c60 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 61 72  temp database ar
17c70 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e  e made writable.
17c80 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17c90 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
17ca0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
17cb0 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d  e, int setStatem
17cc0 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  ent, int iDb){. 
17cd0 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
17ce0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
17cf0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
17d00 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
17d10 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
17d20 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
17d30 20 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d    pParse->writeM
17d40 61 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20  ask |= 1<<iDb;. 
17d50 20 69 66 28 20 73 65 74 53 74 61 74 65 6d 65 6e   if( setStatemen
17d60 74 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73  t && pParse->nes
17d70 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ted==0 ){.    sq
17d80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
17d90 2c 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 2c 20  , OP_Statement, 
17da0 69 44 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  iDb, 0);.  }.  i
17db0 66 28 20 28 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( (OMIT_TEMPDB 
17dc0 7c 7c 20 69 44 62 21 3d 31 29 20 26 26 20 70 50  || iDb!=1) && pP
17dd0 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d  arse->db->aDb[1]
17de0 2e 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 73  .pBt!=0 ){.    s
17df0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
17e00 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
17e10 2c 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20  , setStatement, 
17e20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
17e30 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
17e40 20 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65   pIndex uses the
17e50 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
17e60 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75  nce pColl.  Retu
17e70 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74  rn.** true if it
17e80 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20   does and false 
17e90 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
17ea0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
17eb0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
17ec0 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74  tatic int collat
17ed0 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63  ionMatch(const c
17ee0 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65  har *zColl, Inde
17ef0 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e  x *pIndex){.  in
17f00 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
17f10 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  i<pIndex->nColum
17f20 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  n; i++){.    con
17f30 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e  st char *z = pIn
17f40 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  dex->azColl[i];.
17f50 20 20 20 20 69 66 28 20 7a 3d 3d 7a 43 6f 6c 6c      if( z==zColl
17f60 20 7c 7c 20 28 7a 20 26 26 20 7a 43 6f 6c 6c 20   || (z && zColl 
17f70 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
17f80 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 29 20  ICmp(z, zColl)) 
17f90 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
17fa0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
17fb0 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
17fc0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75  f../*.** Recompu
17fd0 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
17fe0 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20  f pTab that use 
17ff0 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
18000 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a  quence pColl..**
18010 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65   If pColl==0 the
18020 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  n recompute all 
18030 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e  indices of pTab.
18040 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
18050 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
18060 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
18070 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a  dexTable(Parse *
18080 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
18090 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20  Tab, char const 
180a0 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78  *zColl){.  Index
180b0 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
180c0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
180d0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
180e0 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f  th pTab */..  fo
180f0 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70  r(pIndex=pTab->p
18100 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
18110 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e  Index=pIndex->pN
18120 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43  ext){.    if( zC
18130 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74  oll==0 || collat
18140 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20  ionMatch(zColl, 
18150 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20  pIndex) ){.     
18160 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
18170 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
18180 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
18190 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
181a0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
181b0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
181c0 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
181d0 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
181e0 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
181f0 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
18200 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
18210 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
18220 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61  all indices of a
18230 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c  ll tables in all
18240 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65   databases where
18250 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20   the.** indices 
18260 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
18270 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
18280 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  .  If pColl==0 t
18290 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a  hen recompute.**
182a0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65   all indices eve
182b0 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e  rywhere..*/.#ifn
182c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
182d0 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
182e0 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62  oid reindexDatab
182f0 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ases(Parse *pPar
18300 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  se, char const *
18310 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44  zColl){.  Db *pD
18320 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
18330 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
18340 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
18350 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
18360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18370 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
18380 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
18390 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
183a0 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
183b0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
183c0 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c  tion */.  HashEl
183d0 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20  em *k;          
183e0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
183f0 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73  ping over tables
18400 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62   in pDb */.  Tab
18410 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
18420 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
18430 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
18440 61 73 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44  ase */..  for(iD
18450 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62  b=0, pDb=db->aDb
18460 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
18470 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20  Db++, pDb++){.  
18480 20 20 69 66 28 20 70 44 62 3d 3d 30 20 29 20 63    if( pDb==0 ) c
18490 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72  ontinue;.    for
184a0 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (k=sqliteHashFir
184b0 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61  st(&pDb->pSchema
184c0 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20  ->tblHash);  k; 
184d0 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  k=sqliteHashNext
184e0 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62  (k)){.      pTab
184f0 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74   = (Table*)sqlit
18500 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20  eHashData(k);.  
18510 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65      reindexTable
18520 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a  (pParse, pTab, z
18530 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Coll);.    }.  }
18540 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
18550 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
18560 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63  or the REINDEX c
18570 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  ommand..**.**   
18580 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20       REINDEX    
18590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185a0 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20          -- 1.** 
185b0 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
185c0 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20  <collation>     
185d0 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a            -- 2.*
185e0 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
185f0 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
18600 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33  tablename>  -- 3
18610 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
18620 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  EX  ?<database>.
18630 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d  ?<indexname>  --
18640 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20   4.**.** Form 1 
18650 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63  causes all indic
18660 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68  es in all attach
18670 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20  ed databases to 
18680 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46  be rebuilt..** F
18690 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61  orm 2 rebuilds a
186a0 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
186b0 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  l databases that
186c0 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a   use the named.*
186d0 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  * collating func
186e0 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61  tion.  Forms 3 a
186f0 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65  nd 4 rebuild the
18700 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20   named index or 
18710 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61  all.** indices a
18720 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
18730 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a  he named table..
18740 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
18750 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76  E_OMIT_REINDEX.v
18760 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64  oid sqlite3Reind
18770 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
18780 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c  , Token *pName1,
18790 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b   Token *pName2){
187a0 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
187b0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
187c0 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
187d0 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64  ence to be reind
187e0 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  exed, or NULL */
187f0 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
18800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18810 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c  * Name of a tabl
18820 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e or index */.  
18830 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
18840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
18850 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
18860 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ase */.  Table *
18870 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
18880 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
18890 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
188a0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
188b0 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
188c0 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73   /* An index ass
188d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61  ociated with pTa
188e0 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  b */.  int iDb; 
188f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18900 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
18910 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
18920 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
18930 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
18940 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
18950 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
18960 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65   Token *pObjName
18970 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18980 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
18990 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65  e or index to be
189a0 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20   reindexed */.. 
189b0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
189c0 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
189d0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
189e0 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
189f0 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e   message.  ** an
18a00 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65  d code in pParse
18a10 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
18a20 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
18a30 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
18a40 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
18a50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
18a60 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31   }..  if( pName1
18a70 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 31 2d 3e 7a  ==0 || pName1->z
18a80 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64  ==0 ){.    reind
18a90 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72  exDatabases(pPar
18aa0 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  se, 0);.    retu
18ab0 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  rn;.  }else if( 
18ac0 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c 20 70 4e 61  pName2==0 || pNa
18ad0 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  me2->z==0 ){.   
18ae0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d   assert( pName1-
18af0 3e 7a 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  >z );.    pColl 
18b00 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
18b10 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
18b20 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 31 2d  , (char*)pName1-
18b30 3e 7a 2c 20 70 4e 61 6d 65 31 2d 3e 6e 2c 20 30  >z, pName1->n, 0
18b40 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
18b50 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
18b60 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 53 74  zColl = sqliteSt
18b70 72 4e 44 75 70 28 28 63 6f 6e 73 74 20 63 68 61  rNDup((const cha
18b80 72 20 2a 29 70 4e 61 6d 65 31 2d 3e 7a 2c 20 70  r *)pName1->z, p
18b90 4e 61 6d 65 31 2d 3e 6e 29 3b 0a 20 20 20 20 20  Name1->n);.     
18ba0 20 69 66 28 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20   if( zColl ){.  
18bb0 20 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74        reindexDat
18bc0 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a  abases(pParse, z
18bd0 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  Coll);.        s
18be0 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 6c 29  qliteFree(zColl)
18bf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18c00 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
18c10 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
18c20 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
18c30 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
18c40 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b  me2, &pObjName);
18c50 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72  .  if( iDb<0 ) r
18c60 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c  eturn;.  z = sql
18c70 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
18c80 6e 28 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 7a  n(pObjName);.  z
18c90 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
18ca0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20  ].zName;.  pTab 
18cb0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
18cc0 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a  le(db, z, zDb);.
18cd0 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
18ce0 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70    reindexTable(p
18cf0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b  Parse, pTab, 0);
18d00 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
18d10 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  z);.    return;.
18d20 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
18d30 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
18d40 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73  db, z, zDb);.  s
18d50 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
18d60 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
18d70 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
18d80 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
18d90 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
18da0 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
18db0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
18dc0 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  dex, -1);.    re
18dd0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
18de0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
18df0 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69  se, "unable to i
18e00 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65  dentify the obje
18e10 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ct to be reindex
18e20 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ed");.}.#endif..
18e30 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 64  /*.** Return a d
18e40 79 6e 61 6d 69 63 6c 79 20 61 6c 6c 6f 63 61 74  ynamicly allocat
18e50 65 64 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  ed KeyInfo struc
18e60 74 75 72 65 20 74 68 61 74 20 63 61 6e 20 62 65  ture that can be
18e70 20 75 73 65 64 0a 2a 2a 20 77 69 74 68 20 4f 50   used.** with OP
18e80 5f 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f  _OpenRead or OP_
18e90 4f 70 65 6e 57 72 69 74 65 20 74 6f 20 61 63 63  OpenWrite to acc
18ea0 65 73 73 20 64 61 74 61 62 61 73 65 20 69 6e 64  ess database ind
18eb0 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49  ex pIdx..**.** I
18ec0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20  f successful, a 
18ed0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
18ee0 65 77 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ew structure is 
18ef0 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69  returned. In thi
18f00 73 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 63 61  s case.** the ca
18f10 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
18f20 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 20  ble for calling 
18f30 73 71 6c 69 74 65 46 72 65 65 28 29 20 6f 6e 20  sqliteFree() on 
18f40 74 68 65 20 72 65 74 75 72 6e 65 64 20 0a 2a 2a  the returned .**
18f50 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 61 6e 20   pointer. If an 
18f60 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 6f 75  error occurs (ou
18f70 74 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 72 20 6d  t of memory or m
18f80 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e  issing collation
18f90 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 29 2c 20   .** sequence), 
18fa0 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
18fb0 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 20 6f   and the state o
18fc0 66 20 70 50 61 72 73 65 20 75 70 64 61 74 65 64  f pParse updated
18fd0 20 74 6f 20 72 65 66 6c 65 63 74 0a 2a 2a 20 74   to reflect.** t
18fe0 68 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65 79  he error..*/.Key
18ff0 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 49 6e 64  Info *sqlite3Ind
19000 65 78 4b 65 79 69 6e 66 6f 28 50 61 72 73 65 20  exKeyinfo(Parse 
19010 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
19020 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pIdx){.  int i;.
19030 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64    int nCol = pId
19040 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e  x->nColumn;.  in
19050 74 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65 6f  t nBytes = sizeo
19060 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 43  f(KeyInfo) + (nC
19070 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 43 6f 6c  ol-1)*sizeof(Col
19080 6c 53 65 71 2a 29 20 2b 20 6e 43 6f 6c 3b 0a 20  lSeq*) + nCol;. 
19090 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d   KeyInfo *pKey =
190a0 20 28 4b 65 79 49 6e 66 6f 20 2a 29 73 71 6c 69   (KeyInfo *)sqli
190b0 74 65 4d 61 6c 6c 6f 63 28 6e 42 79 74 65 73 29  teMalloc(nBytes)
190c0 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  ;..  if( pKey ){
190d0 0a 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74  .    pKey->aSort
190e0 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29 26 28  Order = (u8 *)&(
190f0 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c  pKey->aColl[nCol
19100 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
19110 26 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65  &pKey->aSortOrde
19120 72 5b 6e 43 6f 6c 5d 3d 3d 26 28 28 28 75 38 20  r[nCol]==&(((u8 
19130 2a 29 70 4b 65 79 29 5b 6e 42 79 74 65 73 5d 29  *)pKey)[nBytes])
19140 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
19150 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
19160 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c       char *zColl
19170 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
19180 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  i];.      assert
19190 28 20 7a 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20  ( zColl );.     
191a0 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20   pKey->aColl[i] 
191b0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  = sqlite3LocateC
191c0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
191d0 43 6f 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20 20 20  Coll, -1);.     
191e0 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65   pKey->aSortOrde
191f0 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f  r[i] = pIdx->aSo
19200 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20  rtOrder[i];.    
19210 7d 0a 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65  }.    pKey->nFie
19220 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 20 20 7d 0a 0a  ld = nCol;.  }..
19230 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
19240 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
19250 46 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20  Free(pKey);.    
19260 70 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pKey = 0;.  }.  
19270 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a     return pKey;.}.