/ Hex Artifact Content
Login

Artifact 15224e2fd348ad32b9044aaa5bdc912e4067da15:


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 32 20 32 30 30 36 2f 30 31 2f 31 38  1.382 2006/01/18
02f0: 20 31 36 3a 35 31 3a 33 35 20 64 61 6e 69 65 6c   16:51:35 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 23 69 66 20 30 0a 20 20  e..  */.#if 0.  
cca0: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
ccb0: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
ccc0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
ccd0: 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69  , "view %s is ci
cce0: 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64  rcularly defined
ccf0: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
cd00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
cd10: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73  .  }.#endif.  as
cd20: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43  sert( pTable->nC
cd30: 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ol>=0 );..  /* I
cd40: 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
cd50: 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e  r, it means we n
cd60: 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
cd70: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a  he table names..
cd80: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
cd90: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
cda0: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
cdb0: 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e  ect() will expan
cdc0: 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65  d any.  ** "*" e
cdd0: 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72  lements in the r
cde0: 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68  esults set of th
cdf0: 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20  e view and will 
ce00: 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20  assign cursors. 
ce10: 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65   ** to the eleme
ce20: 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  nts of the FROM 
ce30: 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20  clause.  But we 
ce40: 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73  do not want thes
ce50: 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74  e changes.  ** t
ce60: 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20  o be permanent. 
ce70: 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74   So the computat
ce80: 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61  ion is done on a
ce90: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
cea0: 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  ECT.  ** stateme
ceb0: 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
cec0: 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20  the view..  */. 
ced0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
cee0: 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53  >pSelect );.  pS
cef0: 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  el = sqlite3Sele
cf00: 63 74 44 75 70 28 70 54 61 62 6c 65 2d 3e 70 53  ctDup(pTable->pS
cf10: 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 70 53  elect);.  if( pS
cf20: 65 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50  el ){.    n = pP
cf30: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20  arse->nTab;.    
cf40: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
cf50: 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
cf60: 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b  se, pSel->pSrc);
cf70: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  .    pTable->nCo
cf80: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 70 53 65 6c  l = -1;.    pSel
cf90: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
cfa0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
cfb0: 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b  Parse, 0, pSel);
cfc0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  .    pParse->nTa
cfd0: 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70  b = n;.    if( p
cfe0: 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20  SelTab ){.      
cff0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
d000: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
d010: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
d020: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
d030: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
d040: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
d050: 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
d060: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
d070: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
d080: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
d090: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  e3DeleteTable(0,
d0a0: 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20   pSelTab);.     
d0b0: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
d0c0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e  ->flags |= DB_Un
d0d0: 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20 20 20  resetViews;.    
d0e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61  }else{.      pTa
d0f0: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  ble->nCol = 0;. 
d100: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
d110: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65   }.    sqlite3Se
d120: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 29  lectDelete(pSel)
d130: 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
d140: 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72   nErr++;.  }.  r
d150: 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a  eturn nErr;  .}.
d160: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d170: 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23  _OMIT_VIEW */..#
d180: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d190: 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c  IT_VIEW./*.** Cl
d1a0: 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
d1b0: 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20  ames from every 
d1c0: 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65  VIEW in database
d1d0: 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   idx..*/.static 
d1e0: 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52  void sqliteViewR
d1f0: 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20  esetAll(sqlite3 
d200: 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20  *db, int idx){. 
d210: 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20   HashElem *i;.  
d220: 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72  if( !DbHasProper
d230: 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
d240: 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72  nresetViews) ) r
d250: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73  eturn;.  for(i=s
d260: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
d270: 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63  db->aDb[idx].pSc
d280: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
d290: 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  i;i=sqliteHashNe
d2a0: 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c  xt(i)){.    Tabl
d2b0: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
d2c0: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
d2d0: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
d2e0: 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
d2f0: 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  teResetColumnNam
d300: 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  es(pTab);.    }.
d310: 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f    }.  DbClearPro
d320: 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
d330: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b  B_UnresetViews);
d340: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
d350: 65 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  e sqliteViewRese
d360: 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66  tAll(A,B).#endif
d370: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
d380: 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  VIEW */../*.** T
d390: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d3a0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44  called by the VD
d3b0: 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  BE to adjust the
d3c0: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
d3d0: 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69  .** used by SQLi
d3e0: 74 65 20 77 68 65 6e 20 74 68 65 20 62 74 72 65  te when the btre
d3f0: 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20  e layer moves a 
d400: 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e  table root page.
d410: 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67   The.** root-pag
d420: 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  e of a table or 
d430: 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61 73  index in databas
d440: 65 20 69 44 62 20 68 61 73 20 63 68 61 6e 67 65  e iDb has change
d450: 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20  d from iFrom.** 
d460: 74 6f 20 69 54 6f 2e 0a 2a 2f 0a 23 69 66 6e 64  to iTo..*/.#ifnd
d470: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
d480: 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73  UTOVACUUM.void s
d490: 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f  qlite3RootPageMo
d4a0: 76 65 64 28 44 62 20 2a 70 44 62 2c 20 69 6e 74  ved(Db *pDb, int
d4b0: 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29   iFrom, int iTo)
d4c0: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45  {.  HashElem *pE
d4d0: 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61  lem;.  Hash *pHa
d4e0: 73 68 3b 0a 0a 20 20 70 48 61 73 68 20 3d 20 26  sh;..  pHash = &
d4f0: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
d500: 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c  lHash;.  for(pEl
d510: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
d520: 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
d530: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
d540: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
d550: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
d560: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
d570: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
d580: 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pTab->tnum==iFr
d590: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  om ){.      pTab
d5a0: 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
d5b0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
d5c0: 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20  }.  }.  pHash = 
d5d0: 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69  &pDb->pSchema->i
d5e0: 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45  dxHash;.  for(pE
d5f0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
d600: 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
d610: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
d620: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
d630: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
d640: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
d650: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
d660: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pIdx->tnum==iF
d670: 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64  rom ){.      pId
d680: 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  x->tnum = iTo;. 
d690: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
d6a0: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
d6b0: 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  0);.}.#endif../*
d6c0: 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74  .** Write code t
d6d0: 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c  o erase the tabl
d6e0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
d6f0: 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74   iTable from dat
d700: 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c  abase iDb..** Al
d710: 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f  so write code to
d720: 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69   modify the sqli
d730: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
d740: 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  and internal sch
d750: 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74  ema.** if a root
d760: 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72  -page of another
d770: 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20   table is moved 
d780: 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79  by the btree-lay
d790: 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61  er whilst.** era
d7a0: 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69  sing iTable (thi
d7b0: 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
d7c0: 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
d7d0: 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a   database)..*/ .
d7e0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74  static void dest
d7f0: 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73  royRootPage(Pars
d800: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
d810: 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b  Table, int iDb){
d820: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
d830: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
d840: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  se);.  sqlite3Vd
d850: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
d860: 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 69  stroy, iTable, i
d870: 44 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Db);.#ifndef SQL
d880: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
d890: 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74  UUM.  /* OP_Dest
d8a0: 72 6f 79 20 70 75 73 68 65 73 20 61 6e 20 69 6e  roy pushes an in
d8b0: 74 65 67 65 72 20 6f 6e 74 6f 20 74 68 65 20 73  teger onto the s
d8c0: 74 61 63 6b 2e 20 49 66 20 74 68 69 73 20 69 6e  tack. If this in
d8d0: 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f  teger.  ** is no
d8e0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20  n-zero, then it 
d8f0: 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
d900: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61 62   number of a tab
d910: 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a  le moved to.  **
d920: 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c 65   location iTable
d930: 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
d940: 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74 68  code modifies th
d950: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
d960: 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65  table to.  ** re
d970: 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a  flect this..  **
d980: 0a 20 20 2a 2a 20 54 68 65 20 22 23 30 22 20 69  .  ** The "#0" i
d990: 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61 20 73  n the SQL is a s
d9a0: 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20  pecial constant 
d9b0: 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65  that means whate
d9c0: 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69  ver value.  ** i
d9d0: 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  s on the top of 
d9e0: 74 68 65 20 73 74 61 63 6b 2e 20 20 53 65 65 20  the stack.  See 
d9f0: 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 45  sqlite3RegisterE
da00: 78 70 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71  xpr()..  */.  sq
da10: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
da20: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22  (pParse, .     "
da30: 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54  UPDATE %Q.%s SET
da40: 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45   rootpage=%d WHE
da50: 52 45 20 23 30 20 41 4e 44 20 72 6f 6f 74 70 61  RE #0 AND rootpa
da60: 67 65 3d 23 30 22 2c 0a 20 20 20 20 20 70 50 61  ge=#0",.     pPa
da70: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
da80: 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
da90: 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54 61 62  TABLE(iDb), iTab
daa0: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  le);.#endif.}../
dab0: 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20  *.** Write VDBE 
dac0: 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61  code to erase ta
dad0: 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c  ble pTab and all
dae0: 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69   associated indi
daf0: 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20  ces on disk..** 
db00: 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74  Code to update t
db10: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
db20: 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65   tables and inte
db30: 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69  rnal schema defi
db40: 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61  nitions.** in ca
db50: 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62  se a root-page b
db60: 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74  elonging to anot
db70: 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
db80: 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20  ed by the btree 
db90: 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f  layer.** is also
dba0: 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e   added (this can
dbb0: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
dbc0: 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
dbd0: 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  base)..*/.static
dbe0: 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62   void destroyTab
dbf0: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
dc00: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  , Table *pTab){.
dc10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
dc20: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
dc30: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
dc40: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
dc50: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
dc60: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
dc70: 70 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74  pSchema);.  dest
dc80: 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
dc90: 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  se, pTab->tnum, 
dca0: 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78  iDb);.  for(pIdx
dcb0: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
dcc0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
dcd0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74  pNext){.    dest
dce0: 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
dcf0: 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  se, pIdx->tnum, 
dd00: 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  iDb);.  }.#else.
dd10: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
dd20: 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f  base may be auto
dd30: 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20  -vacuum capable 
dd40: 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  (if SQLITE_OMIT_
dd50: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20  AUTOVACUUM.  ** 
dd60: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c  is not defined),
dd70: 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f   then it is impo
dd80: 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50  rtant to call OP
dd90: 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a  _Destroy on the.
dda0: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69    ** table and i
ddb0: 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20  ndex root-pages 
ddc0: 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69  in order, starti
ddd0: 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65  ng with the nume
dde0: 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61  rically .  ** la
ddf0: 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
de00: 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61  number. This gua
de10: 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e  rantees that non
de20: 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61  e of the root-pa
de30: 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64  ges.  ** to be d
de40: 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f  estroyed is relo
de50: 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c  cated by an earl
de60: 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20  ier OP_Destroy. 
de70: 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a  i.e. if the.  **
de80: 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20   following were 
de90: 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  coded:.  **.  **
dea0: 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a   OP_Destroy 4 0.
deb0: 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50    ** ....  ** OP
dec0: 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a  _Destroy 5 0.  *
ded0: 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20  *.  ** and root 
dee0: 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20  page 5 happened 
def0: 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73  to be the larges
df00: 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
df10: 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64  er in the.  ** d
df20: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f  atabase, then ro
df30: 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20  ot page 5 would 
df40: 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65  be moved to page
df50: 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20   4 by the .  ** 
df60: 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22  "OP_Destroy 4 0"
df70: 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62   opcode. The sub
df80: 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74  sequent "OP_Dest
df90: 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68  roy 5 0" would h
dfa0: 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c  it.  ** a free-l
dfb0: 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  ist page..  */. 
dfc0: 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62   int iTab = pTab
dfd0: 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44  ->tnum;.  int iD
dfe0: 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20  estroyed = 0;.. 
dff0: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
e000: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
e010: 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d    int iLargest =
e020: 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65   0;..    if( iDe
e030: 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54  stroyed==0 || iT
e040: 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b  ab<iDestroyed ){
e050: 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20  .      iLargest 
e060: 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20  = iTab;.    }.  
e070: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
e080: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
e090: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
e0a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78  {.      int iIdx
e0b0: 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20   = pIdx->tnum;. 
e0c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
e0d0: 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
e0e0: 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
e0f0: 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79     if( (iDestroy
e100: 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69  ed==0 || (iIdx<i
e110: 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69  Destroyed)) && i
e120: 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a  Idx>iLargest ){.
e130: 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74          iLargest
e140: 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d   = iIdx;.      }
e150: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
e160: 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20  Largest==0 ){.  
e170: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
e180: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
e190: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
e1a0: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
e1b0: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
e1c0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 64 65  chema);.      de
e1d0: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
e1e0: 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20  arse, iLargest, 
e1f0: 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73  iDb);.      iDes
e200: 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73  troyed = iLarges
e210: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  t;.    }.  }.#en
e220: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  dif.}../*.** Thi
e230: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
e240: 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  led to do the wo
e250: 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42  rk of a DROP TAB
e260: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
e270: 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61   pName is the na
e280: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
e290: 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a  to be dropped..*
e2a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
e2b0: 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
e2c0: 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
e2d0: 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65  pName, int isVie
e2e0: 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20  w, int noErr){. 
e2f0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
e300: 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
e310: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
e320: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
e330: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
e340: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61  Err || sqlite3Ma
e350: 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a  llocFailed() ){.
e360: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
e370: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
e380: 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e  assert( pName->n
e390: 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62  Src==1 );.  pTab
e3a0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
e3b0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e  Table(pParse, pN
e3c0: 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
e3d0: 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
e3e0: 74 61 62 61 73 65 29 3b 0a 0a 20 20 69 66 28 20  tabase);..  if( 
e3f0: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69  pTab==0 ){.    i
e400: 66 28 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20  f( noErr ){.    
e410: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 43 6c    sqlite3ErrorCl
e420: 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
e430: 20 7d 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74   }.    goto exit
e440: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
e450: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
e460: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
e470: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
e480: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
e490: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
e4a0: 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  b );.#ifndef SQL
e4b0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
e4c0: 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
e4d0: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e  nt code;.    con
e4e0: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
e4f0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
e500: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
e510: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
e520: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
e530: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
e540: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
e550: 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
e560: 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20  b, 0, zDb)){.   
e570: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
e580: 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
e590: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
e5a0: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
e5b0: 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
e5c0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
e5d0: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
e5e0: 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
e5f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e600: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
e610: 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  OP_VIEW;.      }
e620: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e630: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
e640: 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a  DB && iDb==1 ){.
e650: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
e660: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
e670: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  TABLE;.      }el
e680: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
e690: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
e6a0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
e6b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
e6c0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
e6d0: 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d  rse, code, pTab-
e6e0: 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20  >zName, 0, zDb) 
e6f0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
e700: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
e710: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
e720: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
e730: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
e740: 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ETE, pTab->zName
e750: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
e760: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
e770: 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
e780: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
e790: 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c  pTab->readOnly |
e7a0: 7c 20 70 54 61 62 3d 3d 64 62 2d 3e 61 44 62 5b  | pTab==db->aDb[
e7b0: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 70 53  iDb].pSchema->pS
e7c0: 65 71 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  eqTab ){.    sql
e7d0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
e7e0: 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
e7f0: 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  ay not be droppe
e800: 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
e810: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
e820: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
e830: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e840: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45  OMIT_VIEW.  /* E
e850: 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45  nsure DROP TABLE
e860: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20   is not used on 
e870: 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50  a view, and DROP
e880: 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65   VIEW is not use
e890: 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c  d.  ** on a tabl
e8a0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  e..  */.  if( is
e8b0: 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
e8c0: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
e8d0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
e8e0: 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
e8f0: 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74  P TABLE to delet
e900: 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61  e table %s", pTa
e910: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
e920: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
e930: 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ble;.  }.  if( !
e940: 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
e950: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
e960: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e970: 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
e980: 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20   VIEW to delete 
e990: 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e  view %s", pTab->
e9a0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
e9b0: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
e9c0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
e9d0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
e9e0: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
e9f0: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  able from the ma
ea00: 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ster table.  ** 
ea10: 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
ea20: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
ea30: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
ea40: 28 20 76 20 29 7b 0a 20 20 20 20 54 72 69 67 67  ( v ){.    Trigg
ea50: 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20  er *pTrigger;.  
ea60: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
ea70: 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 73  >aDb[iDb];.    s
ea80: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
ea90: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
eaa0: 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20  , 0, iDb);..    
eab0: 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67  /* Drop all trig
eac0: 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  gers associated 
ead0: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62  with the table b
eae0: 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f  eing dropped. Co
eaf0: 64 65 0a 20 20 20 20 2a 2a 20 69 73 20 67 65 6e  de.    ** is gen
eb00: 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65  erated to remove
eb10: 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71   entries from sq
eb20: 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f  lite_master and/
eb30: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
eb40: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20  _temp_master if 
eb50: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
eb60: 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20  .    pTrigger = 
eb70: 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a  pTab->pTrigger;.
eb80: 20 20 20 20 77 68 69 6c 65 28 20 70 54 72 69 67      while( pTrig
eb90: 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ger ){.      ass
eba0: 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70  ert( pTrigger->p
ebb0: 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
ebc0: 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20  chema || .      
ebd0: 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53      pTrigger->pS
ebe0: 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
ebf0: 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ].pSchema );.   
ec00: 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72     sqlite3DropTr
ec10: 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c  iggerPtr(pParse,
ec20: 20 70 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20   pTrigger, 1);. 
ec30: 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20       pTrigger = 
ec40: 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b  pTrigger->pNext;
ec50: 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
ec60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
ec70: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a  INCREMENT.    /*
ec80: 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72   Remove any entr
ec90: 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ies of the sqlit
eca0: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
ecb0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
ecc0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  .    ** the tabl
ecd0: 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
ece0: 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
ecf0: 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20 69  fore the table i
ed00: 73 20 64 72 6f 70 70 65 64 0a 20 20 20 20 2a 2a  s dropped.    **
ed10: 20 61 74 20 74 68 65 20 62 74 72 65 65 20 6c 65   at the btree le
ed20: 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65  vel, in case the
ed30: 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
ed40: 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a   table needs to.
ed50: 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61      ** move as a
ed60: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64   result of the d
ed70: 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20  rop (can happen 
ed80: 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
ed90: 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ode)..    */.   
eda0: 20 69 66 28 20 70 54 61 62 2d 3e 61 75 74 6f 49   if( pTab->autoI
edb0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nc ){.      sqli
edc0: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
edd0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
ede0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e 73  DELETE FROM %s.s
edf0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57  qlite_sequence W
ee00: 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20  HERE name=%Q",. 
ee10: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d         pDb->zNam
ee20: 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20  e, pTab->zName. 
ee30: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65       );.    }.#e
ee40: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f  ndif..    /* Dro
ee50: 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53  p all SQLITE_MAS
ee60: 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e  TER table and in
ee70: 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61 74  dex entries that
ee80: 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20   refer to the.  
ee90: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20    ** table. The 
eea0: 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f  program name loo
eeb0: 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d  ps through the m
eec0: 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
eed0: 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20 65  deletes.    ** e
eee0: 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72 65  very row that re
eef0: 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20  fers to a table 
ef00: 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
ef10: 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e   as the one bein
ef20: 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70 65 64  g.    ** dropped
ef30: 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20 68  . Triggers are h
ef40: 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74 65 6c  andled seperatel
ef50: 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69 67  y because a trig
ef60: 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20 20 2a  ger can be.    *
ef70: 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  * created in the
ef80: 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74   temp database t
ef90: 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
efa0: 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  table in another
efb0: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
efc0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
efd0: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
efe0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
eff0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
f000: 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61  .%s WHERE tbl_na
f010: 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d  me=%Q and type!=
f020: 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20  'trigger'",.    
f030: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20      pDb->zName, 
f040: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
f050: 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ), pTab->zName);
f060: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
f070: 20 29 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f   ){.      destro
f080: 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  yTable(pParse, p
f090: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Tab);.    }..   
f0a0: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74   /* Remove the t
f0b0: 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20  able entry from 
f0c0: 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61  SQLite's interna
f0d0: 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64  l schema and mod
f0e0: 69 66 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  ify.    ** the s
f0f0: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20  chema cookie..  
f100: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
f110: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72  VdbeOp3(v, OP_Dr
f120: 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c  opTable, iDb, 0,
f130: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
f140: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
f150: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c  ngeCookie(db, v,
f160: 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c   iDb);.  }.  sql
f170: 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
f180: 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f  db, iDb);..exit_
f190: 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71  drop_table:.  sq
f1a0: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
f1b0: 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  te(pName);.}../*
f1c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f1d0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72   is called to cr
f1e0: 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69  eate a new forei
f1f0: 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61  gn key on the ta
f200: 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  ble.** currently
f210: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
f220: 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64  ion.  pFromCol d
f230: 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20  etermines which 
f240: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
f250: 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
f260: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72  point to the for
f270: 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46  eign key.  If pF
f280: 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a  romCol==0 then.*
f290: 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65  * connect the ke
f2a0: 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f  y to the last co
f2b0: 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20  lumn inserted.  
f2c0: 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20  pTo is the name 
f2d0: 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  of.** the table 
f2e0: 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54  referred to.  pT
f2f0: 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f  oCol is a list o
f300: 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
f310: 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62  other.** pTo tab
f320: 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65  le that the fore
f330: 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74  ign key points t
f340: 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69  o.  flags contai
f350: 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  ns all.** inform
f360: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
f370: 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
f380: 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73  ion algorithms s
f390: 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74  pecified.** in t
f3a0: 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e  he ON DELETE, ON
f3b0: 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49   UPDATE and ON I
f3c0: 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a  NSERT clauses..*
f3d0: 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72  *.** An FKey str
f3e0: 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
f3f0: 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  d and added to t
f400: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
f410: 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73  ly.** under cons
f420: 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  truction in the 
f430: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
f440: 65 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65  e field.  The ne
f450: 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74  w FKey.** is not
f460: 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d   linked into db-
f470: 3e 61 46 4b 65 79 20 61 74 20 74 68 69 73 20 70  >aFKey at this p
f480: 6f 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73  oint - that does
f490: 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75   not happen.** u
f4a0: 6e 74 69 6c 20 73 71 6c 69 74 65 33 45 6e 64 54  ntil sqlite3EndT
f4b0: 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  able()..**.** Th
f4c0: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  e foreign key is
f4d0: 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41   set for IMMEDIA
f4e0: 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  TE processing.  
f4f0: 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  A subsequent cal
f500: 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44  l.** to sqlite3D
f510: 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29  eferForeignKey()
f520: 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
f530: 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a  is to DEFERRED..
f540: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
f550: 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28  reateForeignKey(
f560: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
f570: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
f580: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
f590: 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43  ExprList *pFromC
f5a0: 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ol,  /* Columns 
f5b0: 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68  in this table th
f5c0: 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65  at point to othe
f5d0: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b  r table */.  Tok
f5e0: 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20  en *pTo,        
f5f0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
f600: 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
f610: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43    ExprList *pToC
f620: 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol,    /* Column
f630: 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74  s in the other t
f640: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  able */.  int fl
f650: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
f660: 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
f670: 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
f680: 2e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  . */.){.#ifndef 
f690: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
f6a0: 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a  IGN_KEY.  FKey *
f6b0: 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61 62  pFKey = 0;.  Tab
f6c0: 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e  le *p = pParse->
f6d0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74  pNewTable;.  int
f6e0: 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b   nByte;.  int i;
f6f0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63  .  int nCol;.  c
f700: 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72  har *z;..  asser
f710: 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69  t( pTo!=0 );.  i
f720: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
f730: 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 66  e->nErr ) goto f
f740: 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72  k_end;.  if( pFr
f750: 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
f760: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43  int iCol = p->nC
f770: 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43  ol-1;.    if( iC
f780: 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65  ol<0 ) goto fk_e
f790: 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43  nd;.    if( pToC
f7a0: 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45  ol && pToCol->nE
f7b0: 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
f7c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f7d0: 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e  pParse, "foreign
f7e0: 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20   key on %s".    
f7f0: 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65       " should re
f800: 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65  ference only one
f810: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
f820: 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70   %T",.         p
f830: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
f840: 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20  me, pTo);.      
f850: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
f860: 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b   }.    nCol = 1;
f870: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f  .  }else if( pTo
f880: 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
f890: 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e  Expr!=pFromCol->
f8a0: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
f8b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
f8c0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75  rse,.        "nu
f8d0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
f8e0: 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
f8f0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
f900: 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20  e number of ".  
f910: 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69        "columns i
f920: 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  n the referenced
f930: 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f   table");.    go
f940: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c  to fk_end;.  }el
f950: 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70  se{.    nCol = p
f960: 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a  FromCol->nExpr;.
f970: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69    }.  nByte = si
f980: 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e  zeof(*pFKey) + n
f990: 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79  Col*sizeof(pFKey
f9a0: 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f  ->aCol[0]) + pTo
f9b0: 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70  ->n + 1;.  if( p
f9c0: 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
f9d0: 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e  (i=0; i<pToCol->
f9e0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
f9f0: 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c     nByte += strl
fa00: 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  en(pToCol->a[i].
fa10: 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  zName) + 1;.    
fa20: 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20  }.  }.  pFKey = 
fa30: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42  sqliteMalloc( nB
fa40: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b  yte );.  if( pFK
fa50: 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b 5f  ey==0 ) goto fk_
fa60: 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 46  end;.  pFKey->pF
fa70: 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79  rom = p;.  pFKey
fa80: 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d  ->pNextFrom = p-
fa90: 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63  >pFKey;.  z = (c
faa0: 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a  har*)&pFKey[1];.
fab0: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20    pFKey->aCol = 
fac0: 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a  (struct sColMap*
fad0: 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f  )z;.  z += sizeo
fae0: 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70  f(struct sColMap
faf0: 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d  )*nCol;.  pFKey-
fb00: 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63  >zTo = z;.  memc
fb10: 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54  py(z, pTo->z, pT
fb20: 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e  o->n);.  z[pTo->
fb30: 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70  n] = 0;.  z += p
fb40: 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79  To->n+1;.  pFKey
fb50: 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20  ->pNextTo = 0;. 
fb60: 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e   pFKey->nCol = n
fb70: 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  Col;.  if( pFrom
fb80: 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  Col==0 ){.    pF
fb90: 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72  Key->aCol[0].iFr
fba0: 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  om = p->nCol-1;.
fbb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
fbc0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
fbd0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  +){.      int j;
fbe0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
fbf0: 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  j<p->nCol; j++){
fc00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
fc10: 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61  ite3StrICmp(p->a
fc20: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46  Col[j].zName, pF
fc30: 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
fc40: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
fc50: 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
fc60: 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20  i].iFrom = j;.  
fc70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
fc80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
fc90: 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d  .      if( j>=p-
fca0: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
fcb0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
fcc0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
fcd0: 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c      "unknown col
fce0: 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f  umn \"%s\" in fo
fcf0: 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
fd00: 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  tion", .        
fd10: 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d    pFromCol->a[i]
fd20: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
fd30: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
fd40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
fd50: 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
fd60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
fd70: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
fd80: 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28   int n = strlen(
fd90: 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
fda0: 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79  me);.      pFKey
fdb0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d  ->aCol[i].zCol =
fdc0: 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   z;.      memcpy
fdd0: 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  (z, pToCol->a[i]
fde0: 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  .zName, n);.    
fdf0: 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20    z[n] = 0;.    
fe00: 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20    z += n+1;.    
fe10: 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69  }.  }.  pFKey->i
fe20: 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20  sDeferred = 0;. 
fe30: 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f   pFKey->deleteCo
fe40: 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66  nf = flags & 0xf
fe50: 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61  f;.  pFKey->upda
fe60: 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20  teConf = (flags 
fe70: 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20  >> 8 ) & 0xff;. 
fe80: 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f   pFKey->insertCo
fe90: 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31  nf = (flags >> 1
fea0: 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f  6 ) & 0xff;..  /
feb0: 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69  * Link the forei
fec0: 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61  gn key to the ta
fed0: 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20  ble as the last 
fee0: 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  step..  */.  p->
fef0: 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20  pFKey = pFKey;. 
ff00: 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f   pFKey = 0;..fk_
ff10: 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65  end:.  sqliteFre
ff20: 65 28 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66  e(pFKey);.#endif
ff30: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
ff40: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
ff50: 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74  _KEY) */.  sqlit
ff60: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
ff70: 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71  (pFromCol);.  sq
ff80: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
ff90: 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a  ete(pToCol);.}..
ffa0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
ffb0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
ffc0: 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49  n an INITIALLY I
ffd0: 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54  MMEDIATE or INIT
ffe0: 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a  IALLY DEFERRED.*
fff0: 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e  * clause is seen
10000 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f   as part of a fo
10010 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
10020 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66  tion.  The isDef
10030 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74  erred.** paramet
10040 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54  er is 1 for INIT
10050 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61  IALLY DEFERRED a
10060 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c  nd 0 for INITIAL
10070 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a  LY IMMEDIATE..**
10080 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   The behavior of
10090 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
100a0 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69  ly created forei
100b0 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74  gn key is adjust
100c0 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c  ed.** accordingl
100d0 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
100e0 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
100f0 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
10100 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29   int isDeferred)
10110 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
10120 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
10130 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  Y.  Table *pTab;
10140 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a  .  FKey *pFKey;.
10150 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50    if( (pTab = pP
10160 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
10170 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20  ==0 || (pFKey = 
10180 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20  pTab->pFKey)==0 
10190 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65  ) return;.  pFKe
101a0 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
101b0 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64  isDeferred;.#end
101c0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  if.}../*.** Gene
101d0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
101e0 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65  ill erase and re
101f0 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78  fill index *pIdx
10200 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73  .  This is.** us
10210 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
10220 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64   a newly created
10230 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63   index or to rec
10240 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f  ompute the.** co
10250 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65  ntent of an inde
10260 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f  x in response to
10270 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61   a REINDEX comma
10280 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d  nd..**.** if mem
10290 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20  RootPage is not 
102a0 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61  negative, it mea
102b0 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ns that the inde
102c0 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72  x is newly.** cr
102d0 65 61 74 65 64 2e 20 20 54 68 65 20 6d 65 6d 6f  eated.  The memo
102e0 72 79 20 63 65 6c 6c 20 73 70 65 63 69 66 69 65  ry cell specifie
102f0 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65  d by memRootPage
10300 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a   contains the.**
10310 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
10320 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  r of the index. 
10330 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   If memRootPage 
10340 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
10350 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61  n.** the index a
10360 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 6e  lready exists an
10370 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65  d must be cleare
10380 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72  d before being r
10390 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74  efilled and.** t
103a0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
103b0 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
103c0 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70   is taken from p
103d0 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a  Index->tnum..*/.
103e0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
103f0 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50  te3RefillIndex(P
10400 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
10410 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74  dex *pIndex, int
10420 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20   memRootPage){. 
10430 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
10440 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20  Index->pTable;  
10450 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68 61  /* The table tha
10460 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a  t is indexed */.
10470 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61    int iTab = pPa
10480 72 73 65 2d 3e 6e 54 61 62 3b 20 20 20 20 20 20  rse->nTab;      
10490 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72   /* Btree cursor
104a0 20 75 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a   used for pTab *
104b0 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70  /.  int iIdx = p
104c0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 31 3b 20 20  Parse->nTab+1;  
104d0 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73     /* Btree curs
104e0 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64  or used for pInd
104f0 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ex */.  int addr
10500 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
10510 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
10520 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70  s of top of loop
10530 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20   */.  int tnum; 
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10550 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
10560 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e of index */.  
10570 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
10580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10590 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
105a0 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61  into this virtua
105b0 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b  l machine */.  K
105c0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20  eyInfo *pKey;   
105d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
105e0 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64   KeyInfo for ind
105f0 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20  ex */.  int iDb 
10600 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
10610 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
10620 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  b, pIndex->pSche
10630 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ma);..#ifndef SQ
10640 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
10650 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71  IZATION.  if( sq
10660 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
10670 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45  Parse, SQLITE_RE
10680 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a  INDEX, pIndex->z
10690 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 70  Name, 0,.      p
106a0 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
106b0 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20  Db].zName ) ){. 
106c0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
106d0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75  endif..  /* Requ
106e0 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
106f0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f   on the table to
10700 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70   perform this op
10710 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  eration */.  sql
10720 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
10730 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
10740 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e  >tnum, 1, pTab->
10750 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73  zName);..  v = s
10760 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
10770 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
10780 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
10790 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30  ( memRootPage>=0
107a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
107b0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
107c0 65 6d 4c 6f 61 64 2c 20 6d 65 6d 52 6f 6f 74 50  emLoad, memRootP
107d0 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 74 6e 75  age, 0);.    tnu
107e0 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  m = 0;.  }else{.
107f0 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65      tnum = pInde
10800 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 73 71 6c  x->tnum;.    sql
10810 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10820 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c   OP_Clear, tnum,
10830 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c   iDb);.  }.  sql
10840 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10850 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62   OP_Integer, iDb
10860 2c 20 30 29 3b 0a 20 20 70 4b 65 79 20 3d 20 73  , 0);.  pKey = s
10870 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
10880 66 6f 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  fo(pParse, pInde
10890 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  x);.  sqlite3Vdb
108a0 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  eOp3(v, OP_OpenW
108b0 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d  rite, iIdx, tnum
108c0 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20  , (char *)pKey, 
108d0 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
108e0 46 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 70  FF);.  sqlite3Op
108f0 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
10900 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c  iTab, iDb, pTab,
10910 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
10920 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
10930 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10940 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29  Rewind, iTab, 0)
10950 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72  ;.  sqlite3Gener
10960 61 74 65 49 6e 64 65 78 4b 65 79 28 76 2c 20 70  ateIndexKey(v, p
10970 49 6e 64 65 78 2c 20 69 54 61 62 29 3b 0a 20 20  Index, iTab);.  
10980 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  if( pIndex->onEr
10990 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a  ror!=OE_None ){.
109a0 20 20 20 20 69 6e 74 20 63 75 72 61 64 64 72 20      int curaddr 
109b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
109c0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
109d0 20 69 6e 74 20 61 64 64 72 32 20 3d 20 63 75 72   int addr2 = cur
109e0 61 64 64 72 2b 34 3b 0a 20 20 20 20 73 71 6c 69  addr+4;.    sqli
109f0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
10a00 76 2c 20 63 75 72 61 64 64 72 2d 31 2c 20 61 64  v, curaddr-1, ad
10a10 64 72 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr2);.    sqlite
10a20 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10a30 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 30 29  _Rowid, iTab, 0)
10a40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10a50 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64  eAddOp(v, OP_Add
10a60 49 6d 6d 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Imm, 1, 0);.    
10a70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10a80 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71 75 65 2c  (v, OP_IsUnique,
10a90 20 69 49 64 78 2c 20 61 64 64 72 32 29 3b 0a 20   iIdx, addr2);. 
10aa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
10ab0 33 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51  3(v, OP_Halt, SQ
10ac0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
10ad0 20 4f 45 5f 41 62 6f 72 74 2c 0a 20 20 20 20 20   OE_Abort,.     
10ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
10af0 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20  indexed columns 
10b00 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c  are not unique",
10b10 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
10b20 20 61 73 73 65 72 74 28 20 61 64 64 72 32 3d 3d   assert( addr2==
10b30 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
10b40 6e 74 41 64 64 72 28 76 29 20 29 3b 0a 20 20 7d  ntAddr(v) );.  }
10b50 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
10b60 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  dOp(v, OP_IdxIns
10b70 65 72 74 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20  ert, iIdx, 0);. 
10b80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10b90 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  p(v, OP_Next, iT
10ba0 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20 20  ab, addr1+1);.  
10bb0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
10bc0 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
10bd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10be0 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  p(v, OP_Close, i
10bf0 54 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  Tab, 0);.  sqlit
10c00 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10c10 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30  P_Close, iIdx, 0
10c20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
10c30 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66  te a new index f
10c40 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e  or an SQL table.
10c50 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20    pName1.pName2 
10c60 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
10c70 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64  he index .** and
10c80 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65   pTblList is the
10c90 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
10ca0 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
10cb0 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20   indexed.  Both 
10cc0 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c  will .** be NULL
10cd0 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b   for a primary k
10ce0 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74  ey or an index t
10cf0 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74  hat is created t
10d00 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55  o satisfy a.** U
10d10 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
10d20 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64  .  If pTable and
10d30 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c   pIndex are NULL
10d40 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  , use pParse->pN
10d50 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68  ewTable.** as th
10d60 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
10d70 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e  dexed.  pParse->
10d80 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74  pNewTable is a t
10d90 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  able that is.** 
10da0 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
10db0 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61  constructed by a
10dc0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
10dd0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70  atement..**.** p
10de0 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
10df0 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
10e00 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20  indexed.  pList 
10e10 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
10e20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69  this.** is a pri
10e30 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71  mary key or uniq
10e40 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  ue-constraint on
10e50 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
10e60 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a   column added.**
10e70 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
10e80 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
10e90 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f  nstruction.  .*/
10ea0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
10eb0 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ateIndex(.  Pars
10ec0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
10ed0 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * All informatio
10ee0 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72  n about this par
10ef0 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
10f00 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69  Name1,     /* Fi
10f10 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65  rst part of inde
10f20 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
10f30 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
10f40 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53  pName2,     /* S
10f50 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e  econd part of in
10f60 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
10f70 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69   NULL */.  SrcLi
10f80 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a  st *pTblName, /*
10f90 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e   Table to index.
10fa0 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   Use pParse->pNe
10fb0 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20  wTable if 0 */. 
10fc0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
10fd0 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66  ,   /* A list of
10fe0 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
10ff0 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
11000 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f  onError,       /
11010 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49  * OE_Abort, OE_I
11020 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63  gnore, OE_Replac
11030 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f  e, or OE_None */
11040 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
11050 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
11060 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
11070 65 67 69 6e 73 20 61 20 43 52 45 41 54 45 20 54  egins a CREATE T
11080 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  ABLE statement *
11090 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  /.  Token *pEnd,
110a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29         /* The ")
110b0 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68  " that closes th
110c0 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  e CREATE INDEX s
110d0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
110e0 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20  t sortOrder,    
110f0 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f   /* Sort order o
11100 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68  f primary key wh
11110 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a  en pList==NULL *
11120 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69  /.  int ifNotExi
11130 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65  st     /* Omit e
11140 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c  rror if index al
11150 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
11160 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
11170 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62   = 0;     /* Tab
11180 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
11190 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
111a0 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  dex = 0;   /* Th
111b0 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72  e index to be cr
111c0 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  eated */.  char 
111d0 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  *zName = 0;     
111e0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
111f0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  ndex */.  int nN
11200 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
11210 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
11220 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20  acters in zName 
11230 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  */.  int i, j;. 
11240 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20   Token nullId;  
11250 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f        /* Fake to
11260 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79  ken for an empty
11270 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62   ID list */.  Db
11280 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 20  Fixer sFix;     
11290 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e     /* For assign
112a0 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d  ing database nam
112b0 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a  es to pTable */.
112c0 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d    int sortOrderM
112d0 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68  ask;   /* 1 to h
112e0 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64  onor DESC in ind
112f0 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65  ex.  0 to ignore
11300 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  . */.  sqlite3 *
11310 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
11320 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20  .  Db *pDb;     
11330 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
11340 70 65 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f  pecific table co
11350 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64  ntaining the ind
11360 65 78 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f  exed database */
11370 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
11380 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
11390 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
113a0 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77   that is being w
113b0 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ritten */.  Toke
113c0 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20  n *pName = 0;   
113d0 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
113e0 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
113f0 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20  x to create */. 
11400 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
11410 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d  _item *pListItem
11420 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67  ; /* For looping
11430 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20   over pList */. 
11440 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74   int nCol;.  int
11450 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 63   nExtra = 0;.  c
11460 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 0a 20 20  har *zExtra;..  
11470 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
11480 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f   || sqlite3Mallo
11490 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20  cFailed() ){.   
114a0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
114b0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
114c0 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
114d0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
114e0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52  o be indexed.  R
114f0 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e  eturn early if n
11500 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
11510 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
11520 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20   ){..    /* Use 
11530 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64  the two-part ind
11540 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  ex name to deter
11550 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73  mine the databas
11560 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61  e .    ** to sea
11570 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c  rch for the tabl
11580 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62  e. 'Fix' the tab
11590 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20  le name to this 
115a0 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  db.    ** before
115b0 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20   looking up the 
115c0 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
115d0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
115e0 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20   && pName2 );.  
115f0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
11600 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
11610 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
11620 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20  2, &pName);.    
11630 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f  if( iDb<0 ) goto
11640 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
11650 65 78 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ex;..#ifndef SQL
11660 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a  ITE_OMIT_TEMPDB.
11670 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e      /* If the in
11680 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71  dex name was unq
11690 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20  ualified, check 
116a0 69 66 20 74 68 65 20 74 68 65 20 74 61 62 6c 65  if the the table
116b0 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d  .    ** is a tem
116c0 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20  p table. If so, 
116d0 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
116e0 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20   to 1..    */.  
116f0 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
11700 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50  SrcListLookup(pP
11710 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b  arse, pTblName);
11720 0a 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 20  .    if( pName2 
11730 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20  && pName2->n==0 
11740 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d  && pTab && pTab-
11750 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
11760 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
11770 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20        iDb = 1;. 
11780 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
11790 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 49   if( sqlite3FixI
117a0 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73  nit(&sFix, pPars
117b0 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c  e, iDb, "index",
117c0 20 70 4e 61 6d 65 29 20 26 26 0a 20 20 20 20 20   pName) &&.     
117d0 20 20 20 73 71 6c 69 74 65 33 46 69 78 53 72 63     sqlite3FixSrc
117e0 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c  List(&sFix, pTbl
117f0 4e 61 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20 20  Name).    ){.   
11800 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68     /* Because th
11810 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75  e parser constru
11820 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f  cts pTblName fro
11830 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74  m a single ident
11840 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20  ifier,.      ** 
11850 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
11860 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c  t can never fail
11870 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
11880 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(0);.    }.    
11890 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
118a0 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
118b0 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d  , pTblName->a[0]
118c0 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  .zName, .       
118d0 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e   pTblName->a[0].
118e0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
118f0 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f  if( !pTab ) goto
11900 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
11910 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
11920 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
11930 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
11940 65 6d 61 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ema );.  }else{.
11950 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
11960 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62  e==0 );.    pTab
11970 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
11980 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70  able;.    if( !p
11990 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Tab ) goto exit_
119a0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
119b0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
119c0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
119d0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
119e0 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62  .  }.  pDb = &db
119f0 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 69  ->aDb[iDb];..  i
11a00 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50  f( pTab==0 || pP
11a10 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
11a20 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
11a30 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  dex;.  if( pTab-
11a40 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
11a50 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11a60 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
11a70 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  %s may not be in
11a80 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  dexed", pTab->zN
11a90 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
11aa0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
11ab0 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
11ac0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
11ad0 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
11ae0 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
11af0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
11b00 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74  , "views may not
11b10 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
11b20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
11b30 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
11b40 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  endif..  /*.  **
11b50 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f   Find the name o
11b60 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61  f the index.  Ma
11b70 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
11b80 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f   not already ano
11b90 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ther.  ** index 
11ba0 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  or table with th
11bb0 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20  e same name.  . 
11bc0 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69   **.  ** Excepti
11bd0 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72  on:  If we are r
11be0 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73  eading the names
11bf0 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e   of permanent in
11c00 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20  dices from the. 
11c10 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   ** sqlite_maste
11c20 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65  r table (because
11c30 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
11c40 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20  ess changed the 
11c50 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a  schema) and.  **
11c60 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65   one of the inde
11c70 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73  x names collides
11c80 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f   with the name o
11c90 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  f a temporary ta
11ca0 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65  ble or.  ** inde
11cb0 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  x, then we will 
11cc0 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63  continue to proc
11cd0 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a  ess this index..
11ce0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61    **.  ** If pNa
11cf0 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
11d00 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20  hat we are.  ** 
11d10 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70  dealing with a p
11d20 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e  rimary key or UN
11d30 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
11d40 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76    We have to inv
11d50 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e  ent our.  ** own
11d60 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   name..  */.  if
11d70 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
11d80 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
11d90 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
11da0 65 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  e);.    if( SQLI
11db0 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
11dc0 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
11dd0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
11de0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
11df0 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
11e00 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
11e10 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 53 51  ndex;.    if( SQ
11e20 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
11e30 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
11e40 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29  pParse, zName) )
11e50 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
11e60 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11e70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64      }.    if( !d
11e80 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
11e90 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
11ea0 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
11eb0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
11ec0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
11ed0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 69  e_index;.      i
11ee0 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
11ef0 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70  dex(db, zName, p
11f00 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  Db->zName)!=0 ){
11f10 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69 66  .        if( !if
11f20 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20  NotExist ){.    
11f30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
11f40 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
11f50 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20  ndex %s already 
11f60 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b  exists", zName);
11f70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11f80 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
11f90 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
11fa0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   }.      if( sql
11fb0 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
11fc0 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29  , zName, 0)!=0 )
11fd0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
11fe0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
11ff0 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
12000 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65  ady a table name
12010 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  d %s", zName);. 
12020 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
12030 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
12040 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
12050 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a  else{.    char z
12060 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74  Buf[30];.    int
12070 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   n;.    Index *p
12080 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c  Loop;.    for(pL
12090 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  oop=pTab->pIndex
120a0 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c  , n=1; pLoop; pL
120b0 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74  oop=pLoop->pNext
120c0 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72  , n++){}.    spr
120d0 69 6e 74 66 28 7a 42 75 66 2c 22 5f 25 64 22 2c  intf(zBuf,"_%d",
120e0 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  n);.    zName = 
120f0 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  0;.    sqlite3Se
12100 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20  tString(&zName, 
12110 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65  "sqlite_autoinde
12120 78 5f 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  x_", pTab->zName
12130 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30  , zBuf, (char*)0
12140 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
12150 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
12160 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
12170 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
12180 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  r authorization 
12190 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  to create an ind
121a0 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ex..  */.#ifndef
121b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
121c0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
121d0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
121e0 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b  Db = pDb->zName;
121f0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
12200 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
12210 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
12220 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
12230 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  b), 0, zDb) ){. 
12240 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
12250 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
12260 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
12270 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
12280 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
12290 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
122a0 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
122b0 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
122c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
122d0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
122e0 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
122f0 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
12300 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
12310 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
12320 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
12330 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
12340 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
12350 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
12360 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
12370 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
12380 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
12390 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
123a0 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
123b0 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
123c0 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
123d0 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
123e0 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
123f0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
12400 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 28 75     nullId.z = (u
12410 38 2a 29 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54  8*)pTab->aCol[pT
12420 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d  ab->nCol-1].zNam
12430 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20  e;.    nullId.n 
12440 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29  = strlen((char*)
12450 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70  nullId.z);.    p
12460 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
12470 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  prListAppend(0, 
12480 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20  0, &nullId);.   
12490 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
124a0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
124b0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70 4c 69 73  _index;.    pLis
124c0 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  t->a[0].sortOrde
124d0 72 20 3d 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20  r = sortOrder;. 
124e0 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20   }..  /* Figure 
124f0 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74  out how many byt
12500 65 73 20 6f 66 20 73 70 61 63 65 20 61 72 65 20  es of space are 
12510 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72  required to stor
12520 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a  e explicitly.  *
12530 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c  * specified coll
12540 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
12550 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ames..  */.  for
12560 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
12570 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
12580 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c  Expr *pExpr = pL
12590 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
125a0 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 20 29  .    if( pExpr )
125b0 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b  {.      nExtra +
125c0 3d 20 28 31 20 2b 20 73 74 72 6c 65 6e 28 70 45  = (1 + strlen(pE
125d0 78 70 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  xpr->pColl->zNam
125e0 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  e));.    }.  }..
125f0 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63    /* .  ** Alloc
12600 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74  ate the index st
12610 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20  ructure. .  */. 
12620 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
12630 7a 4e 61 6d 65 29 3b 0a 20 20 6e 43 6f 6c 20 3d  zName);.  nCol =
12640 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
12650 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
12660 4d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 73  Malloc( .      s
12670 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 20  izeof(Index) +  
12680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
12690 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 20  ndex structure  
126a0 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
126b0 69 6e 74 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20  int)*nCol +     
126c0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
126d0 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20  iColumn   */.   
126e0 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28     sizeof(int)*(
126f0 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 20 20  nCol+1) +       
12700 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73  /* Index.aiRowEs
12710 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a  t   */.      siz
12720 65 6f 66 28 63 68 61 72 20 2a 29 2a 6e 43 6f 6c  eof(char *)*nCol
12730 20 2b 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64   +        /* Ind
12740 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f  ex.azColl     */
12750 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38  .      sizeof(u8
12760 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20  )*nCol +        
12770 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f      /* Index.aSo
12780 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  rtOrder */.     
12790 20 6e 4e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20   nName + 1 +    
127a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
127b0 20 49 6e 64 65 78 2e 7a 4e 61 6d 65 20 20 20 20   Index.zName    
127c0 20 20 2a 2f 0a 20 20 20 20 20 20 6e 45 78 74 72    */.      nExtr
127d0 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a               
127e0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
127f0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
12800 6d 65 73 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66  mes */.  );.  if
12810 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  ( sqlite3MallocF
12820 61 69 6c 65 64 28 29 20 29 20 67 6f 74 6f 20 65  ailed() ) goto e
12830 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12840 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  ;.  pIndex->aiCo
12850 6c 75 6d 6e 20 3d 20 28 69 6e 74 20 2a 29 28 26  lumn = (int *)(&
12860 70 49 6e 64 65 78 5b 31 5d 29 3b 0a 20 20 70 49  pIndex[1]);.  pI
12870 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d  ndex->aiRowEst =
12880 20 28 75 6e 73 69 67 6e 65 64 20 2a 29 28 26 70   (unsigned *)(&p
12890 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
128a0 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78  nCol]);.  pIndex
128b0 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72  ->azColl = (char
128c0 20 2a 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69   **)(&pIndex->ai
128d0 52 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d 29 3b  RowEst[nCol+1]);
128e0 0a 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74  .  pIndex->aSort
128f0 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29 28 26  Order = (u8 *)(&
12900 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e  pIndex->azColl[n
12910 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d  Col]);.  pIndex-
12920 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a  >zName = (char *
12930 29 28 26 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74  )(&pIndex->aSort
12940 4f 72 64 65 72 5b 6e 43 6f 6c 5d 29 3b 0a 20 20  Order[nCol]);.  
12950 7a 45 78 74 72 61 20 3d 20 28 63 68 61 72 20 2a  zExtra = (char *
12960 29 28 26 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  )(&pIndex->zName
12970 5b 6e 4e 61 6d 65 2b 31 5d 29 3b 0a 20 20 73 74  [nName+1]);.  st
12980 72 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  rcpy(pIndex->zNa
12990 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49  me, zName);.  pI
129a0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  ndex->pTable = p
129b0 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e  Tab;.  pIndex->n
129c0 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e  Column = pList->
129d0 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d  nExpr;.  pIndex-
129e0 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72  >onError = onErr
129f0 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75  or;.  pIndex->au
12a00 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d  toIndex = pName=
12a10 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53  =0;.  pIndex->pS
12a20 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
12a30 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 0a 20  iDb].pSchema;.. 
12a40 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
12a50 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f   if we should ho
12a60 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74  nor DESC request
12a70 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d  s on index colum
12a80 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  ns.  */.  if( pD
12a90 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65  b->pSchema->file
12aa0 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20  _format>=4 ){.  
12ab0 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20    sortOrderMask 
12ac0 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72  = -1;   /* Honor
12ad0 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65   DESC */.  }else
12ae0 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
12af0 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  ask = 0;    /* I
12b00 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20  gnore DESC */.  
12b10 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65  }..  /* Scan the
12b20 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
12b30 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62  lumns of the tab
12b40 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
12b50 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74   and.  ** load t
12b60 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65  he column indice
12b70 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78  s into the Index
12b80 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70   structure.  Rep
12b90 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a  ort an error.  *
12ba0 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  * if any column 
12bb0 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  is not found..  
12bc0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  */.  for(i=0, pL
12bd0 69 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  istItem=pList->a
12be0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
12bf0 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d  ; i++, pListItem
12c00 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
12c10 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d 20  har *zColName = 
12c20 70 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d 65  pListItem->zName
12c30 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 54  ;.    Column *pT
12c40 61 62 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 72  abCol;.    int r
12c50 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
12c60 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  r;.    char *zCo
12c70 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
12c80 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
12c90 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a  on sequence */..
12ca0 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 54 61      for(j=0, pTa
12cb0 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  bCol=pTab->aCol;
12cc0 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
12cd0 2b 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a  ++, pTabCol++){.
12ce0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
12cf0 33 53 74 72 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d  3StrICmp(zColNam
12d00 65 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d  e, pTabCol->zNam
12d10 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
12d20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d     }.    if( j>=
12d30 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
12d40 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12d50 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
12d60 6c 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c  le %s has no col
12d70 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20  umn named %s",. 
12d80 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
12d90 6d 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20  me, zColName);. 
12da0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
12db0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
12dc0 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61   }.    pIndex->a
12dd0 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a  iColumn[i] = j;.
12de0 20 20 20 20 69 66 28 20 70 4c 69 73 74 49 74 65      if( pListIte
12df0 6d 2d 3e 70 45 78 70 72 20 29 7b 0a 20 20 20 20  m->pExpr ){.    
12e00 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 49    assert( pListI
12e10 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c  tem->pExpr->pCol
12e20 6c 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  l );.      zColl
12e30 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20   = zExtra;.     
12e40 20 73 74 72 63 70 79 28 7a 45 78 74 72 61 2c 20   strcpy(zExtra, 
12e50 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
12e60 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  ->pColl->zName);
12e70 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d  .      zExtra +=
12e80 20 28 73 74 72 6c 65 6e 28 7a 43 6f 6c 6c 29 20   (strlen(zColl) 
12e90 2b 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  + 1);.    }else{
12ea0 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
12eb0 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f  Tab->aCol[j].zCo
12ec0 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  ll;.      if( !z
12ed0 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
12ee0 7a 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  zColl = db->pDfl
12ef0 74 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  tColl->zName;.  
12f00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
12f10 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
12f20 73 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f  sy && !sqlite3Lo
12f30 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
12f40 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 20 29  se, zColl, -1) )
12f50 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
12f60 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12f70 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
12f80 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43  ->azColl[i] = zC
12f90 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74  oll;.    request
12fa0 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c  edSortOrder = pL
12fb0 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  istItem->sortOrd
12fc0 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61  er & sortOrderMa
12fd0 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  sk;.    pIndex->
12fe0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
12ff0 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
13000 65 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  er;.  }.  sqlite
13010 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70  3DefaultRowEst(p
13020 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70  Index);..  if( p
13030 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65  Tab==pParse->pNe
13040 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  wTable ){.    /*
13050 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
13060 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f  s been called to
13070 20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d   create an autom
13080 61 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a  atic index as a.
13090 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66      ** result of
130a0 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
130b0 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
130c0 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69  on a column defi
130d0 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a  nition, or.    *
130e0 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  * a PRIMARY KEY 
130f0 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65  or UNIQUE clause
13100 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63   following the c
13110 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
13120 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f  s..    ** i.e. o
13130 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  ne of:.    **.  
13140 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
13150 45 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45  E t(x PRIMARY KE
13160 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52  Y, y);.    ** CR
13170 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20  EATE TABLE t(x, 
13180 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29  y, UNIQUE(x, y))
13190 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
131a0 45 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63  Either way, chec
131b0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
131c0 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
131d0 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e  s such an index.
131e0 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64   If.    ** so, d
131f0 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61  on't bother crea
13200 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54  ting this one. T
13210 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73  his only applies
13220 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d   to.    ** autom
13230 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64  atically created
13240 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20   indices. Users 
13250 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77  can do as they w
13260 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  ish with.    ** 
13270 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73  explicit indices
13280 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64  ..    */.    Ind
13290 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
132a0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
132b0 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
132c0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
132d0 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
132e0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f   assert( pIdx->o
132f0 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
13300 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13310 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78   pIdx->autoIndex
13320 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
13330 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ( pIndex->onErro
13340 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20  r!=OE_None );.. 
13350 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e       if( pIdx->n
13360 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e  Column!=pIndex->
13370 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e  nColumn ) contin
13380 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  ue;.      for(k=
13390 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; k<pIdx->nColu
133a0 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; k++){.      
133b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31    const char *z1
133c0 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
133d0 6b 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  k];.        cons
133e0 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 70 49 6e  t char *z2 = pIn
133f0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a  dex->azColl[k];.
13400 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
13410 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70  ->aiColumn[k]!=p
13420 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
13430 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  k] ) break;.    
13440 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53      if( pIdx->aS
13450 6f 72 74 4f 72 64 65 72 5b 6b 5d 21 3d 70 49 6e  ortOrder[k]!=pIn
13460 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
13470 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  k] ) break;.    
13480 20 20 20 20 69 66 28 20 7a 31 21 3d 7a 32 20 26      if( z1!=z2 &
13490 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
134a0 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b  (z1, z2) ) break
134b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
134c0 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f  if( k==pIdx->nCo
134d0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
134e0 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
134f0 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  r!=pIndex->onErr
13500 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
13510 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69  /* This constrai
13520 6e 74 20 63 72 65 61 74 65 73 20 74 68 65 20 73  nt creates the s
13530 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20 70  ame index as a p
13540 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
13550 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
13560 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68  specified somewh
13570 65 72 65 20 69 6e 20 74 68 65 20 43 52 45 41 54  ere in the CREAT
13580 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
13590 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t..          ** 
135a0 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43  However the ON C
135b0 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
135c0 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49  are different. I
135d0 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20  f both this .   
135e0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
135f0 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65  aint and the pre
13600 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74  vious equivalent
13610 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65   constraint have
13620 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20   explicit.      
13630 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49      ** ON CONFLI
13640 43 54 20 63 6c 61 75 73 65 73 20 74 68 69 73 20  CT clauses this 
13650 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68  is an error. Oth
13660 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a  erwise, use the.
13670 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
13680 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65  licitly specifie
13690 64 20 62 65 68 61 76 69 6f 75 72 20 66 6f 72 20  d behaviour for 
136a0 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  the index..     
136b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
136c0 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e    if( !(pIdx->on
136d0 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
136e0 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  t || pIndex->onE
136f0 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
13700 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
13710 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13720 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
13730 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c            "confl
13740 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49  icting ON CONFLI
13750 43 54 20 63 6c 61 75 73 65 73 20 73 70 65 63 69  CT clauses speci
13760 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20  fied", 0);.     
13770 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
13780 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
13790 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29  or==OE_Default )
137a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
137b0 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49  dx->onError = pI
137c0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20  ndex->onError;. 
137d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
137e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74     }.        got
137f0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13800 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
13810 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e   }.  }..  /* Lin
13820 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20  k the new Index 
13830 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
13840 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68   table and to th
13850 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d  e other.  ** in-
13860 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
13870 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a  structures. .  *
13880 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
13890 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64  .busy ){.    Ind
138a0 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73  ex *p;.    p = s
138b0 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
138c0 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  (&pIndex->pSchem
138d0 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20  a->idxHash, .   
138e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138f0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
13900 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64  ame, strlen(pInd
13910 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49  ex->zName)+1, pI
13920 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70  ndex);.    if( p
13930 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
13940 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20  ( p==pIndex );  
13950 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
13960 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
13970 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
13980 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
13990 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  }.    db->flags 
139a0 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
139b0 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28  Changes;.    if(
139c0 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
139d0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e        pIndex->tn
139e0 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
139f0 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  wTnum;.    }.  }
13a00 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
13a10 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30  ->init.busy is 0
13a20 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65   then create the
13a30 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20   index on disk. 
13a40 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c   This.  ** invol
13a50 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20  ves writing the 
13a60 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d  index into the m
13a70 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
13a80 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20  filling in the. 
13a90 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74   ** index with t
13aa0 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
13ab0 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a   contents..  **.
13ac0 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69    ** The db->ini
13ad0 74 2e 62 75 73 79 20 69 73 20 30 20 77 68 65 6e  t.busy is 0 when
13ae0 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20   the user first 
13af0 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20  enters a CREATE 
13b00 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d  INDEX .  ** comm
13b10 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62  and.  db->init.b
13b20 75 73 79 20 69 73 20 31 20 77 68 65 6e 20 61 20  usy is 1 when a 
13b30 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
13b40 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45  ed and .  ** CRE
13b50 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
13b60 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75  ents are read ou
13b70 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  t of the master 
13b80 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20  table.  In.  ** 
13b90 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20  the latter case 
13ba0 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
13bb0 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b  y exists on disk
13bc0 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20  , which is why. 
13bd0 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
13be0 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74  t to recreate it
13bf0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
13c00 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  TblName==0 it me
13c10 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69  ans this index i
13c20 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61  s generated as a
13c30 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a   primary key.  *
13c40 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  * or UNIQUE cons
13c50 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41  traint of a CREA
13c60 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
13c70 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74  nt.  Since the t
13c80 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75  able.  ** has ju
13c90 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  st been created,
13ca0 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   it contains no 
13cb0 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64  data and the ind
13cc0 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ex initializatio
13cd0 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20  n.  ** step can 
13ce0 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  be skipped..  */
13cf0 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62 2d 3e  .  else if( db->
13d00 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
13d10 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
13d20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
13d30 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61    int iMem = pPa
13d40 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 0a 20 20  rse->nMem++;..  
13d50 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
13d60 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
13d70 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
13d80 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13d90 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 72  dex;...    /* Cr
13da0 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67  eate the rootpag
13db0 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a  e for the index.
13dc0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
13dd0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
13de0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
13df0 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
13e00 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
13e10 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69  P_CreateIndex, i
13e20 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  Db, 0);.    sqli
13e30 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13e40 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65  OP_MemStore, iMe
13e50 6d 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  m, 0);..    /* G
13e60 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65  ather the comple
13e70 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
13e80 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
13e90 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a  ement into.    *
13ea0 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69  * the zStmt vari
13eb0 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  able.    */.    
13ec0 69 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45  if( pStart && pE
13ed0 6e 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  nd ){.      /* A
13ee0 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74   named index wit
13ef0 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52  h an explicit CR
13f00 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
13f10 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ment */.      zS
13f20 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
13f30 69 6e 74 66 28 22 43 52 45 41 54 45 25 73 20 49  intf("CREATE%s I
13f40 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20  NDEX %.*s",.    
13f50 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f      onError==OE_
13f60 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e  None ? "" : " UN
13f70 49 51 55 45 22 2c 0a 20 20 20 20 20 20 20 20 70  IQUE",.        p
13f80 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e  End->z - pName->
13f90 7a 20 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 70  z + 1,.        p
13fa0 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65  Name->z);.    }e
13fb0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
13fc0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
13fd0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52   created by a PR
13fe0 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
13ff0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  QUE constraint *
14000 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74  /.      /* zStmt
14010 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
14020 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20  f(""); */.      
14030 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  zStmt = 0;.    }
14040 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20  ..    /* Add an 
14050 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f  entry in sqlite_
14060 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20  master for this 
14070 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20  index.    */.   
14080 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
14090 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
140a0 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
140b0 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27  O %Q.%s VALUES('
140c0 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 30 2c  index',%Q,%Q,#0,
140d0 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64  %Q);",.        d
140e0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
140f0 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
14100 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49  iDb),.        pI
14110 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  ndex->zName,.   
14120 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
14130 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a  ,.        zStmt.
14140 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
14150 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
14160 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
14170 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 53 74    sqliteFree(zSt
14180 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c  mt);..    /* Fil
14190 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  l the index with
141a0 20 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73   data and repars
141b0 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f  e the schema. Co
141c0 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a  de an OP_Expire.
141d0 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69      ** to invali
141e0 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d  date all pre-com
141f0 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
14200 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
14210 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20   pTblName ){.   
14220 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
14230 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
14240 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  ndex, iMem);.   
14250 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
14260 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44  Cookie(db, v, iD
14270 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
14280 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50  3VdbeOp3(v, OP_P
14290 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c  arseSchema, iDb,
142a0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c   0,.         sql
142b0 69 74 65 33 4d 50 72 69 6e 74 66 28 22 6e 61 6d  ite3MPrintf("nam
142c0 65 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78 2d  e='%q'", pIndex-
142d0 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41  >zName), P3_DYNA
142e0 4d 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  MIC);.      sqli
142f0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14300 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c 20 30 29  OP_Expire, 0, 0)
14310 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
14320 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e  * When adding an
14330 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69   index to the li
14340 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f  st of indices fo
14350 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a  r a table, make.
14360 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e    ** sure all in
14370 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45  dices labeled OE
14380 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66  _Replace come af
14390 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61  ter all those la
143a0 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67  beled.  ** OE_Ig
143b0 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e  nore.  This is n
143c0 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65  ecessary for the
143d0 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69   correct operati
143e0 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a  on of UPDATE.  *
143f0 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20  * and INSERT..  
14400 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
14410 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61  t.busy || pTblNa
14420 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  me==0 ){.    if(
14430 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70   onError!=OE_Rep
14440 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49  lace || pTab->pI
14450 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20  ndex==0.        
14460 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
14470 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  ->onError==OE_Re
14480 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49  place){.      pI
14490 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54  ndex->pNext = pT
144a0 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
144b0 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d    pTab->pIndex =
144c0 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c   pIndex;.    }el
144d0 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
144e0 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e  *pOther = pTab->
144f0 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68  pIndex;.      wh
14500 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65  ile( pOther->pNe
14510 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e  xt && pOther->pN
14520 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  ext->onError!=OE
14530 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20  _Replace ){.    
14540 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74      pOther = pOt
14550 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
14560 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78    }.      pIndex
14570 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72  ->pNext = pOther
14580 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70  ->pNext;.      p
14590 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Other->pNext = p
145a0 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  Index;.    }.   
145b0 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d   pIndex = 0;.  }
145c0 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20  ..  /* Clean up 
145d0 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
145e0 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  /.exit_create_in
145f0 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65  dex:.  if( pInde
14600 78 20 29 7b 0a 20 20 20 20 66 72 65 65 49 6e 64  x ){.    freeInd
14610 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  ex(pIndex);.  }.
14620 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
14630 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
14640 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
14650 44 65 6c 65 74 65 28 70 54 62 6c 4e 61 6d 65 29  Delete(pTblName)
14660 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
14670 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Name);.  return;
14680 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
14690 74 65 20 63 6f 64 65 20 74 6f 20 6d 61 6b 65 20  te code to make 
146a0 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 66 6f  sure the file fo
146b0 72 6d 61 74 20 6e 75 6d 62 65 72 20 69 73 20 61  rmat number is a
146c0 74 20 6c 65 61 73 74 20 6d 69 6e 46 6f 72 6d 61  t least minForma
146d0 74 2e 0a 2a 2a 20 54 68 65 20 67 65 6e 65 72 61  t..** The genera
146e0 74 65 64 20 63 6f 64 65 20 77 69 6c 6c 20 69 6e  ted code will in
146f0 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65 20  crease the file 
14700 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20 69 66  format number if
14710 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 76   necessary..*/.v
14720 6f 69 64 20 73 71 6c 69 74 65 33 4d 69 6e 69 6d  oid sqlite3Minim
14730 75 6d 46 69 6c 65 46 6f 72 6d 61 74 28 50 61 72  umFileFormat(Par
14740 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
14750 69 44 62 2c 20 69 6e 74 20 6d 69 6e 46 6f 72 6d  iDb, int minForm
14760 61 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  at){.  Vdbe *v;.
14770 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
14780 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
14790 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
147a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
147b0 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
147c0 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  iDb, 1);.    sql
147d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
147e0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d 69 6e   OP_Integer, min
147f0 46 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20  Format, 0);.    
14800 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14810 28 76 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 73 71  (v, OP_Ge, 0, sq
14820 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
14830 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20  Addr(v)+3);.    
14840 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14850 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
14860 6d 69 6e 46 6f 72 6d 61 74 2c 20 30 29 3b 0a 20  minFormat, 0);. 
14870 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14880 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
14890 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20  kie, iDb, 1);.  
148a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20  }.}../*.** Fill 
148b0 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45  the Index.aiRowE
148c0 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20  st[] array with 
148d0 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74  default informat
148e0 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f  ion - informatio
148f0 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20  n.** to be used 
14900 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74  when we have not
14910 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45   run the ANALYZE
14920 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
14930 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73  aiRowEst[0] is s
14940 75 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61 69  uppose to contai
14950 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
14960 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
14970 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20  index..** Since 
14980 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20  we do not know, 
14990 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e  guess 1 million.
149a0 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73    aiRowEst[1] is
149b0 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
149c0 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
149d0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
149e0 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e  le that match an
149f0 79 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c  y particular val
14a00 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72  ue of the.** fir
14a10 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
14a20 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73   index.  aiRowEs
14a30 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[2] is an estim
14a40 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
14a50 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61  r.** of rows tha
14a60 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
14a70 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69 61 74  icular combiniat
14a80 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74  ion of the first
14a90 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66   2 columns.** of
14aa0 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64   the index.  And
14ab0 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d   so forth.  It m
14ac0 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 74 68  ust always be th
14ad0 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a  e case that.*.**
14ae0 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77             aiRow
14af0 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74  Est[N]<=aiRowEst
14b00 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20  [N-1].**        
14b10 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d     aiRowEst[N]>=
14b20 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72  1.**.** Apart fr
14b30 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76 65  om that, we have
14b40 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e   little to go on
14b50 20 62 65 73 69 64 65 73 20 69 6e 74 75 69 74 69   besides intuiti
14b60 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20  on as to.** how 
14b70 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c  aiRowEst[] shoul
14b80 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  d be initialized
14b90 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67  .  The numbers g
14ba0 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a  enerated here.**
14bb0 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79   are based on ty
14bc0 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75  pical values fou
14bd0 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64  nd in actual ind
14be0 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ices..*/.void sq
14bf0 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45  lite3DefaultRowE
14c00 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  st(Index *pIdx){
14c10 0a 20 20 75 6e 73 69 67 6e 65 64 20 2a 61 20 3d  .  unsigned *a =
14c20 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 3b   pIdx->aiRowEst;
14c30 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
14c40 72 74 28 20 61 21 3d 30 20 29 3b 0a 20 20 61 5b  rt( a!=0 );.  a[
14c50 30 5d 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20  0] = 1000000;.  
14c60 66 6f 72 28 69 3d 70 49 64 78 2d 3e 6e 43 6f 6c  for(i=pIdx->nCol
14c70 75 6d 6e 3b 20 69 3e 3d 31 3b 20 69 2d 2d 29 7b  umn; i>=1; i--){
14c80 0a 20 20 20 20 61 5b 69 5d 20 3d 20 31 30 3b 0a  .    a[i] = 10;.
14c90 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e    }.  if( pIdx->
14ca0 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
14cb0 20 29 7b 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e   ){.    a[pIdx->
14cc0 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20  nColumn] = 1;.  
14cd0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
14ce0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f  routine will dro
14cf0 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61  p an existing na
14d00 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73  med index.  This
14d10 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c   routine.** impl
14d20 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20  ements the DROP 
14d30 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e  INDEX statement.
14d40 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14d50 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20  DropIndex(Parse 
14d60 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
14d70 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45   *pName, int ifE
14d80 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20  xists){.  Index 
14d90 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20  *pIndex;.  Vdbe 
14da0 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
14db0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
14dc0 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66    int iDb;..  if
14dd0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
14de0 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  | sqlite3MallocF
14df0 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 67  ailed() ){.    g
14e00 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
14e10 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  dex;.  }.  asser
14e20 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
14e30 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  1 );.  if( SQLIT
14e40 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
14e50 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
14e60 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
14e70 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
14e80 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
14e90 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
14ea0 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
14eb0 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
14ec0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  zDatabase);.  if
14ed0 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20  ( pIndex==0 ){. 
14ee0 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74 73     if( !ifExists
14ef0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14f00 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14f10 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
14f20 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29  : %S", pName, 0)
14f30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
14f40 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
14f50 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  = 1;.    goto ex
14f60 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
14f70 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d   }.  if( pIndex-
14f80 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20  >autoIndex ){.  
14f90 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
14fa0 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
14fb0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
14fc0 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20   UNIQUE ".      
14fd0 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20  "or PRIMARY KEY 
14fe0 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f  constraint canno
14ff0 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30  t be dropped", 0
15000 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
15010 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
15020 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
15030 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
15040 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  , pIndex->pSchem
15050 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  a);.#ifndef SQLI
15060 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
15070 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
15080 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  t code = SQLITE_
15090 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  DROP_INDEX;.    
150a0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
150b0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  ndex->pTable;.  
150c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
150d0 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
150e0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  .zName;.    cons
150f0 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
15100 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
15110 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
15120 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
15130 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
15140 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20  , zTab, 0, zDb) 
15150 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
15160 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
15170 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d     }.    if( !OM
15180 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
15190 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45   ) code = SQLITE
151a0 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58  _DROP_TEMP_INDEX
151b0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
151c0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
151d0 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d  e, code, pIndex-
151e0 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e  >zName, pTab->zN
151f0 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
15200 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
15210 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  p_index;.    }. 
15220 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
15230 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
15240 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65   remove the inde
15250 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d  x and from the m
15260 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  aster table */. 
15270 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
15280 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
15290 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
152a0 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
152b0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44  Parse,.       "D
152c0 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
152d0 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
152e0 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  .       db->aDb[
152f0 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
15300 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
15310 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
15320 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  ame.    );.    s
15330 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
15340 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a  ie(db, v, iDb);.
15350 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
15360 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64  age(pParse, pInd
15370 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ex->tnum, iDb);.
15380 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
15390 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64  p3(v, OP_DropInd
153a0 65 78 2c 20 69 44 62 2c 20 30 2c 20 70 49 6e 64  ex, iDb, 0, pInd
153b0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ex->zName, 0);. 
153c0 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e   }..exit_drop_in
153d0 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  dex:.  sqlite3Sr
153e0 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d  cListDelete(pNam
153f0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 70 41  e);.}../*.** ppA
15400 72 72 61 79 20 70 6f 69 6e 74 73 20 69 6e 74 6f  rray points into
15410 20 61 20 73 74 72 75 63 74 75 72 65 20 77 68 65   a structure whe
15420 72 65 20 74 68 65 72 65 20 69 73 20 61 6e 20 61  re there is an a
15430 72 72 61 79 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rray pointer.** 
15440 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 77 6f 20  followed by two 
15450 69 6e 74 65 67 65 72 73 2e 20 54 68 65 20 66 69  integers. The fi
15460 72 73 74 20 69 6e 74 65 67 65 72 20 69 73 20 74  rst integer is t
15470 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
15480 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
15490 73 74 72 75 63 74 75 72 65 20 61 72 72 61 79 2e  structure array.
154a0 20 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74    The second int
154b0 65 67 65 72 0a 2a 2a 20 69 73 20 74 68 65 20 6e  eger.** is the n
154c0 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 63 61 74  umber of allocat
154d0 65 64 20 73 6c 6f 74 73 20 69 6e 20 74 68 65 20  ed slots in the 
154e0 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  array..**.** In 
154f0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
15500 20 73 74 72 75 63 74 75 72 65 20 6c 6f 6f 6b 73   structure looks
15510 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20   something like 
15520 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
15530 20 20 20 73 74 72 75 63 74 20 45 78 61 6d 70 6c     struct Exampl
15540 65 31 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  e1 {.**         
15550 20 73 74 72 75 63 74 20 73 75 62 45 6c 65 6d 20   struct subElem 
15560 2a 61 45 6e 74 72 79 3b 0a 2a 2a 20 20 20 20 20  *aEntry;.**     
15570 20 20 20 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b       int nEntry;
15580 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e 74  .**          int
15590 20 6e 41 6c 6c 6f 63 3b 0a 2a 2a 20 20 20 20 20   nAlloc;.**     
155a0 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70     }.**.** The p
155b0 6e 45 6e 74 72 79 20 70 61 72 61 6d 65 74 65 72  nEntry parameter
155c0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65   points to the e
155d0 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 45 78 61  quivalent of Exa
155e0 6d 70 6c 65 31 2e 6e 45 6e 74 72 79 2e 0a 2a 2a  mple1.nEntry..**
155f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15600 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65 77   allocates a new
15610 20 73 6c 6f 74 20 69 6e 20 74 68 65 20 61 72 72   slot in the arr
15620 61 79 2c 20 7a 65 72 6f 73 20 69 74 20 6f 75 74  ay, zeros it out
15630 2c 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73  ,.** and returns
15640 20 69 74 73 20 69 6e 64 65 78 2e 20 20 49 66 20   its index.  If 
15650 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 61 20 6e  malloc fails a n
15660 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
15670 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
15680 2a 20 73 7a 45 6e 74 72 79 20 69 73 20 74 68 65  * szEntry is the
15690 20 73 69 7a 65 6f 66 20 6f 66 20 61 20 73 69 6e   sizeof of a sin
156a0 67 6c 65 20 61 72 72 61 79 20 65 6e 74 72 79 2e  gle array entry.
156b0 20 20 69 6e 69 74 53 69 7a 65 20 69 73 20 74 68    initSize is th
156c0 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  e .** number of 
156d0 61 72 72 61 79 20 65 6e 74 72 69 65 73 20 61 6c  array entries al
156e0 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 69  located on the i
156f0 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61 74 69 6f  nitial allocatio
15700 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
15710 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 76  3ArrayAllocate(v
15720 6f 69 64 20 2a 2a 70 70 41 72 72 61 79 2c 20 69  oid **ppArray, i
15730 6e 74 20 73 7a 45 6e 74 72 79 2c 20 69 6e 74 20  nt szEntry, int 
15740 69 6e 69 74 53 69 7a 65 29 7b 0a 20 20 63 68 61  initSize){.  cha
15750 72 20 2a 70 3b 0a 20 20 69 6e 74 20 2a 61 6e 20  r *p;.  int *an 
15760 3d 20 28 69 6e 74 2a 29 26 70 70 41 72 72 61 79  = (int*)&ppArray
15770 5b 31 5d 3b 0a 20 20 69 66 28 20 61 6e 5b 30 5d  [1];.  if( an[0]
15780 3e 3d 61 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 76  >=an[1] ){.    v
15790 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  oid *pNew;.    i
157a0 6e 74 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20  nt newSize;.    
157b0 6e 65 77 53 69 7a 65 20 3d 20 61 6e 5b 31 5d 2a  newSize = an[1]*
157c0 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a 20 20  2 + initSize;.  
157d0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    pNew = sqliteR
157e0 65 61 6c 6c 6f 63 28 2a 70 70 41 72 72 61 79 2c  ealloc(*ppArray,
157f0 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e 74 72 79   newSize*szEntry
15800 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
15810 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
15820 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
15830 20 61 6e 5b 31 5d 20 3d 20 6e 65 77 53 69 7a 65   an[1] = newSize
15840 3b 0a 20 20 20 20 2a 70 70 41 72 72 61 79 20 3d  ;.    *ppArray =
15850 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 20 3d   pNew;.  }.  p =
15860 20 2a 70 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d   *ppArray;.  mem
15870 73 65 74 28 26 70 5b 61 6e 5b 30 5d 2a 73 7a 45  set(&p[an[0]*szE
15880 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72  ntry], 0, szEntr
15890 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 6e 5b  y);.  return an[
158a0 30 5d 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  0]++;.}../*.** A
158b0 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d  ppend a new elem
158c0 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ent to the given
158d0 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65   IdList.  Create
158e0 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66   a new IdList if
158f0 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a  .** need be..**.
15900 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20  ** A new IdList 
15910 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
15920 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
15930 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73   fails..*/.IdLis
15940 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
15950 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70  Append(IdList *p
15960 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
15970 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ken){.  int i;. 
15980 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
15990 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
159a0 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
159b0 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20  f(IdList) );.   
159c0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
159d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c  return 0;.    pL
159e0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b  ist->nAlloc = 0;
159f0 0a 20 20 7d 0a 20 20 69 20 3d 20 73 71 6c 69 74  .  }.  i = sqlit
15a00 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
15a10 28 76 6f 69 64 2a 2a 29 26 70 4c 69 73 74 2d 3e  (void**)&pList->
15a20 61 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  a, sizeof(pList-
15a30 3e 61 5b 30 5d 29 2c 20 35 29 3b 0a 20 20 69 66  >a[0]), 5);.  if
15a40 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  ( i<0 ){.    sql
15a50 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
15a60 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74  (pList);.    ret
15a70 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69  urn 0;.  }.  pLi
15a80 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
15a90 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
15aa0 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20  Token(pToken);. 
15ab0 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
15ac0 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
15ad0 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  n IdList..*/.voi
15ae0 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  d sqlite3IdListD
15af0 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c  elete(IdList *pL
15b00 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
15b10 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
15b20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
15b30 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
15b40 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
15b50 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  eFree(pList->a[i
15b60 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ].zName);.  }.  
15b70 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
15b80 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ->a);.  sqliteFr
15b90 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  ee(pList);.}../*
15ba0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
15bb0 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66  ndex in pList of
15bc0 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20   the identifier 
15bd0 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75  named zId.  Retu
15be0 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20  rn -1.** if not 
15bf0 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  found..*/.int sq
15c00 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
15c10 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
15c20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
15c30 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  e){.  int i;.  i
15c40 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
15c50 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69  turn -1;.  for(i
15c60 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
15c70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
15c80 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
15c90 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
15ca0 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65  , zName)==0 ) re
15cb0 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
15cc0 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
15cd0 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74  * Append a new t
15ce0 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65  able name to the
15cf0 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20   given SrcList. 
15d00 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72   Create a new Sr
15d10 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64  cList if.** need
15d20 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72   be.  A new entr
15d30 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  y is created in 
15d40 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e  the SrcList even
15d50 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55   if pToken is NU
15d60 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  LL..**.** A new 
15d70 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72  SrcList is retur
15d80 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
15d90 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
15da0 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61  **.** If pDataba
15db0 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20  se is not null, 
15dc0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
15dd0 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f  e table has an o
15de0 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  ptional.** datab
15df0 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e  ase name prefix.
15e00 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64    Like this:  "d
15e10 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20  atabase.table". 
15e20 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a   The pDatabase.*
15e30 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
15e40 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
15e50 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73  he pTable points
15e60 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15e70 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72   name..** The Sr
15e80 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  cList.a[].zName 
15e90 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20  field is filled 
15ea0 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e  with the table n
15eb0 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a  ame which might.
15ec0 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61  ** come from pTa
15ed0 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73  ble (if pDatabas
15ee0 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72  e is NULL) or fr
15ef0 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a  om pDatabase.  .
15f00 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  ** SrcList.a[].z
15f10 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c  Database is fill
15f20 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
15f30 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70  base name from p
15f40 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74  Table,.** or wit
15f50 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74  h NULL if no dat
15f60 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69  abase is specifi
15f70 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68  ed..**.** In oth
15f80 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c  er words, if cal
15f90 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  l like this:.**.
15fa0 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
15fb0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
15fc0 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,0);.**.** Th
15fd0 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20  en B is a table 
15fe0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
15ff0 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e  abase name is un
16000 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63  specified.  If c
16010 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68  alled.** like th
16020 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
16030 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
16040 41 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a  Append(A,B,C);.*
16050 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74  *.** Then C is t
16060 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
16070 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62  d B is the datab
16080 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63  ase name..*/.Src
16090 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
160a0 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63 4c 69  ListAppend(SrcLi
160b0 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
160c0 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65 6e 20   *pTable, Token 
160d0 2a 70 44 61 74 61 62 61 73 65 29 7b 0a 20 20 73  *pDatabase){.  s
160e0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
160f0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
16100 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
16110 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d   pList = sqliteM
16120 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53 72  alloc( sizeof(Sr
16130 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  cList) );.    if
16140 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
16150 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
16160 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20  ->nAlloc = 1;.  
16170 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e  }.  if( pList->n
16180 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c  Src>=pList->nAll
16190 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  oc ){.    SrcLis
161a0 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69  t *pNew;.    pLi
161b0 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b  st->nAlloc *= 2;
161c0 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
161d0 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c  teRealloc(pList,
161e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
161f0 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b  sizeof(*pList) +
16200 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d   (pList->nAlloc-
16210 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  1)*sizeof(pList-
16220 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  >a[0]) );.    if
16230 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
16240 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
16250 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
16260 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
16270 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20      }.    pList 
16280 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 49  = pNew;.  }.  pI
16290 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
162a0 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20 20  pList->nSrc];.  
162b0 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c  memset(pItem, 0,
162c0 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
162d0 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 44 61  [0]));.  if( pDa
162e0 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62  tabase && pDatab
162f0 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  ase->z==0 ){.   
16300 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a   pDatabase = 0;.
16310 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62    }.  if( pDatab
16320 61 73 65 20 26 26 20 70 54 61 62 6c 65 20 29 7b  ase && pTable ){
16330 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d  .    Token *pTem
16340 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20  p = pDatabase;. 
16350 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 70     pDatabase = p
16360 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c  Table;.    pTabl
16370 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20  e = pTemp;.  }. 
16380 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
16390 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
163a0 6f 6b 65 6e 28 70 54 61 62 6c 65 29 3b 0a 20 20  oken(pTable);.  
163b0 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
163c0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
163d0 6f 6d 54 6f 6b 65 6e 28 70 44 61 74 61 62 61 73  omToken(pDatabas
163e0 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 43 75  e);.  pItem->iCu
163f0 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 4c 69  rsor = -1;.  pLi
16400 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65  st->nSrc++;.  re
16410 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
16420 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75 72 73  *.** Assign curs
16430 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65  ors to all table
16440 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a  s in a SrcList.*
16450 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
16460 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
16470 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
16480 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  , SrcList *pList
16490 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
164a0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
164b0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65  m *pItem;.  asse
164c0 72 74 28 70 4c 69 73 74 20 7c 7c 20 73 71 6c 69  rt(pList || sqli
164d0 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
164e0 29 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  ) );.  if( pList
164f0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c   ){.    for(i=0,
16500 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
16510 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20   i<pList->nSrc; 
16520 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
16530 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
16540 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65  iCursor>=0 ) bre
16550 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ak;.      pItem-
16560 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  >iCursor = pPars
16570 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
16580 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
16590 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
165a0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
165b0 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
165c0 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  e, pItem->pSelec
165d0 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20  t->pSrc);.      
165e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
165f0 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69 61  *.** Add an alia
16600 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 69 64  s to the last id
16610 65 6e 74 69 66 69 65 72 20 6f 6e 20 74 68 65 20  entifier on the 
16620 67 69 76 65 6e 20 69 64 65 6e 74 69 66 69 65 72  given identifier
16630 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73   list..*/.void s
16640 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 64 64  qlite3SrcListAdd
16650 41 6c 69 61 73 28 53 72 63 4c 69 73 74 20 2a 70  Alias(SrcList *p
16660 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
16670 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ken){.  if( pLis
16680 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63  t && pList->nSrc
16690 3e 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d  >0 ){.    pList-
166a0 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  >a[pList->nSrc-1
166b0 5d 2e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ].zAlias = sqlit
166c0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
166d0 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a  pToken);.  }.}..
166e0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
166f0 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69  entire SrcList i
16700 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73  ncluding all its
16710 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a   substructure..*
16720 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
16730 63 4c 69 73 74 44 65 6c 65 74 65 28 53 72 63 4c  cListDelete(SrcL
16740 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
16750 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53  nt i;.  struct S
16760 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
16770 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
16780 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
16790 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
167a0 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
167b0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
167c0 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
167d0 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 44 61 74  Free(pItem->zDat
167e0 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  abase);.    sqli
167f0 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e  teFree(pItem->zN
16800 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
16810 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 41 6c 69  Free(pItem->zAli
16820 61 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  as);.    sqlite3
16830 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
16840 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
16850 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
16860 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 53 65 6c  lete(pItem->pSel
16870 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ect);.    sqlite
16880 33 45 78 70 72 44 65 6c 65 74 65 28 70 49 74 65  3ExprDelete(pIte
16890 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c  m->pOn);.    sql
168a0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
168b0 28 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  (pItem->pUsing);
168c0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
168d0 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pList);.}../*.
168e0 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73  ** Begin a trans
168f0 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
16900 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73  qlite3BeginTrans
16910 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
16920 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b  arse, int type){
16930 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
16940 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
16950 20 69 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73   i;..  if( pPars
16960 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
16970 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
16980 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
16990 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
169a0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
169b0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
169c0 6c 65 64 28 29 20 29 20 72 65 74 75 72 6e 3b 0a  led() ) return;.
169d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
169e0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
169f0 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
16a00 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30  N, "BEGIN", 0, 0
16a10 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76  ) ) return;..  v
16a20 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
16a30 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
16a40 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !v ) return;.  
16a50 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46  if( type!=TK_DEF
16a60 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72  ERRED ){.    for
16a70 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
16a80 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
16a90 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
16aa0 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
16ab0 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58   i, (type==TK_EX
16ac0 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20  CLUSIVE)+1);.   
16ad0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
16ae0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
16af0 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30  AutoCommit, 0, 0
16b00 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
16b10 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  it a transaction
16b20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
16b30 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f  CommitTransactio
16b40 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
16b50 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
16b60 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69  .  Vdbe *v;..  i
16b70 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
16b80 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
16b90 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
16ba0 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
16bb0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
16bc0 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d  nErr || sqlite3M
16bd0 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20  allocFailed() ) 
16be0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
16bf0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
16c00 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
16c10 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d  ANSACTION, "COMM
16c20 49 54 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  IT", 0, 0) ) ret
16c30 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  urn;..  v = sqli
16c40 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
16c50 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
16c60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16c70 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  dOp(v, OP_AutoCo
16c80 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  mmit, 1, 0);.  }
16c90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
16ca0 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
16cb0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
16cc0 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74  RollbackTransact
16cd0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
16ce0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
16cf0 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
16d00 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
16d10 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
16d20 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b  )==0 || db->aDb[
16d30 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
16d40 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
16d50 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
16d60 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
16d70 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
16d80 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
16d90 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
16da0 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f  TRANSACTION, "RO
16db0 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29  LLBACK", 0, 0) )
16dc0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20   return;..  v = 
16dd0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
16de0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
16df0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
16e00 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75  beAddOp(v, OP_Au
16e10 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b  toCommit, 1, 1);
16e20 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
16e30 6b 65 20 73 75 72 65 20 74 68 65 20 54 45 4d 50  ke sure the TEMP
16e40 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
16e50 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20  n and available 
16e60 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e  for use.  Return
16e70 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
16e80 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65  f errors.  Leave
16e90 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
16ea0 67 65 73 20 69 6e 20 74 68 65 20 70 50 61 72 73  ges in the pPars
16eb0 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
16ec0 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
16ed0 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
16ee0 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
16ef0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
16f00 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
16f10 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
16f20 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73  pBt==0 && !pPars
16f30 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
16f40 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
16f50 65 33 42 74 72 65 65 46 61 63 74 6f 72 79 28 64  e3BtreeFactory(d
16f60 62 2c 20 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47  b, 0, 0, MAX_PAG
16f70 45 53 2c 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e  ES, &db->aDb[1].
16f80 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pBt);.    if( rc
16f90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16fa0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
16fb0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
16fc0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74  able to open a t
16fd0 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
16fe0 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c  e ".        "fil
16ff0 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65  e for storing te
17000 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29  mporary tables")
17010 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
17020 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72  rc = rc;.      r
17030 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
17040 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73     if( db->flags
17050 20 26 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   & !db->autoComm
17060 69 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  it ){.      rc =
17070 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
17080 69 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b  inTrans(db->aDb[
17090 31 5d 2e 70 42 74 2c 20 31 29 3b 0a 20 20 20 20  1].pBt, 1);.    
170a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
170b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
170c0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
170d0 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
170e0 6f 20 67 65 74 20 61 20 77 72 69 74 65 20 6c 6f  o get a write lo
170f0 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20 20 20  ck on ".        
17100 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61 72 79    "the temporary
17110 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 29   database file")
17120 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
17130 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
17140 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
17150 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
17160 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31  ssert( db->aDb[1
17170 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 7d  ].pSchema );.  }
17180 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
17190 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
171a0 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 77 69  DBE code that wi
171b0 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20 73 63  ll verify the sc
171c0 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20  hema cookie and 
171d0 73 74 61 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d  start.** a read-
171e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
171f0 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61 62 61  all named databa
17200 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  se files..**.** 
17210 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
17220 74 68 61 74 20 61 6c 6c 20 73 63 68 65 6d 61 20  that all schema 
17230 63 6f 6f 6b 69 65 73 20 62 65 20 76 65 72 69 66  cookies be verif
17240 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72  ied and all.** r
17250 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ead transactions
17260 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
17270 72 65 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  re anything else
17280 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74   happens in.** t
17290 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e  he VDBE program.
172a0 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69    But this routi
172b0 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  ne can be called
172c0 20 61 66 74 65 72 20 6d 75 63 68 20 6f 74 68 65   after much othe
172d0 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20 62 65  r.** code has be
172e0 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20 20 53  en generated.  S
172f0 6f 20 68 65 72 65 20 69 73 20 77 68 61 74 20 77  o here is what w
17300 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e do:.**.** The 
17310 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  first time this 
17320 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
17330 64 2c 20 77 65 20 63 6f 64 65 20 61 6e 20 4f 50  d, we code an OP
17340 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69  _Goto that.** wi
17350 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73 75 62  ll jump to a sub
17360 72 6f 75 74 69 6e 65 20 61 74 20 74 68 65 20 65  routine at the e
17370 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  nd of the progra
17380 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72  m.  Then we.** r
17390 65 63 6f 72 64 20 65 76 65 72 79 20 64 61 74 61  ecord every data
173a0 62 61 73 65 20 74 68 61 74 20 6e 65 65 64 73 20  base that needs 
173b0 69 74 73 20 73 63 68 65 6d 61 20 76 65 72 69 66  its schema verif
173c0 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50  ied in the.** pP
173d0 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
173e0 20 66 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20   field.  Later, 
173f0 61 66 74 65 72 20 61 6c 6c 20 6f 74 68 65 72 20  after all other 
17400 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a  code has been.**
17410 20 67 65 6e 65 72 61 74 65 64 2c 20 74 68 65 20   generated, the 
17420 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
17430 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  does the cookie 
17440 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20 61 6e  verifications an
17450 64 0a 2a 2a 20 73 74 61 72 74 73 20 74 68 65 20  d.** starts the 
17460 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c  transactions wil
17470 6c 20 62 65 20 63 6f 64 65 64 20 61 6e 64 20 74  l be coded and t
17480 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61  he OP_Goto P2 va
17490 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d  lue.** will be m
174a0 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ade to point to 
174b0 74 68 61 74 20 73 75 62 72 6f 75 74 69 6e 65 2e  that subroutine.
174c0 20 20 54 68 65 20 67 65 6e 65 72 61 74 69 6f 6e    The generation
174d0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69   of the.** cooki
174e0 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 73  e verification s
174f0 75 62 72 6f 75 74 69 6e 65 20 63 6f 64 65 20 68  ubroutine code h
17500 61 70 70 65 6e 73 20 69 6e 20 73 71 6c 69 74 65  appens in sqlite
17510 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
17520 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20  .**.** If iDb<0 
17530 74 68 65 6e 20 63 6f 64 65 20 74 68 65 20 4f 50  then code the OP
17540 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e  _Goto only - don
17550 27 74 20 73 65 74 20 66 6c 61 67 20 74 6f 20 76  't set flag to v
17560 65 72 69 66 79 20 74 68 65 0a 2a 2a 20 73 63 68  erify the.** sch
17570 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74 61 62  ema on any datab
17580 61 73 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20  ases.  This can 
17590 62 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74  be used to posit
175a0 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a  ion the OP_Goto.
175b0 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20  ** early in the 
175c0 63 6f 64 65 2c 20 62 65 66 6f 72 65 20 77 65 20  code, before we 
175d0 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64 61 74 61  know if any data
175e0 62 61 73 65 20 74 61 62 6c 65 73 20 77 69 6c 6c  base tables will
175f0 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69   be used..*/.voi
17600 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  d sqlite3CodeVer
17610 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20  ifySchema(Parse 
17620 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
17630 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
17640 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
17650 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d 20  nt mask;..  v = 
17660 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
17670 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
17680 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  =0 ) return;  /*
17690 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
176a0 6e 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ns if there was 
176b0 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f  a prior error */
176c0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
176d0 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  db;.  if( pParse
176e0 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20  ->cookieGoto==0 
176f0 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63  ){.    pParse->c
17700 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69  ookieGoto = sqli
17710 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
17720 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31  OP_Goto, 0, 0)+1
17730 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3e  ;.  }.  if( iDb>
17740 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
17750 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  ( iDb<db->nDb );
17760 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
17770 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30  >aDb[iDb].pBt!=0
17780 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20   || iDb==1 );.  
17790 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 33 32    assert( iDb<32
177a0 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 31   );.    mask = 1
177b0 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66 28 20 28  <<iDb;.    if( (
177c0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
177d0 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  sk & mask)==0 ){
177e0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
177f0 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73  ookieMask |= mas
17800 6b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  k;.      pParse-
17810 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62  >cookieValue[iDb
17820 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  ] = db->aDb[iDb]
17830 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
17840 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69  _cookie;.      i
17850 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
17860 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
17870 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
17880 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 50 61  TempDatabase(pPa
17890 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rse);.      }.  
178a0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
178b0 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
178c0 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65  ode that prepare
178d0 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f  s for doing an o
178e0 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  peration that.**
178f0 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
17900 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
17910 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
17920 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e  tarts a new tran
17930 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72  saction if we ar
17940 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69  e not already wi
17950 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61  thin.** a transa
17960 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72  ction.  If we ar
17970 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  e already within
17980 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
17990 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e  then a checkpoin
179a0 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74  t.** is set if t
179b0 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20  he setStatement 
179c0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75  parameter is tru
179d0 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74  e.  A checkpoint
179e0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
179f0 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73  t for operations
17a00 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c   that might fail
17a10 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74   (due to a const
17a20 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a  raint) part of.*
17a30 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67  * the way throug
17a40 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c  h and which will
17a50 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f   need to undo so
17a60 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75  me writes withou
17a70 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72  t having to.** r
17a80 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c  ollback the whol
17a90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
17aa0 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  For operations w
17ab0 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  here all constra
17ac0 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  ints.** can be c
17ad0 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e  hecked before an
17ae0 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  y changes are ma
17af0 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
17b00 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a  se, it is never.
17b10 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ** necessary to 
17b20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64  undo a write and
17b30 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
17b40 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65  should not be se
17b50 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61  t..**.** Only da
17b60 74 61 62 61 73 65 20 69 44 62 20 61 6e 64 20 74  tabase iDb and t
17b70 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
17b80 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62   are made writab
17b90 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c 6c 2e  le by this call.
17ba0 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20 74  .** If iDb==0, t
17bb0 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e 64  hen the main and
17bc0 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 73 20   temp databases 
17bd0 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c  are made writabl
17be0 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d 3d  e.   If.** iDb==
17bf0 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20  1 then only the 
17c00 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 69 73  temp database is
17c10 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20   made writable. 
17c20 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e 20 74   If iDb>1 then t
17c30 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  he.** specified 
17c40 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
17c50 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20  se and the temp 
17c60 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64  database are mad
17c70 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76  e writable..*/.v
17c80 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
17c90 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50  WriteOperation(P
17ca0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
17cb0 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20  t setStatement, 
17cc0 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
17cd0 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
17ce0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
17cf0 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
17d00 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65  n;.  sqlite3Code
17d10 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
17d20 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 50 61  rse, iDb);.  pPa
17d30 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c  rse->writeMask |
17d40 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20  = 1<<iDb;.  if( 
17d50 73 65 74 53 74 61 74 65 6d 65 6e 74 20 26 26 20  setStatement && 
17d60 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
17d70 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
17d80 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
17d90 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62 2c 20  Statement, iDb, 
17da0 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 4f  0);.  }.  if( (O
17db0 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69 44  MIT_TEMPDB || iD
17dc0 62 21 3d 31 29 20 26 26 20 70 50 61 72 73 65 2d  b!=1) && pParse-
17dd0 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 21  >db->aDb[1].pBt!
17de0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
17df0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
17e00 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 73 65 74  tion(pParse, set
17e10 53 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a 20  Statement, 1);. 
17e20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63   }.}../*.** Chec
17e30 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64  k to see if pInd
17e40 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c  ex uses the coll
17e50 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
17e60 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  Coll.  Return.**
17e70 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
17e80 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74   and false if it
17e90 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69   does not..*/.#i
17ea0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17eb0 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
17ec0 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61   int collationMa
17ed0 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tch(const char *
17ee0 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49  zColl, Index *pI
17ef0 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  ndex){.  int i;.
17f00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e    for(i=0; i<pIn
17f10 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  dex->nColumn; i+
17f20 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
17f30 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e  ar *z = pIndex->
17f40 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69  azColl[i];.    i
17f50 66 28 20 7a 3d 3d 7a 43 6f 6c 6c 20 7c 7c 20 28  f( z==zColl || (
17f60 7a 20 26 26 20 7a 43 6f 6c 6c 20 26 26 20 30 3d  z && zColl && 0=
17f70 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
17f80 7a 2c 20 7a 43 6f 6c 6c 29 29 20 29 7b 0a 20 20  z, zColl)) ){.  
17f90 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
17fa0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
17fb0 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
17fc0 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c  .** Recompute al
17fd0 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
17fe0 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63  b that use the c
17ff0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
18000 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70  e pColl..** If p
18010 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
18020 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
18030 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23  es of pTab..*/.#
18040 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18050 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
18060 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61  c void reindexTa
18070 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
18080 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
18090 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
180a0 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  l){.  Index *pIn
180b0 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
180c0 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
180d0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
180e0 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e  ab */..  for(pIn
180f0 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  dex=pTab->pIndex
18100 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
18110 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b  =pIndex->pNext){
18120 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d  .    if( zColl==
18130 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61  0 || collationMa
18140 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65  tch(zColl, pInde
18150 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  x) ){.      int 
18160 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
18170 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
18180 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
18190 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  hema);.      sql
181a0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
181b0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
181c0 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  0, iDb);.      s
181d0 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
181e0 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
181f0 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , -1);.    }.  }
18200 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
18210 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
18220 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61  ndices of all ta
18230 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  bles in all data
18240 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a  bases where the.
18250 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74  ** indices use t
18260 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
18270 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66  uence pColl.  If
18280 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
18290 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20  ecompute.** all 
182a0 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65  indices everywhe
182b0 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  re..*/.#ifndef S
182c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
182d0 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  EX.static void r
182e0 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
182f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
18300 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
18310 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  ){.  Db *pDb;   
18320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18330 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74   /* A single dat
18340 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
18350 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
18360 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
18370 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
18380 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
18390 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
183a0 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
183b0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
183c0 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b  */.  HashElem *k
183d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
183e0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
183f0 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70  over tables in p
18400 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  Db */.  Table *p
18410 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
18420 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
18430 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
18440 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20  /..  for(iDb=0, 
18450 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62  pDb=db->aDb; iDb
18460 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c  <db->nDb; iDb++,
18470 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 69 66 28   pDb++){.    if(
18480 20 70 44 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e   pDb==0 ) contin
18490 75 65 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71  ue;.    for(k=sq
184a0 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
184b0 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
184c0 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c  Hash);  k; k=sql
184d0 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b  iteHashNext(k)){
184e0 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54  .      pTab = (T
184f0 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68  able*)sqliteHash
18500 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72  Data(k);.      r
18510 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72  eindexTable(pPar
18520 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29  se, pTab, zColl)
18530 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
18540 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
18550 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
18560 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  e REINDEX comman
18570 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  d..**.**        
18580 52 45 49 4e 44 45 58 20 20 20 20 20 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 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20     -- 1.**      
185b0 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c    REINDEX  <coll
185c0 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20  ation>          
185d0 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20       -- 2.**    
185e0 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64      REINDEX  ?<d
185f0 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65  atabase>.?<table
18600 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20  name>  -- 3.**  
18610 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
18620 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64  <database>.?<ind
18630 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a  exname>  -- 4.**
18640 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65  .** Form 1 cause
18650 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
18660 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
18670 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 72 65  tabases to be re
18680 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32  built..** Form 2
18690 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e   rebuilds all in
186a0 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  dices in all dat
186b0 61 62 61 73 65 73 20 74 68 61 74 20 75 73 65 20  abases that use 
186c0 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c  the named.** col
186d0 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  lating function.
186e0 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20    Forms 3 and 4 
186f0 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65  rebuild the name
18700 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a  d index or all.*
18710 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  * indices associ
18720 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
18730 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69  med table..*/.#i
18740 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18750 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73  T_REINDEX.void s
18760 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50 61  qlite3Reindex(Pa
18770 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
18780 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65  en *pName1, Toke
18790 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f  n *pName2){.  Co
187a0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
187b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
187c0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
187d0 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c  to be reindexed,
187e0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68   or NULL */.  ch
187f0 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
18800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
18810 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  e of a table or 
18820 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74  index */.  const
18830 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20   char *zDb;     
18840 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
18850 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
18860 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
18870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18880 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
18890 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
188a0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
188b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
188c0 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  n index associat
188d0 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a  ed with pTab */.
188e0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
188f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18900 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
18910 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
18920 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
18930 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
18940 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
18950 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ection */.  Toke
18960 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20  n *pObjName;    
18970 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
18980 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
18990 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e  index to be rein
189a0 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52  dexed */..  /* R
189b0 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
189c0 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
189d0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
189e0 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
189f0 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
18a00 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
18a10 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
18a20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
18a30 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
18a40 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
18a50 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
18a60 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 7c   if( pName1==0 |
18a70 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 20 29  | pName1->z==0 )
18a80 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74  {.    reindexDat
18a90 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30  abases(pParse, 0
18aa0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
18ab0 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65   }else if( pName
18ac0 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e  2==0 || pName2->
18ad0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  z==0 ){.    asse
18ae0 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b  rt( pName1->z );
18af0 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
18b00 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
18b10 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 28 63 68  db, ENC(db), (ch
18b20 61 72 2a 29 70 4e 61 6d 65 31 2d 3e 7a 2c 20 70  ar*)pName1->z, p
18b30 4e 61 6d 65 31 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Name1->n, 0);.  
18b40 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
18b50 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73       char *z = s
18b60 71 6c 69 74 65 53 74 72 4e 44 75 70 28 28 63 6f  qliteStrNDup((co
18b70 6e 73 74 20 63 68 61 72 20 2a 29 70 4e 61 6d 65  nst char *)pName
18b80 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d 3e 6e 29  1->z, pName1->n)
18b90 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 20 29 7b  ;.      if( z ){
18ba0 0a 20 20 20 20 20 20 20 20 72 65 69 6e 64 65 78  .        reindex
18bb0 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65  Databases(pParse
18bc0 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , z);.        sq
18bd0 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
18be0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
18bf0 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  n;.    }.  }.  i
18c00 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
18c10 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
18c20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
18c30 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66  &pObjName);.  if
18c40 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
18c50 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e  ;.  z = sqlite3N
18c60 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4f 62  ameFromToken(pOb
18c70 6a 4e 61 6d 65 29 3b 0a 20 20 7a 44 62 20 3d 20  jName);.  zDb = 
18c80 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
18c90 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  me;.  pTab = sql
18ca0 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
18cb0 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28  , z, zDb);.  if(
18cc0 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69   pTab ){.    rei
18cd0 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
18ce0 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , pTab, 0);.    
18cf0 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
18d00 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
18d10 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
18d20 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
18d30 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , zDb);.  sqlite
18d40 46 72 65 65 28 7a 29 3b 0a 20 20 69 66 28 20 70  Free(z);.  if( p
18d50 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c  Index ){.    sql
18d60 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
18d70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
18d80 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  0, iDb);.    sql
18d90 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
18da0 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
18db0 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  -1);.    return;
18dc0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72  .  }.  sqlite3Er
18dd0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
18de0 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69  unable to identi
18df0 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f  fy the object to
18e00 20 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b   be reindexed");
18e10 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
18e20 20 52 65 74 75 72 6e 20 61 20 64 79 6e 61 6d 69   Return a dynami
18e30 63 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 4b 65  cly allocated Ke
18e40 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
18e50 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
18e60 0a 2a 2a 20 77 69 74 68 20 4f 50 5f 4f 70 65 6e  .** with OP_Open
18e70 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e 57  Read or OP_OpenW
18e80 72 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 64  rite to access d
18e90 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 70 49  atabase index pI
18ea0 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  dx..**.** If suc
18eb0 63 65 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74  cessful, a point
18ec0 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74  er to the new st
18ed0 72 75 63 74 75 72 65 20 69 73 20 72 65 74 75 72  ructure is retur
18ee0 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
18ef0 65 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  e.** the caller 
18f00 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
18f10 6f 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  or calling sqlit
18f20 65 46 72 65 65 28 29 20 6f 6e 20 74 68 65 20 72  eFree() on the r
18f30 65 74 75 72 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e  eturned .** poin
18f40 74 65 72 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ter. If an error
18f50 20 6f 63 63 75 72 73 20 28 6f 75 74 20 6f 66 20   occurs (out of 
18f60 6d 65 6d 6f 72 79 20 6f 72 20 6d 69 73 73 69 6e  memory or missin
18f70 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20  g collation .** 
18f80 73 65 71 75 65 6e 63 65 29 2c 20 4e 55 4c 4c 20  sequence), NULL 
18f90 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
18fa0 74 68 65 20 73 74 61 74 65 20 6f 66 20 70 50 61  the state of pPa
18fb0 72 73 65 20 75 70 64 61 74 65 64 20 74 6f 20 72  rse updated to r
18fc0 65 66 6c 65 63 74 0a 2a 2a 20 74 68 65 20 65 72  eflect.** the er
18fd0 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  ror..*/.KeyInfo 
18fe0 2a 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79  *sqlite3IndexKey
18ff0 69 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  info(Parse *pPar
19000 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  se, Index *pIdx)
19010 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
19020 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43   nCol = pIdx->nC
19030 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 42 79  olumn;.  int nBy
19040 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79  tes = sizeof(Key
19050 49 6e 66 6f 29 20 2b 20 28 6e 43 6f 6c 2d 31 29  Info) + (nCol-1)
19060 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
19070 29 20 2b 20 6e 43 6f 6c 3b 0a 20 20 4b 65 79 49  ) + nCol;.  KeyI
19080 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b 65 79  nfo *pKey = (Key
19090 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65 4d 61 6c  Info *)sqliteMal
190a0 6c 6f 63 28 6e 42 79 74 65 73 29 3b 0a 0a 20 20  loc(nBytes);..  
190b0 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
190c0 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pKey->aSortOrder
190d0 20 3d 20 28 75 38 20 2a 29 26 28 70 4b 65 79 2d   = (u8 *)&(pKey-
190e0 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20  >aColl[nCol]);. 
190f0 20 20 20 61 73 73 65 72 74 28 20 26 70 4b 65 79     assert( &pKey
19100 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f  ->aSortOrder[nCo
19110 6c 5d 3d 3d 26 28 28 28 75 38 20 2a 29 70 4b 65  l]==&(((u8 *)pKe
19120 79 29 5b 6e 42 79 74 65 73 5d 29 20 29 3b 0a 20  y)[nBytes]) );. 
19130 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
19140 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
19150 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49  char *zColl = pI
19160 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  dx->azColl[i];. 
19170 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 43 6f       assert( zCo
19180 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  ll );.      pKey
19190 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c  ->aColl[i] = sql
191a0 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
191b0 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c  q(pParse, zColl,
191c0 20 2d 31 29 3b 0a 20 20 20 20 20 20 70 4b 65 79   -1);.      pKey
191d0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
191e0 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  = pIdx->aSortOrd
191f0 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  er[i];.    }.   
19200 20 70 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 3d 20   pKey->nField = 
19210 6e 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  nCol;.  }..  if(
19220 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
19230 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
19240 70 4b 65 79 29 3b 0a 20 20 20 20 70 4b 65 79 20  pKey);.    pKey 
19250 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
19260 6e 20 70 4b 65 79 3b 0a 7d 0a                    n pKey;.}.