/ Hex Artifact Content
Login

Artifact 11798f165cdcf3b46f4b10b2ba3853b8c370eac2:


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 35 20 32 30 30 36 2f 30 32 2f 31 30  1.385 2006/02/10
02f0: 20 30 37 3a 30 37 3a 31 34 20 64 61 6e 69 65 6c   07:07:14 daniel
0300: 6b 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23  k1977 Exp $.*/.#
0310: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0320: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
0330: 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  ctype.h>../*.** 
0340: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0350: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  called when a ne
0360: 77 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  w SQL statement 
0370: 69 73 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a  is beginning to.
0380: 2a 2a 20 62 65 20 70 61 72 73 65 64 2e 20 20 49  ** be parsed.  I
0390: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 70 50  nitialize the pP
03a0: 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20 61  arse structure a
03b0: 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69  s needed..*/.voi
03c0: 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61  d sqlite3BeginPa
03d0: 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rse(Parse *pPars
03e0: 65 2c 20 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c  e, int explainFl
03f0: 61 67 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 65  ag){.  pParse->e
0400: 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61 69 6e  xplain = explain
0410: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
0420: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
0430: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0440: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0450: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0460: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0470: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0480: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0490: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
04a0: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
04b0: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
04c0: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
04d0: 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 54 61  t iDb;.  int iTa
04e0: 62 3b 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c  b;.  u8 isWriteL
04f0: 6f 63 6b 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ock;.  const cha
0500: 72 20 2a 7a 4e 61 6d 65 3b 0a 7d 3b 0a 0a 2f 2a  r *zName;.};../*
0510: 0a 2a 2a 20 48 61 76 65 20 74 68 65 20 63 6f 6d  .** Have the com
0520: 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 20  piled statement 
0530: 6c 6f 63 6b 20 74 68 65 20 74 61 62 6c 65 20 77  lock the table w
0540: 69 74 68 20 72 6f 6f 74 70 61 67 65 20 69 54 61  ith rootpage iTa
0550: 62 20 69 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a  b in database.**
0560: 20 69 44 62 20 61 74 20 74 68 65 20 73 68 61 72   iDb at the shar
0570: 65 64 2d 63 61 63 68 65 20 6c 65 76 65 6c 20 77  ed-cache level w
0580: 68 65 6e 20 65 78 65 63 75 74 65 64 2e 20 54 68  hen executed. Th
0590: 65 20 69 73 57 72 69 74 65 4c 6f 63 6b 20 61 72  e isWriteLock ar
05a0: 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 7a 65  gument .** is ze
05b0: 72 6f 20 66 6f 72 20 61 20 72 65 61 64 2d 6c 6f  ro for a read-lo
05c0: 63 6b 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  ck, or non-zero 
05d0: 66 6f 72 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  for a write-lock
05e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 4e 61 6d  ..**.** The zNam
05f0: 65 20 70 61 72 61 6d 65 74 65 72 20 73 68 6f 75  e parameter shou
0600: 6c 64 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ld point to the 
0610: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
0620: 65 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 0a  e name. This is.
0630: 2a 2a 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69  ** used to provi
0640: 64 65 20 61 20 6d 6f 72 65 20 69 6e 66 6f 72 6d  de a more inform
0650: 61 74 69 76 65 20 65 72 72 6f 72 20 6d 65 73 73  ative error mess
0660: 61 67 65 20 73 68 6f 75 6c 64 20 74 68 65 20 6c  age should the l
0670: 6f 63 6b 20 66 61 69 6c 2e 0a 2a 2f 0a 76 6f 69  ock fail..*/.voi
0680: 64 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f  d sqlite3TableLo
0690: 63 6b 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ck(.  Parse *pPa
06a0: 72 73 65 2c 20 0a 20 20 69 6e 74 20 69 44 62 2c  rse, .  int iDb,
06b0: 20 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 0a 20   .  int iTab, . 
06c0: 20 75 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 2c   u8 isWriteLock,
06d0: 20 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20    .  const char 
06e0: 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 69 6e 74 20  *zName.){.  int 
06f0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b  i;.  int nBytes;
0700: 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b  .  TableLock *p;
0710: 0a 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  ..  if( 0==sqlit
0720: 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64  e3ThreadDataRead
0730: 4f 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61 72 65  Only()->useShare
0740: 64 44 61 74 61 20 7c 7c 20 69 44 62 3c 30 20 29  dData || iDb<0 )
0750: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
0760: 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  }..  for(i=0; i<
0770: 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f  pParse->nTableLo
0780: 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  ck; i++){.    p 
0790: 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c  = &pParse->aTabl
07a0: 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69 66  eLock[i];.    if
07b0: 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26 26  ( p->iDb==iDb &&
07c0: 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20 29   p->iTab==iTab )
07d0: 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72 69  {.      p->isWri
07e0: 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73 57  teLock = (p->isW
07f0: 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57 72  riteLock || isWr
0800: 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  iteLock);.      
0810: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
0820: 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73 69  }..  nBytes = si
0830: 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29 20  zeof(TableLock) 
0840: 2a 20 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c  * (pParse->nTabl
0850: 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20 73 71 6c 69  eLock+1);.  sqli
0860: 74 65 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  teReallocOrFree(
0870: 28 76 6f 69 64 20 2a 2a 29 26 70 50 61 72 73 65  (void **)&pParse
0880: 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42  ->aTableLock, nB
0890: 79 74 65 73 29 3b 0a 20 20 69 66 28 20 70 50 61  ytes);.  if( pPa
08a0: 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  rse->aTableLock 
08b0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72  ){.    p = &pPar
08c0: 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 70  se->aTableLock[p
08d0: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
08e0: 6b 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62  k++];.    p->iDb
08f0: 20 3d 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69   = iDb;.    p->i
0900: 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Tab = iTab;.    
0910: 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d  p->isWriteLock =
0920: 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20   isWriteLock;.  
0930: 20 20 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61    p->zName = zNa
0940: 6d 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  me;.  }.}../*.**
0950: 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 61 62 6c   Code an OP_Tabl
0960: 65 4c 6f 63 6b 20 69 6e 73 74 72 75 63 74 69 6f  eLock instructio
0970: 6e 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  n for each table
0980: 20 6c 6f 63 6b 65 64 20 62 79 20 74 68 65 0a 2a   locked by the.*
0990: 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 63 6f 6e  * statement (con
09a0: 66 69 67 75 72 65 64 20 62 79 20 63 61 6c 6c 73  figured by calls
09b0: 20 74 6f 20 73 71 6c 69 74 65 33 54 61 62 6c 65   to sqlite3Table
09c0: 4c 6f 63 6b 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  Lock())..*/.stat
09d0: 69 63 20 76 6f 69 64 20 63 6f 64 65 54 61 62 6c  ic void codeTabl
09e0: 65 4c 6f 63 6b 73 28 50 61 72 73 65 20 2a 70 50  eLocks(Parse *pP
09f0: 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  arse){.  int i;.
0a00: 20 20 56 64 62 65 20 2a 70 56 64 62 65 3b 20 0a    Vdbe *pVdbe; .
0a10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
0a20: 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f  3ThreadDataReadO
0a30: 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61 72 65 64  nly()->useShared
0a40: 44 61 74 61 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Data || pParse->
0a50: 6e 54 61 62 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  nTableLock==0 );
0a60: 0a 0a 20 20 69 66 28 20 30 3d 3d 28 70 56 64 62  ..  if( 0==(pVdb
0a70: 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  e = sqlite3GetVd
0a80: 62 65 28 70 50 61 72 73 65 29 29 20 29 7b 0a 20  be(pParse)) ){. 
0a90: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
0aa0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
0ab0: 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b  rse->nTableLock;
0ac0: 20 69 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65   i++){.    Table
0ad0: 4c 6f 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73  Lock *p = &pPars
0ae0: 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d  e->aTableLock[i]
0af0: 3b 0a 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70  ;.    int p1 = p
0b00: 2d 3e 69 44 62 3b 0a 20 20 20 20 69 66 28 20 70  ->iDb;.    if( p
0b10: 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 29 7b  ->isWriteLock ){
0b20: 0a 20 20 20 20 20 20 70 31 20 3d 20 2d 31 2a 28  .      p1 = -1*(
0b30: 70 31 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p1+1);.    }.   
0b40: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
0b50: 70 56 64 62 65 2c 20 4f 50 5f 54 61 62 6c 65 4c  pVdbe, OP_TableL
0b60: 6f 63 6b 2c 20 70 31 2c 20 70 2d 3e 69 54 61 62  ock, p1, p->iTab
0b70: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  , p->zName, P3_S
0b80: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0b90: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ba0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0bb0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
0bc0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
0bd0: 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69 6e  lled after a sin
0be0: 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  gle SQL statemen
0bf0: 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61  t has been.** pa
0c00: 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45 20  rsed and a VDBE 
0c10: 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75  program to execu
0c20: 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  te that statemen
0c30: 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72  t has been.** pr
0c40: 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72 6f  epared.  This ro
0c50: 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20 66  utine puts the f
0c60: 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65 73  inishing touches
0c70: 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 20   on the.** VDBE 
0c80: 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73 65  program and rese
0c90: 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73 74  ts the pParse st
0ca0: 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20  ructure for the 
0cb0: 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a  next.** parse..*
0cc0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
0cd0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
0ce0: 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62 65  red, it might be
0cf0: 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a   the case that.*
0d00: 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20 77  * no VDBE code w
0d10: 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f  as generated..*/
0d20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69 6e  .void sqlite3Fin
0d30: 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65 20  ishCoding(Parse 
0d40: 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
0d50: 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
0d60: 2a 76 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  *v;..  if( sqlit
0d70: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
0d80: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
0d90: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20   pParse->nested 
0da0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
0db0: 21 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29  !pParse->pVdbe )
0dc0: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
0dd0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
0de0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  && pParse->nErr 
0df0: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
0e00: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
0e10: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OR;.    }.    re
0e20: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
0e30: 42 65 67 69 6e 20 62 79 20 67 65 6e 65 72 61 74  Begin by generat
0e40: 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61  ing some termina
0e50: 74 69 6f 6e 20 63 6f 64 65 20 61 74 20 74 68 65  tion code at the
0e60: 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a   end of the.  **
0e70: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 0a 20 20   vdbe program.  
0e80: 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
0e90: 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73 71 6c 69  ->db;.  v = sqli
0ea0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
0eb0: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
0ec0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
0ed0: 64 4f 70 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  dOp(v, OP_Halt, 
0ee0: 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  0, 0);..    /* T
0ef0: 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63  he cookie mask c
0f00: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74 20  ontains one bit 
0f10: 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73  for each databas
0f20: 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20  e file open..   
0f30: 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66 6f   ** (Bit 0 is fo
0f40: 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69 73  r main, bit 1 is
0f50: 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20 73   for temp, and s
0f60: 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73 20  o forth.)  Bits 
0f70: 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 66  are.    ** set f
0f80: 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65  or each database
0f90: 20 74 68 61 74 20 69 73 20 75 73 65 64 2e 20 20   that is used.  
0fa0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
0fb0: 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a 20   start a.    ** 
0fc0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65  transaction on e
0fd0: 61 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73  ach used databas
0fe0: 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79 20  e and to verify 
0ff0: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
1000: 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68  e.    ** on each
1010: 20 75 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a   used database..
1020: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1030: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
1040: 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 33 32  o>0 ){.      u32
1050: 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69 6e 74   mask;.      int
1060: 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71 6c 69   iDb;.      sqli
1070: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1080: 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  v, pParse->cooki
1090: 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20 20 20  eGoto-1);.      
10a0: 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d  for(iDb=0, mask=
10b0: 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  1; iDb<db->nDb; 
10c0: 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29  mask<<=1, iDb++)
10d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
10e0: 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 63 6f  ask & pParse->co
10f0: 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63  okieMask)==0 ) c
1100: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1110: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1120: 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  p(v, OP_Transact
1130: 69 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20  ion, iDb, (mask 
1140: 26 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d  & pParse->writeM
1150: 61 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20  ask)!=0);.      
1160: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1170: 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43  Op(v, OP_VerifyC
1180: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50 61 72  ookie, iDb, pPar
1190: 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b  se->cookieValue[
11a0: 69 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  iDb]);.      }..
11b0: 20 20 20 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c        /* Once al
11c0: 6c 20 74 68 65 20 63 6f 6f 6b 69 65 73 20 68 61  l the cookies ha
11d0: 76 65 20 62 65 65 6e 20 76 65 72 69 66 69 65 64  ve been verified
11e0: 20 61 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   and transaction
11f0: 73 20 6f 70 65 6e 65 64 2c 20 0a 20 20 20 20 20  s opened, .     
1200: 20 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 72   ** obtain the r
1210: 65 71 75 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f  equired table-lo
1220: 63 6b 73 2e 20 54 68 69 73 20 69 73 20 61 20 6e  cks. This is a n
1230: 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 74 68 65 20  o-op unless the 
1240: 0a 20 20 20 20 20 20 2a 2a 20 73 68 61 72 65 64  .      ** shared
1250: 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20 69  -cache feature i
1260: 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20  s enabled..     
1270: 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 54 61   */.      codeTa
1280: 62 6c 65 4c 6f 63 6b 73 28 70 50 61 72 73 65 29  bleLocks(pParse)
1290: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
12a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
12b0: 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  oto, 0, pParse->
12c0: 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b 0a 20 20 20  cookieGoto);.   
12d0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
12e0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20  TE_OMIT_TRACE.  
12f0: 20 20 2f 2a 20 41 64 64 20 61 20 4e 6f 2d 6f 70    /* Add a No-op
1300: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
1310: 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
1320: 20 6f 66 20 74 68 65 20 63 6f 6d 70 69 6c 65 64   of the compiled
1330: 20 53 51 4c 0a 20 20 20 20 2a 2a 20 73 74 61 74   SQL.    ** stat
1340: 65 6d 65 6e 74 20 61 73 20 69 74 73 20 50 33 20  ement as its P3 
1350: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20  argument.  This 
1360: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
1370: 74 68 65 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  the functionalit
1380: 79 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  y.    ** of the 
1390: 70 72 6f 67 72 61 6d 2e 20 0a 20 20 20 20 2a 2a  program. .    **
13a0: 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
13b0: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
13c0: 74 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28  t sqlite3_trace(
13d0: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  )..    */.    sq
13e0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
13f0: 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20 70  OP_Noop, 0, 0, p
1400: 50 61 72 73 65 2d 3e 7a 53 71 6c 2c 20 70 50 61  Parse->zSql, pPa
1410: 72 73 65 2d 3e 7a 54 61 69 6c 2d 70 50 61 72 73  rse->zTail-pPars
1420: 65 2d 3e 7a 53 71 6c 29 3b 0a 23 65 6e 64 69 66  e->zSql);.#endif
1430: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1440: 54 52 41 43 45 20 2a 2f 0a 20 20 7d 0a 0a 0a 20  TRACE */.  }... 
1450: 20 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45   /* Get the VDBE
1460: 20 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66   program ready f
1470: 6f 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a  or execution.  *
1480: 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61  /.  if( v && pPa
1490: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
14a0: 20 20 20 20 46 49 4c 45 20 2a 74 72 61 63 65 20      FILE *trace 
14b0: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
14c0: 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 29  QLITE_VdbeTrace)
14d0: 21 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a 20 30  !=0 ? stdout : 0
14e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14f0: 65 54 72 61 63 65 28 76 2c 20 74 72 61 63 65 29  eTrace(v, trace)
1500: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1510: 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70 50  eMakeReady(v, pP
1520: 61 72 73 65 2d 3e 6e 56 61 72 2c 20 70 50 61 72  arse->nVar, pPar
1530: 73 65 2d 3e 6e 4d 65 6d 2b 33 2c 0a 20 20 20 20  se->nMem+3,.    
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1550: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
1560: 62 2b 33 2c 20 70 50 61 72 73 65 2d 3e 65 78 70  b+3, pParse->exp
1570: 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50 61 72 73  lain);.    pPars
1580: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44  e->rc = SQLITE_D
1590: 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ONE;.    pParse-
15a0: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30  >colNamesSet = 0
15b0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
15c0: 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  arse->rc==SQLITE
15d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 72 73  _OK ){.    pPars
15e0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
15f0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72  RROR;.  }.  pPar
1600: 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20  se->nTab = 0;.  
1610: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30  pParse->nMem = 0
1620: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74  ;.  pParse->nSet
1630: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
1640: 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72  nVar = 0;.  pPar
1650: 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d  se->cookieMask =
1660: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   0;.  pParse->co
1670: 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a  okieGoto = 0;.}.
1680: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70  ./*.** Run the p
1690: 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67  arser and code g
16a0: 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69  enerator recursi
16b0: 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  vely in order to
16c0: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64   generate.** cod
16d0: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74  e for the SQL st
16e0: 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e  atement given on
16f0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1700: 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74  e pParse context
1710: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
1720: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1730: 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73  .  When the pars
1740: 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73  er is run recurs
1750: 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61  ively.** this wa
1760: 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f  y, the final OP_
1770: 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65  Halt is not appe
1780: 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69  nded and other i
1790: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a  nitialization.**
17a0: 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f   and finalizatio
17b0: 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74  n steps are omit
17c0: 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73  ted because thos
17d0: 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62  e are handling b
17e0: 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f  y the.** outermo
17f0: 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a  st parser..**.**
1800: 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20   Not everything 
1810: 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68  is nestable.  Th
1820: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64  is facility is d
1830: 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69  esigned to permi
1840: 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44  t.** INSERT, UPD
1850: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20  ATE, and DELETE 
1860: 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e  operations again
1870: 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  st SQLITE_MASTER
1880: 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69  .  Use.** care i
1890: 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20  f you decide to 
18a0: 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20  try to use this 
18b0: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65  routine for some
18c0: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e   other purposes.
18d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18e0: 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73  NestedParse(Pars
18f0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1900: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
1910: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1920: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ap;.  char *zSql
1930: 3b 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45 5f  ;.# define SAVE_
1940: 53 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72 73  SZ  (sizeof(Pars
1950: 65 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50 61  e) - offsetof(Pa
1960: 72 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68 61  rse,nVar)).  cha
1970: 72 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f 53  r saveBuf[SAVE_S
1980: 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Z];..  if( pPars
1990: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
19a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
19b0: 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b  se->nested<10 );
19c0: 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f    /* Nesting sho
19d0: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c  uld only be of l
19e0: 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a  imited depth */.
19f0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
1a00: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20  Format);.  zSql 
1a10: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
1a20: 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  f(zFormat, ap);.
1a30: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
1a40: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
1a50: 20 20 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20     return;   /* 
1a60: 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  A malloc must ha
1a70: 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d  ve failed */.  }
1a80: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  .  pParse->neste
1a90: 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61  d++;.  memcpy(sa
1aa0: 76 65 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e  veBuf, &pParse->
1ab0: 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  nVar, SAVE_SZ);.
1ac0: 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65    memset(&pParse
1ad0: 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f  ->nVar, 0, SAVE_
1ae0: 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75  SZ);.  sqlite3Ru
1af0: 6e 50 61 72 73 65 72 28 70 50 61 72 73 65 2c 20  nParser(pParse, 
1b00: 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 73 71 6c 69  zSql, 0);.  sqli
1b10: 74 65 46 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  teFree(zSql);.  
1b20: 6d 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e  memcpy(&pParse->
1b30: 6e 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53  nVar, saveBuf, S
1b40: 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73  AVE_SZ);.  pPars
1b50: 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a  e->nested--;.}..
1b60: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
1b70: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
1b80: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
1b90: 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  bes a particular
1ba0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62   database.** tab
1bb0: 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  le given the nam
1bc0: 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  e of that table 
1bd0: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
1be0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1bf0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
1c00: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
1c10: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
1c20: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
1c30: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
1c40: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
1c50: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
1c60: 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  d for the table 
1c70: 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  and the.** first
1c80: 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20   matching table 
1c90: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
1ca0: 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64  o checking for d
1cb0: 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a  uplicate table.*
1cc0: 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  * names is done.
1cd0: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
1ce0: 64 65 72 20 69 73 20 54 45 4d 50 20 66 69 72 73  der is TEMP firs
1cf0: 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68  t, then MAIN, th
1d00: 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69  en any.** auxili
1d10: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
1d20: 64 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54  ded using the AT
1d30: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  TACH command..**
1d40: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
1d50: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
1d60: 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  )..*/.Table *sql
1d70: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71  ite3FindTable(sq
1d80: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
1d90: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
1da0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62  nst char *zDatab
1db0: 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ase){.  Table *p
1dc0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
1dd0: 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d   assert( zName!=
1de0: 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49  0 );.  for(i=OMI
1df0: 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e  T_TEMPDB; i<db->
1e00: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
1e10: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
1e20: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
1e30: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
1e40: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
1e50: 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20  zDatabase!=0 && 
1e60: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1e70: 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44  Database, db->aD
1e80: 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f  b[j].zName) ) co
1e90: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20  ntinue;.    p = 
1ea0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
1eb0: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68  &db->aDb[j].pSch
1ec0: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e  ema->tblHash, zN
1ed0: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
1ee0: 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70  e)+1);.    if( p
1ef0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
1f00: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
1f10: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
1f20: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
1f30: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
1f40: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
1f50: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
1f60: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
1f70: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
1f80: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
1f90: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
1fa0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
1fb0: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
1fc0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
1fd0: 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f  not found.  Also
1fe0: 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72   leave an.** err
1ff0: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
2000: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
2010: 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
2020: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
2030: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c   routine and sql
2040: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20  ite3FindTable() 
2050: 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
2060: 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61  routine leaves a
2070: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2080: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
2090: 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69  sg where.** sqli
20a0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64  te3FindTable() d
20b0: 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c  oes not..*/.Tabl
20c0: 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  e *sqlite3Locate
20d0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
20e0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
20f0: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
2100: 61 72 20 2a 7a 44 62 61 73 65 29 7b 0a 20 20 54  ar *zDbase){.  T
2110: 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52  able *p;..  /* R
2120: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
2130: 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
2140: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
2150: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
2160: 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
2170: 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
2180: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
2190: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
21a0: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
21b0: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
21c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
21d0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69  .  p = sqlite3Fi
21e0: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
21f0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73  db, zName, zDbas
2200: 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  e);.  if( p==0 )
2210: 7b 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73 65  {.    if( zDbase
2220: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2230: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2240: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
2250: 3a 20 25 73 2e 25 73 22 2c 20 7a 44 62 61 73 65  : %s.%s", zDbase
2260: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  , zName);.    }e
2270: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2280: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2290: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
22a0: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
22b0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
22c0: 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
22d0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
22e0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
22f0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
2300: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2310: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
2320: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
2330: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
2340: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a  of that index.**
2350: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   and the name of
2360: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
2370: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
2380: 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e  index..** Return
2390: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
23a0: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
23b0: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
23c0: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
23d0: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a  earched for the.
23e0: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  ** table and the
23f0: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
2400: 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65  index is returne
2410: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
2420: 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74  .** for duplicat
2430: 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73  e index names is
2440: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
2450: 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20  rch order is.** 
2460: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
2470: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20   MAIN, then any 
2480: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
2490: 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69  ses added.** usi
24a0: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
24b0: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20  mmand..*/.Index 
24c0: 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65  *sqlite3FindInde
24d0: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  x(sqlite3 *db, c
24e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
24f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
2500: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  b){.  Index *p =
2510: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
2520: 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42  or(i=OMIT_TEMPDB
2530: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
2540: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  ){.    int j = (
2550: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
2560: 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20   /* Search TEMP 
2570: 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20  before MAIN */. 
2580: 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
2590: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  ma = db->aDb[j].
25a0: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28  pSchema;.    if(
25b0: 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53   zDb && sqlite3S
25c0: 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e  trICmp(zDb, db->
25d0: 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20  aDb[j].zName) ) 
25e0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
25f0: 73 65 72 74 28 20 70 53 63 68 65 6d 61 20 7c 7c  sert( pSchema ||
2600: 20 28 6a 3d 3d 31 20 26 26 20 21 64 62 2d 3e 61   (j==1 && !db->a
2610: 44 62 5b 31 5d 2e 70 42 74 29 20 29 3b 0a 20 20  Db[1].pBt) );.  
2620: 20 20 69 66 28 20 70 53 63 68 65 6d 61 20 29 7b    if( pSchema ){
2630: 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74  .      p = sqlit
2640: 65 33 48 61 73 68 46 69 6e 64 28 26 70 53 63 68  e3HashFind(&pSch
2650: 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e  ema->idxHash, zN
2660: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
2670: 65 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e)+1);.    }.   
2680: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
2690: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
26a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d  }../*.** Reclaim
26b0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64   the memory used
26c0: 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a   by an index.*/.
26d0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
26e0: 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 29 7b  Index(Index *p){
26f0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d  .  sqliteFree(p-
2700: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
2710: 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f  iteFree(p);.}../
2720: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
2730: 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d  given index from
2740: 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20   the index hash 
2750: 74 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a  table, and free.
2760: 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74  ** its memory st
2770: 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  ructures..**.** 
2780: 54 68 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d  The index is rem
2790: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  oved from the da
27a0: 74 61 62 61 73 65 20 68 61 73 68 20 74 61 62 6c  tabase hash tabl
27b0: 65 73 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20  es but.** it is 
27c0: 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  not unlinked fro
27d0: 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68 61 74  m the Table that
27e0: 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20   it indexes..** 
27f0: 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74  Unlinking from t
2800: 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65  he Table must be
2810: 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c   done by the cal
2820: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
2830: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
2840: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
2850: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64  sqlite3 *db, Ind
2860: 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20  ex *p){.  Index 
2870: 2a 70 4f 6c 64 3b 0a 20 20 63 6f 6e 73 74 20 63  *pOld;.  const c
2880: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e  har *zName = p->
2890: 7a 4e 61 6d 65 3b 0a 0a 20 20 70 4f 6c 64 20 3d  zName;..  pOld =
28a0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
28b0: 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e  rt(&p->pSchema->
28c0: 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  idxHash, zName, 
28d0: 73 74 72 6c 65 6e 28 20 7a 4e 61 6d 65 29 2b 31  strlen( zName)+1
28e0: 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
28f0: 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d  pOld==0 || pOld=
2900: 3d 70 20 29 3b 0a 20 20 66 72 65 65 49 6e 64 65  =p );.  freeInde
2910: 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  x(p);.}../*.** F
2920: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c  or the index cal
2930: 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69  led zIdxName whi
2940: 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  ch is found in t
2950: 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c  he database iDb,
2960: 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20  .** unlike that 
2970: 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54  index from its T
2980: 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65  able then remove
2990: 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a   the index from.
29a0: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  ** the index has
29b0: 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65  h table and free
29c0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75   all memory stru
29d0: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
29e0: 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  d.** with the in
29f0: 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  dex..*/.void sql
2a00: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
2a10: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  eteIndex(sqlite3
2a20: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
2a30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e  onst char *zIdxN
2a40: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
2a50: 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c 65 6e  Index;.  int len
2a60: 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 20  ;.  Hash *pHash 
2a70: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  = &db->aDb[iDb].
2a80: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
2a90: 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  ;..  len = strle
2aa0: 6e 28 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70  n(zIdxName);.  p
2ab0: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 48  Index = sqlite3H
2ac0: 61 73 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c  ashInsert(pHash,
2ad0: 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31   zIdxName, len+1
2ae0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  , 0);.  if( pInd
2af0: 65 78 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ex ){.    if( pI
2b00: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
2b10: 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  ndex==pIndex ){.
2b20: 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54        pIndex->pT
2b30: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70  able->pIndex = p
2b40: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
2b50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
2b60: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 66  ndex *p;.      f
2b70: 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61  or(p=pIndex->pTa
2b80: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  ble->pIndex; p &
2b90: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
2ba0: 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b  ex; p=p->pNext){
2bb0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20 26 26  }.      if( p &&
2bc0: 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65   p->pNext==pInde
2bd0: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  x ){.        p->
2be0: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
2bf0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
2c00: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64     }.    freeInd
2c10: 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  ex(pIndex);.  }.
2c20: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
2c30: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
2c40: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  ges;.}../*.** Er
2c50: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
2c60: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
2c70: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
2c80: 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20  sh tables of.** 
2c90: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
2ca0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
2cb0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
2cc0: 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20  claim memory.** 
2cd0: 62 65 66 6f 72 65 20 74 68 65 20 64 61 74 61 62  before the datab
2ce0: 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49 74 20  ase closes.  It 
2cf0: 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64  is also called d
2d00: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
2d10: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72  .** if there wer
2d20: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
2d30: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
2d40: 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a  saction or if a.
2d50: 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65  ** schema-cookie
2d60: 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75 72 73   mismatch occurs
2d70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 3d  ..**.** If iDb<=
2d80: 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65  0 then reset the
2d90: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
2da0: 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20   tables for all 
2db0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
2dc0: 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20 74 68  s.  If iDb>=2 th
2dd0: 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74  en reset the int
2de0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72  ernal schema for
2df0: 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e   only the.** sin
2e00: 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74  gle file indicat
2e10: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
2e20: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
2e30: 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a  Schema(sqlite3 *
2e40: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
2e50: 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73 73  int i, j;..  ass
2e60: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
2e70: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
2e80: 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d  for(i=iDb; i<db-
2e90: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
2ea0: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
2eb0: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
2ec0: 44 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Db->pSchema ){. 
2ed0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65       sqlite3Sche
2ee0: 6d 61 46 72 65 65 28 70 44 62 2d 3e 70 53 63 68  maFree(pDb->pSch
2ef0: 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ema);.    }.    
2f00: 69 66 28 20 69 44 62 3e 30 20 29 20 72 65 74 75  if( iDb>0 ) retu
2f10: 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
2f20: 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62  ( iDb==0 );.  db
2f30: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
2f40: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
2f50: 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f  ;..  /* If one o
2f60: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 61 75  r more of the au
2f70: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2f80: 20 66 69 6c 65 73 20 68 61 73 20 62 65 65 6e 20   files has been 
2f90: 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65  closed,.  ** the
2fa0: 6e 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72  n remove them fr
2fb0: 6f 6d 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  om the auxiliary
2fc0: 20 64 61 74 61 62 61 73 65 20 6c 69 73 74 2e 20   database list. 
2fd0: 20 57 65 20 74 61 6b 65 20 74 68 65 0a 20 20 2a   We take the.  *
2fe0: 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  * opportunity to
2ff0: 20 64 6f 20 74 68 69 73 20 68 65 72 65 20 73 69   do this here si
3000: 6e 63 65 20 77 65 20 68 61 76 65 20 6a 75 73 74  nce we have just
3010: 20 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20   deleted all of 
3020: 74 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20  the.  ** schema 
3030: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
3040: 74 68 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74  therefore do not
3050: 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e   have to make an
3060: 79 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74  y changes.  ** t
3070: 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 74  o any of those t
3080: 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ables..  */.  fo
3090: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
30a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
30b0: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
30c0: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
30d0: 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b  ( pDb->pBt==0 ){
30e0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
30f0: 70 41 75 78 20 26 26 20 70 44 62 2d 3e 78 46 72  pAux && pDb->xFr
3100: 65 65 41 75 78 20 29 20 70 44 62 2d 3e 78 46 72  eeAux ) pDb->xFr
3110: 65 65 41 75 78 28 70 44 62 2d 3e 70 41 75 78 29  eeAux(pDb->pAux)
3120: 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 41 75  ;.      pDb->pAu
3130: 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
3140: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
3150: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3160: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
3170: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
3180: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
3190: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
31a0: 6c 69 74 65 46 72 65 65 28 70 44 62 2d 3e 7a 4e  liteFree(pDb->zN
31b0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  ame);.      pDb-
31c0: 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  >zName = 0;.    
31d0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
31e0: 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b  }.    if( j<i ){
31f0: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a  .      db->aDb[j
3200: 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a  ] = db->aDb[i];.
3210: 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20      }.    j++;. 
3220: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d   }.  memset(&db-
3230: 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d  >aDb[j], 0, (db-
3240: 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64  >nDb-j)*sizeof(d
3250: 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64  b->aDb[j]));.  d
3260: 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66  b->nDb = j;.  if
3270: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20  ( db->nDb<=2 && 
3280: 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62  db->aDb!=db->aDb
3290: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65  Static ){.    me
32a0: 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74  mcpy(db->aDbStat
32b0: 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73  ic, db->aDb, 2*s
32c0: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d  izeof(db->aDb[0]
32d0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ));.    sqliteFr
32e0: 65 65 28 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20  ee(db->aDb);.   
32f0: 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
3300: 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a  DbStatic;.  }.}.
3310: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3320: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
3330: 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63  enever a rollbac
3340: 6b 20 6f 63 63 75 72 73 2e 20 20 49 66 20 74 68  k occurs.  If th
3350: 65 72 65 20 77 65 72 65 0a 2a 2a 20 73 63 68 65  ere were.** sche
3360: 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e  ma changes durin
3370: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
3380: 6e 2c 20 74 68 65 6e 20 77 65 20 68 61 76 65 20  n, then we have 
3390: 74 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20  to reset the.** 
33a0: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
33b0: 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f 61 64 20  bles and reload 
33c0: 74 68 65 6d 20 66 72 6f 6d 20 64 69 73 6b 2e 0a  them from disk..
33d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
33e0: 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43  ollbackInternalC
33f0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
3400: 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66  db){.  if( db->f
3410: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
3420: 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20  ternChanges ){. 
3430: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
3440: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
3450: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
3460: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3470: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
3480: 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a   commit occurs..
3490: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
34a0: 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
34b0: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
34c0: 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  ){.  db->flags &
34d0: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
34e0: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
34f0: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
3500: 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 61 20  mn names from a 
3510: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2e 0a 2a  table or view..*
3520: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
3530: 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e  liteResetColumnN
3540: 61 6d 65 73 28 54 61 62 6c 65 20 2a 70 54 61 62  ames(Table *pTab
3550: 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  le){.  int i;.  
3560: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
3570: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d  assert( pTable!=
3580: 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c  0 );.  if( (pCol
3590: 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29   = pTable->aCol)
35a0: 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  !=0 ){.    for(i
35b0: 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  =0; i<pTable->nC
35c0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
35d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
35e0: 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  ee(pCol->zName);
35f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
3600: 70 72 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70  prDelete(pCol->p
3610: 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Dflt);.      sql
3620: 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54  iteFree(pCol->zT
3630: 79 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ype);.      sqli
3640: 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 43 6f  teFree(pCol->zCo
3650: 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ll);.    }.    s
3660: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
3670: 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 70  ->aCol);.  }.  p
3680: 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b  Table->aCol = 0;
3690: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
36a0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  = 0;.}../*.** Re
36b0: 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  move the memory 
36c0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
36d0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
36e0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62  the given.** Tab
36f0: 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20  le.  No changes 
3700: 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b  are made to disk
3710: 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
3720: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3730: 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65  tine just delete
3740: 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63  s the data struc
3750: 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e  ture.  It does n
3760: 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65  ot unlink.** the
3770: 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75   table data stru
3780: 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68  cture from the h
3790: 61 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f 72 20  ash table.  Nor 
37a0: 64 6f 65 73 20 69 74 20 72 65 6d 6f 76 65 0a 2a  does it remove.*
37b0: 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 66  * foreign keys f
37c0: 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 2e 61  rom the sqlite.a
37d0: 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65 2e  FKey hash table.
37e0: 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65    But it does de
37f0: 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20  stroy.** memory 
3800: 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68  structures of th
3810: 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f  e indices and fo
3820: 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63  reign keys assoc
3830: 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74  iated with .** t
3840: 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
3850: 49 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  Indices associat
3860: 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
3870: 65 20 61 72 65 20 75 6e 6c 69 6e 6b 65 64 20 66  e are unlinked f
3880: 72 6f 6d 20 74 68 65 20 22 64 62 22 0a 2a 2a 20  rom the "db".** 
3890: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69  data structure i
38a0: 66 20 64 62 21 3d 4e 55 4c 4c 2e 20 20 49 66 20  f db!=NULL.  If 
38b0: 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63 65  db==NULL, indice
38c0: 73 20 61 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a  s attached to.**
38d0: 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 64   the table are d
38e0: 65 6c 65 74 65 64 2c 20 62 75 74 20 69 74 20 69  eleted, but it i
38f0: 73 20 61 73 73 75 6d 65 64 20 74 68 65 79 20 68  s assumed they h
3900: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
3910: 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f  .** unlinked..*/
3920: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c  .void sqlite3Del
3930: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
3940: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
3950: 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ble){.  Index *p
3960: 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20  Index, *pNext;. 
3970: 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c 20 2a 70   FKey *pFKey, *p
3980: 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20 64 62 20  NextFKey;..  db 
3990: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  = 0;..  if( pTab
39a0: 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  le==0 ) return;.
39b0: 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c  .  /* Do not del
39c0: 65 74 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e  ete the table un
39d0: 74 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63  til the referenc
39e0: 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  e count reaches 
39f0: 7a 65 72 6f 2e 20 2a 2f 0a 20 20 70 54 61 62 6c  zero. */.  pTabl
3a00: 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
3a10: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3e 30 20   pTable->nRef>0 
3a20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
3a30: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61   }.  assert( pTa
3a40: 62 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  ble->nRef==0 );.
3a50: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c  .  /* Delete all
3a60: 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
3a70: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61  ted with this ta
3a80: 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  ble.  */.  for(p
3a90: 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e  Index = pTable->
3aa0: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
3ab0: 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20  pIndex=pNext){. 
3ac0: 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65     pNext = pInde
3ad0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73  x->pNext;.    as
3ae0: 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53  sert( pIndex->pS
3af0: 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70  chema==pTable->p
3b00: 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71  Schema );.    sq
3b10: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
3b20: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d  db, pIndex);.  }
3b30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3b40: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
3b50: 59 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  Y.  /* Delete al
3b60: 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  l foreign keys a
3b70: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
3b80: 68 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65 20  his table.  The 
3b90: 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  keys.  ** should
3ba0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
3bb0: 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d  en unlinked from
3bc0: 20 74 68 65 20 64 62 2d 3e 61 46 4b 65 79 20 68   the db->aFKey h
3bd0: 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a  ash table .  */.
3be0: 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62    for(pFKey=pTab
3bf0: 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79  le->pFKey; pFKey
3c00: 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65  ; pFKey=pNextFKe
3c10: 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65  y){.    pNextFKe
3c20: 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  y = pFKey->pNext
3c30: 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  From;.    assert
3c40: 28 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  ( sqlite3HashFin
3c50: 64 28 26 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  d(&pTable->pSche
3c60: 6d 61 2d 3e 61 46 4b 65 79 2c 0a 20 20 20 20 20  ma->aFKey,.     
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c80: 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f        pFKey->zTo
3c90: 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e  , strlen(pFKey->
3ca0: 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20 29  zTo)+1)!=pFKey )
3cb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
3cc0: 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e  (pFKey);.  }.#en
3cd0: 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  dif..  /* Delete
3ce0: 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
3cf0: 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  ture itself..  *
3d00: 2f 0a 20 20 73 71 6c 69 74 65 52 65 73 65 74 43  /.  sqliteResetC
3d10: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 6c  olumnNames(pTabl
3d20: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
3d30: 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b  (pTable->zName);
3d40: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
3d50: 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  able->zColAff);.
3d60: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
3d70: 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53  elete(pTable->pS
3d80: 65 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20  elect);.#ifndef 
3d90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
3da0: 4b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  K.  sqlite3ExprD
3db0: 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 43  elete(pTable->pC
3dc0: 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20  heck);.#endif.  
3dd0: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
3de0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  e);.}../*.** Unl
3df0: 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61  ink the given ta
3e00: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73  ble from the has
3e10: 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65  h tables and the
3e20: 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74   delete the.** t
3e30: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77  able structure w
3e40: 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69  ith all its indi
3e50: 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20  ces and foreign 
3e60: 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  keys..*/.void sq
3e70: 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
3e80: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
3e90: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
3ea0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
3eb0: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
3ec0: 70 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20  p;.  FKey *pF1, 
3ed0: 2a 70 46 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b  *pF2;.  Db *pDb;
3ee0: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
3ef0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
3f00: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
3f10: 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
3f20: 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a 54  ( zTabName && zT
3f30: 61 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70  abName[0] );.  p
3f40: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
3f50: 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  b];.  p = sqlite
3f60: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
3f70: 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
3f80: 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 73 74  sh, zTabName, st
3f90: 72 6c 65 6e 28 7a 54 61 62 4e 61 6d 65 29 2b 31  rlen(zTabName)+1
3fa0: 2c 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ,0);.  if( p ){.
3fb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3fc0: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
3fd0: 20 20 20 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70      for(pF1=p->p
3fe0: 46 4b 65 79 3b 20 70 46 31 3b 20 70 46 31 3d 70  FKey; pF1; pF1=p
3ff0: 46 31 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a  F1->pNextFrom){.
4000: 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20        int nTo = 
4010: 73 74 72 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29  strlen(pF1->zTo)
4020: 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 32 20   + 1;.      pF2 
4030: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
4040: 64 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  d(&pDb->pSchema-
4050: 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f  >aFKey, pF1->zTo
4060: 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 69 66  , nTo);.      if
4070: 28 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20  ( pF2==pF1 ){.  
4080: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73        sqlite3Has
4090: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
40a0: 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46  chema->aFKey, pF
40b0: 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31  1->zTo, nTo, pF1
40c0: 2d 3e 70 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20  ->pNextTo);.    
40d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
40e0: 20 77 68 69 6c 65 28 20 70 46 32 20 26 26 20 70   while( pF2 && p
40f0: 46 32 2d 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31  F2->pNextTo!=pF1
4100: 20 29 7b 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65   ){ pF2=pF2->pNe
4110: 78 74 54 6f 3b 20 7d 0a 20 20 20 20 20 20 20 20  xtTo; }.        
4120: 69 66 28 20 70 46 32 20 29 7b 0a 20 20 20 20 20  if( pF2 ){.     
4130: 20 20 20 20 20 70 46 32 2d 3e 70 4e 65 78 74 54       pF2->pNextT
4140: 6f 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f  o = pF1->pNextTo
4150: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4160: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
4170: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
4180: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a  teTable(db, p);.
4190: 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20    }.  db->flags 
41a0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
41b0: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
41c0: 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c  * Given a token,
41d0: 20 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67   return a string
41e0: 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
41f0: 66 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  f the text of th
4200: 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69 74 68  at.** token with
4210: 20 61 6e 79 20 71 75 6f 74 61 74 69 6f 6e 73 20   any quotations 
4220: 72 65 6d 6f 76 65 64 2e 20 20 53 70 61 63 65 20  removed.  Space 
4230: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
4240: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
4250: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
4260: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
4270: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
4280: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
4290: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  ** function..**.
42a0: 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66  ** Tokens are of
42b0: 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72  ten just pointer
42c0: 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  s into the origi
42d0: 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64  nal SQL text and
42e0: 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c   so.** are not \
42f0: 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61  000 terminated a
4300: 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69  nd are not persi
4310: 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75  stent.  The retu
4320: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
4330: 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  s \000 terminate
4340: 64 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74  d and is persist
4350: 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  ent..*/.char *sq
4360: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
4370: 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  en(Token *pName)
4380: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
4390: 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
43a0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
43b0: 74 65 53 74 72 4e 44 75 70 28 28 63 68 61 72 2a  teStrNDup((char*
43c0: 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65  )pName->z, pName
43d0: 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ->n);.    sqlite
43e0: 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b  3Dequote(zName);
43f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e  .  }else{.    zN
4400: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
4410: 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a  eturn zName;.}..
4420: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73  /*.** Open the s
4430: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
4440: 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74  le stored in dat
4450: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62  abase number iDb
4460: 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e   for.** writing.
4470: 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70   The table is op
4480: 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f  ened using curso
4490: 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  r 0..*/.void sql
44a0: 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61  ite3OpenMasterTa
44b0: 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20 69 6e  ble(Parse *p, in
44c0: 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
44d0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
44e0: 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  be(p);.  sqlite3
44f0: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62  TableLock(p, iDb
4500: 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31  , MASTER_ROOT, 1
4510: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
4520: 44 62 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Db));.  sqlite3V
4530: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
4540: 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b  nteger, iDb, 0);
4550: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
4560: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
4570: 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52  ite, 0, MASTER_R
4580: 4f 4f 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  OOT);.  sqlite3V
4590: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
45a0: 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c  etNumColumns, 0,
45b0: 20 35 29 3b 20 2f 2a 20 73 71 6c 69 74 65 5f 6d   5); /* sqlite_m
45c0: 61 73 74 65 72 20 68 61 73 20 35 20 63 6f 6c 75  aster has 5 colu
45d0: 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mns */.}../*.** 
45e0: 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65  The token *pName
45f0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
4600: 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  me of a database
4610: 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20   (either "main" 
4620: 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20  or.** "temp" or 
4630: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61  the name of an a
4640: 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69  ttached db). Thi
4650: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
4660: 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f  s the.** index o
4670: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61  f the named data
4680: 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b  base in db->aDb[
4690: 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20  ], or -1 if the 
46a0: 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65  named db .** doe
46b0: 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a  s not exist..*/.
46c0: 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44  int sqlite3FindD
46d0: 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  b(sqlite3 *db, T
46e0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
46f0: 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 2f  int i = -1;    /
4700: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
4710: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  r */.  int n;   
4720: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4730: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
4740: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 44   the name */.  D
4750: 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 2f 2a  b *pDb;       /*
4760: 20 41 20 64 61 74 61 62 61 73 65 20 77 68 6f 73   A database whos
4770: 65 20 6e 61 6d 65 20 73 70 61 63 65 20 69 73 20  e name space is 
4780: 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 2a  being searched *
4790: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
47a0: 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72     /* Name we ar
47b0: 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  e searching for 
47c0: 2a 2f 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71  */..  zName = sq
47d0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
47e0: 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  en(pName);.  if(
47f0: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 6e 20   zName ){.    n 
4800: 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
4810: 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e  .    for(i=(db->
4820: 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d  nDb-1), pDb=&db-
4830: 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69  >aDb[i]; i>=0; i
4840: 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20  --, pDb--){.    
4850: 20 20 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d    if( (!OMIT_TEM
4860: 50 44 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26  PDB || i!=1 ) &&
4870: 20 6e 3d 3d 73 74 72 6c 65 6e 28 70 44 62 2d 3e   n==strlen(pDb->
4880: 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20  zName) && .     
4890: 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53       0==sqlite3S
48a0: 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d  trICmp(pDb->zNam
48b0: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
48c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
48d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
48e0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
48f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
4900: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65  .}../* The table
4910: 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67   or view or trig
4920: 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73  ger name is pass
4930: 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ed to this routi
4940: 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a  ne via tokens.**
4950: 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d   pName1 and pNam
4960: 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  e2. If the table
4970: 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20   name was fully 
4980: 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65  qualified, for e
4990: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52  xample:.**.** CR
49a0: 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79  EATE TABLE xxx.y
49b0: 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a  yy (...);.** .**
49c0: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
49d0: 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64  set to "xxx" and
49e0: 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f   pName2 "yyy". O
49f0: 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
4a00: 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   if.** the table
4a10: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c   name is not ful
4a20: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e  ly qualified, i.
4a30: 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45  e.:.**.** CREATE
4a40: 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b   TABLE yyy(...);
4a50: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d  .**.** Then pNam
4a60: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79  e1 is set to "yy
4a70: 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73  y" and pName2 is
4a80: 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   ""..**.** This 
4a90: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
4aa0: 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74   *ppUnqual point
4ab0: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
4ac0: 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31  he token (pName1
4ad0: 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74   or.** pName2) t
4ae0: 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75  hat stores the u
4af0: 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65  nqualified table
4b00: 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65   name.  The inde
4b10: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  x of the.** data
4b20: 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65  base "xxx" is re
4b30: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
4b40: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
4b50: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
4b60: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
4b70: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
4b80: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
4b90: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
4ba0: 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e1,      /* The 
4bb0: 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d  "xxx" in the nam
4bc0: 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22  e "xxx.yyy" or "
4bd0: 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  xxx" */.  Token 
4be0: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a  *pName2,      /*
4bf0: 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68   The "yyy" in th
4c00: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
4c10: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55   */.  Token **pU
4c20: 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69  nqual     /* Wri
4c30: 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  te the unqualifi
4c40: 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68  ed object name h
4c50: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
4c60: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
4c70: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
4c80: 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ase holding the 
4c90: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
4ca0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
4cb0: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 4e 61  ->db;..  if( pNa
4cc0: 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e  me2 && pName2->n
4cd0: 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
4ce0: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
4cf0: 20 29 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c   );.    *pUnqual
4d00: 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69   = pName2;.    i
4d10: 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
4d20: 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  Db(db, pName1);.
4d30: 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b      if( iDb<0 ){
4d40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
4d50: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
4d60: 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65  unknown database
4d70: 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20   %T", pName1);. 
4d80: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
4d90: 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r++;.      retur
4da0: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n -1;.    }.  }e
4db0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
4dc0: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30   db->init.iDb==0
4dd0: 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   || db->init.bus
4de0: 79 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64  y );.    iDb = d
4df0: 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20  b->init.iDb;.   
4e00: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
4e10: 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e1;.  }.  return
4e20: 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   iDb;.}../*.** T
4e30: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
4e40: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20  sed to check if 
4e50: 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67  the UTF-8 string
4e60: 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61   zName is a lega
4e70: 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64  l.** unqualified
4e80: 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20   name for a new 
4e90: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74  schema object (t
4ea0: 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65  able, index, vie
4eb0: 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29  w or.** trigger)
4ec0: 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20  . All names are 
4ed0: 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f  legal except tho
4ee0: 73 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  se that begin wi
4ef0: 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a  th the string.**
4f00: 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75   "sqlite_" (in u
4f10: 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d  pper, lower or m
4f20: 69 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73  ixed case). This
4f30: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
4f40: 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20  namespace.** is 
4f50: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
4f60: 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e  ernal use..*/.in
4f70: 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  t sqlite3CheckOb
4f80: 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a  jectName(Parse *
4f90: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
4fa0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
4fb0: 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69  ( !pParse->db->i
4fc0: 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72  nit.busy && pPar
4fd0: 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20  se->nested==0 . 
4fe0: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61           && (pPa
4ff0: 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
5000: 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68   SQLITE_WriteSch
5010: 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ema)==0.        
5020: 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53    && 0==sqlite3S
5030: 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22  trNICmp(zName, "
5040: 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a  sqlite_", 7) ){.
5050: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5060: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a  Msg(pParse, "obj
5070: 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65  ect name reserve
5080: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
5090: 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  se: %s", zName);
50a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
50b0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
50c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
50d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
50e0: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20   constructing a 
50f0: 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73  new table repres
5100: 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f  entation in memo
5110: 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  ry.  This is.** 
5120: 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76  the first of sev
5130: 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74  eral action rout
5140: 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61  ines that get ca
5150: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65  lled in response
5160: 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20  .** to a CREATE 
5170: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
5180: 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c    In particular,
5190: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
51a0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72   called.** after
51b0: 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22   seeing tokens "
51c0: 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42  CREATE" and "TAB
51d0: 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c  LE" and the tabl
51e0: 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20  e name.  The.** 
51f0: 70 53 74 61 72 74 20 74 6f 6b 65 6e 20 69 73 20  pStart token is 
5200: 74 68 65 20 43 52 45 41 54 45 20 61 6e 64 20 70  the CREATE and p
5210: 4e 61 6d 65 20 69 73 20 74 68 65 20 74 61 62 6c  Name is the tabl
5220: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 73 54  e name.  The isT
5230: 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74  emp.** flag is t
5240: 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65  rue if the table
5250: 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
5260: 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61  d in the auxilia
5270: 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  ry database.** f
5280: 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ile instead of i
5290: 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
52a0: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
52b0: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20  is normally the 
52c0: 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65  case.** when the
52d0: 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50   "TEMP" or "TEMP
52e0: 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f  ORARY" keyword o
52f0: 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e  ccurs in between
5300: 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54  .** CREATE and T
5310: 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ABLE..**.** The 
5320: 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64  new table record
5330: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
5340: 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72 73  and put in pPars
5350: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a  e->pNewTable..**
5360: 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   As more of the 
5370: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
5380: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
5390: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74  , additional act
53a0: 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20  ion.** routines 
53b0: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74  will be called t
53c0: 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72  o add more infor
53d0: 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72  mation to this r
53e0: 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65  ecord..** At the
53f0: 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41   end of the CREA
5400: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
5410: 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45  nt, the sqlite3E
5420: 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e  ndTable() routin
5430: 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74  e.** is called t
5440: 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63  o complete the c
5450: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74  onstruction of t
5460: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
5470: 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ord..*/.void sql
5480: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a  ite3StartTable(.
5490: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
54a0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
54b0: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
54c0: 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68  *pStart,   /* Th
54d0: 65 20 22 43 52 45 41 54 45 22 20 74 6f 6b 65 6e  e "CREATE" token
54e0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
54f0: 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20  me1,   /* First 
5500: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
5510: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
5520: 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
5530: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53   *pName2,   /* S
5540: 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68  econd part of th
5550: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
5560: 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ble or view */. 
5570: 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20   int isTemp,    
5580: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
5590: 73 20 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c  s is a TEMP tabl
55a0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65  e */.  int isVie
55b0: 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  w,      /* True 
55c0: 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49 45  if this is a VIE
55d0: 57 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72  W */.  int noErr
55e0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
55f0: 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61  thing if table a
5600: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
5610: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
5620: 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  ble;.  char *zNa
5630: 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e  me = 0; /* The n
5640: 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ame of the new t
5650: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
5660: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
5670: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
5680: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
5690: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
56a0: 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74  mber to create t
56b0: 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20  he table in */. 
56c0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20   Token *pName;  
56d0: 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
56e0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
56f0: 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  le to create */.
5700: 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  .  /* The table 
5710: 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20  or view name to 
5720: 63 72 65 61 74 65 20 69 73 20 70 61 73 73 65 64  create is passed
5730: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
5740: 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a   via tokens.  **
5750: 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d   pName1 and pNam
5760: 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  e2. If the table
5770: 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20   name was fully 
5780: 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65  qualified, for e
5790: 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
57a0: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
57b0: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20  xx.yyy (...);.  
57c0: 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e  ** .  ** Then pN
57d0: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
57e0: 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  xxx" and pName2 
57f0: 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74  "yyy". On the ot
5800: 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a  her hand if.  **
5810: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
5820: 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61  is not fully qua
5830: 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20  lified, i.e.:.  
5840: 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54  **.  ** CREATE T
5850: 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20  ABLE yyy(...);. 
5860: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e   **.  ** Then pN
5870: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
5880: 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  yyy" and pName2 
5890: 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  is ""..  **.  **
58a0: 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20   The call below 
58b0: 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70  sets the pName p
58c0: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
58d0: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
58e0: 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61  ame1 or.  ** pNa
58f0: 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73  me2) that stores
5900: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
5910: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65   table name. The
5920: 20 76 61 72 69 61 62 6c 65 20 69 44 62 20 69 73   variable iDb is
5930: 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65  .  ** set to the
5940: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   index of the da
5950: 74 61 62 61 73 65 20 74 68 61 74 20 74 68 65 20  tabase that the 
5960: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73  table or view is
5970: 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61   to be.  ** crea
5980: 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69  ted in..  */.  i
5990: 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
59a0: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
59b0: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
59c0: 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  &pName);.  if( i
59d0: 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
59e0: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
59f0: 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 69  B && isTemp && i
5a00: 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Db>1 ){.    /* I
5a10: 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d  f creating a tem
5a20: 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d  p table, the nam
5a30: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61  e may not be qua
5a40: 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73 71  lified */.    sq
5a50: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5a60: 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79  arse, "temporary
5a70: 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74   table name must
5a80: 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22   be unqualified"
5a90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
5aa0: 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54   }.  if( !OMIT_T
5ab0: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
5ac0: 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50  ) iDb = 1;..  pP
5ad0: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
5ae0: 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61   = *pName;.  zNa
5af0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
5b00: 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
5b10: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
5b20: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
5b30: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
5b40: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
5b50: 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
5b60: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65  ) ){.    goto be
5b70: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
5b80: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69  .  }.  if( db->i
5b90: 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54  nit.iDb==1 ) isT
5ba0: 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  emp = 1;.#ifndef
5bb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
5bc0: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73  HORIZATION.  ass
5bd0: 65 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31  ert( (isTemp & 1
5be0: 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b  )==isTemp );.  {
5bf0: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
5c00: 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64     char *zDb = d
5c10: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
5c20: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
5c30: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
5c40: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
5c50: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
5c60: 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29  isTemp), 0, zDb)
5c70: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
5c80: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
5c90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5ca0: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
5cb0: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
5cc0: 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20   && isTemp ){.  
5cd0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
5ce0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
5cf0: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  VIEW;.      }els
5d00: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
5d10: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
5d20: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20  VIEW;.      }.  
5d30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
5d40: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
5d50: 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  && isTemp ){.   
5d60: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
5d70: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
5d80: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
5d90: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
5da0: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
5db0: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20  TABLE;.      }. 
5dc0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
5dd0: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
5de0: 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d  arse, code, zNam
5df0: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
5e00: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
5e10: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
5e20: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
5e30: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
5e40: 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20   new table name 
5e50: 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65  does not collide
5e60: 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e   with an existin
5e70: 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  g.  ** index or 
5e80: 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68  table name in th
5e90: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e  e same database.
5ea0: 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72    Issue an error
5eb0: 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a   message if.  **
5ec0: 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20   it does..  */. 
5ed0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
5ee0: 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
5ef0: 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
5f00: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
5f10: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
5f20: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46  Table = sqlite3F
5f30: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
5f40: 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  me, db->aDb[iDb]
5f50: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  .zName);.  if( p
5f60: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28  Table ){.    if(
5f70: 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20   !noErr ){.     
5f80: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5f90: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
5fa0: 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %T already exist
5fb0: 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  s", pName);.    
5fc0: 7d 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  }.    goto begin
5fd0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
5fe0: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  }.  if( sqlite3F
5ff0: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
6000: 6d 65 2c 20 30 29 21 3d 30 20 26 26 20 28 69 44  me, 0)!=0 && (iD
6010: 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69  b==0 || !db->ini
6020: 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 73  t.busy) ){.    s
6030: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6040: 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73  Parse, "there is
6050: 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65   already an inde
6060: 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61  x named %s", zNa
6070: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65  me);.    goto be
6080: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6090: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20  .  }.  pTable = 
60a0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
60b0: 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
60c0: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
60d0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  {.    pParse->rc
60e0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
60f0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
6100: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65  r++;.    goto be
6110: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6120: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a  .  }.  pTable->z
6130: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
6140: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
6150: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ;.  pTable->aCol
6160: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
6170: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
6180: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30  able->pIndex = 0
6190: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68  ;.  pTable->pSch
61a0: 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ema = db->aDb[iD
61b0: 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54  b].pSchema;.  pT
61c0: 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  able->nRef = 1;.
61d0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e    if( pParse->pN
61e0: 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65  ewTable ) sqlite
61f0: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
6200: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6210: 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70  le);.  pParse->p
6220: 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  NewTable = pTabl
6230: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  e;..  /* If this
6240: 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73 71   is the magic sq
6250: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
6260: 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74 6f  ble used by auto
6270: 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20  increment,.  ** 
6280: 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f  then record a po
6290: 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74 61  inter to this ta
62a0: 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ble in the main 
62b0: 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
62c0: 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  re.  ** so that 
62d0: 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20  INSERT can find 
62e0: 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79  the table easily
62f0: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
6300: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
6310: 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NCREMENT.  if( !
6320: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26  pParse->nested &
6330: 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  & strcmp(zName, 
6340: 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  "sqlite_sequence
6350: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 61  ")==0 ){.    pTa
6360: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53  ble->pSchema->pS
6370: 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a  eqTab = pTable;.
6380: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
6390: 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e   Begin generatin
63a0: 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  g the code that 
63b0: 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20  will insert the 
63c0: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74  table record int
63d0: 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54  o.  ** the SQLIT
63e0: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20  E_MASTER table. 
63f0: 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75   Note in particu
6400: 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74  lar that we must
6410: 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61   go ahead.  ** a
6420: 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  nd allocate the 
6430: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
6440: 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72  r the table entr
6450: 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61  y now.  Before a
6460: 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20  ny.  ** PRIMARY 
6470: 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65  KEY or UNIQUE ke
6480: 79 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65  ywords are parse
6490: 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72  d.  Those keywor
64a0: 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20  ds will cause.  
64b0: 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65  ** indices to be
64c0: 20 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65   created and the
64d0: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75   table record mu
64e0: 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74  st come before t
64f0: 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  he .  ** indices
6500: 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65  .  Hence, the re
6510: 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20  cord number for 
6520: 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62  the table must b
6530: 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a  e allocated.  **
6540: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
6550: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
6560: 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47  && (v = sqlite3G
6570: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21  etVdbe(pParse))!
6580: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 62  =0 ){.    int lb
6590: 6c 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46  l;.    int fileF
65a0: 6f 72 6d 61 74 3b 0a 20 20 20 20 73 71 6c 69 74  ormat;.    sqlit
65b0: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
65c0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
65d0: 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49   iDb);..    /* I
65e0: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
65f0: 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69  t and encoding i
6600: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
6610: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74  ave not been set
6620: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
6630: 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20  em now..    */. 
6640: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6650: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f  dOp(v, OP_ReadCo
6660: 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 20 20  okie, iDb, 1);  
6670: 20 2f 2a 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20   /* file_format 
6680: 2a 2f 0a 20 20 20 20 6c 62 6c 20 3d 20 73 71 6c  */.    lbl = sql
6690: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
66a0: 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l(v);.    sqlite
66b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
66c0: 5f 49 66 2c 20 30 2c 20 6c 62 6c 29 3b 0a 20 20  _If, 0, lbl);.  
66d0: 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28    fileFormat = (
66e0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
66f0: 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74  TE_LegacyFileFmt
6700: 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
6710: 20 20 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c           1 : SQL
6720: 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
6730: 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c  _FORMAT;.    sql
6740: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6750: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c   OP_Integer, fil
6760: 65 46 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20  eFormat, 0);.   
6770: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6780: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
6790: 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20  e, iDb, 1);.    
67a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
67b0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
67c0: 45 4e 43 28 64 62 29 2c 20 30 29 3b 0a 20 20 20  ENC(db), 0);.   
67d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
67e0: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
67f0: 65 2c 20 69 44 62 2c 20 34 29 3b 0a 20 20 20 20  e, iDb, 4);.    
6800: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
6810: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b  veLabel(v, lbl);
6820: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75  ..    /* This ju
6830: 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61  st creates a pla
6840: 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64  ce-holder record
6850: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
6860: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20  aster table..   
6870: 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63   ** The record c
6880: 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20  reated does not 
6890: 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67  contain anything
68a0: 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62   yet.  It will b
68b0: 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a  e replaced.    *
68c0: 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e  * by the real en
68d0: 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65  try in code gene
68e0: 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33  rated at sqlite3
68f0: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20  EndTable()..    
6900: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  **.    ** The ro
6910: 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  wid for the new 
6920: 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 6f 6e  entry is left on
6930: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
6940: 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 54 68  stack..    ** Th
6950: 65 20 72 6f 77 69 64 20 76 61 6c 75 65 20 69 73  e rowid value is
6960: 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 63   needed by the c
6970: 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ode that sqlite3
6980: 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 0a 20 20  EndTable will.  
6990: 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 2e 0a 20    ** generate.. 
69a0: 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
69b0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
69c0: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
69d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
69e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
69f0: 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  teger, 0, 0);.  
6a00: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
6a10: 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74     {.      sqlit
6a20: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6a30: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 69  P_CreateTable, i
6a40: 44 62 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  Db, 0);.    }.  
6a50: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73    sqlite3OpenMas
6a60: 74 65 72 54 61 62 6c 65 28 70 50 61 72 73 65 2c  terTable(pParse,
6a70: 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
6a80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6a90: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 30  P_NewRowid, 0, 0
6aa0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6ab0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
6ac0: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 0, 0);.    sq
6ad0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6ae0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29  , OP_Null, 0, 0)
6af0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6b00: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 73  eAddOp(v, OP_Ins
6b10: 65 72 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ert, 0, 0);.    
6b20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6b30: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
6b40: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
6b50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6b60: 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  Pull, 1, 0);.  }
6b70: 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e  ..  /* Normal (n
6b80: 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e  on-error) return
6b90: 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a  . */.  return;..
6ba0: 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
6bb0: 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70   occurs, we jump
6bc0: 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74   here */.begin_t
6bd0: 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71  able_error:.  sq
6be0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
6bf0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
6c00: 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69  .** This macro i
6c10: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72  s used to compar
6c20: 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 69 6e  e two strings in
6c30: 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74   a case-insensit
6c40: 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49  ive manner..** I
6c50: 74 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66 61  t is slightly fa
6c60: 73 74 65 72 20 74 68 61 6e 20 63 61 6c 6c 69 6e  ster than callin
6c70: 67 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  g sqlite3StrICmp
6c80: 28 29 20 64 69 72 65 63 74 6c 79 2c 20 62 75 74  () directly, but
6c90: 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c 61 72  .** produces lar
6ca0: 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ger code..**.** 
6cb0: 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 6d 61  WARNING: This ma
6cc0: 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61  cro is not compa
6cd0: 74 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  tible with the s
6ce0: 74 72 63 6d 70 28 29 20 66 61 6d 69 6c 79 2e 20  trcmp() family. 
6cf0: 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 72  It.** returns tr
6d00: 75 65 20 69 66 20 74 68 65 20 74 77 6f 20 73 74  ue if the two st
6d10: 72 69 6e 67 73 20 61 72 65 20 65 71 75 61 6c 2c  rings are equal,
6d20: 20 6f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65   otherwise false
6d30: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 52  ..*/.#define STR
6d40: 49 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a 73 71  ICMP(x, y) (\.sq
6d50: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
6d60: 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61  r[*(unsigned cha
6d70: 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c 0a 73  r *)(x)]==   \.s
6d80: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
6d90: 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68  er[*(unsigned ch
6da0: 61 72 20 2a 29 28 79 29 5d 20 20 20 20 20 5c 0a  ar *)(y)]     \.
6db0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
6dc0: 70 28 28 78 29 2b 31 2c 28 79 29 2b 31 29 3d 3d  p((x)+1,(y)+1)==
6dd0: 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  0 )../*.** Add a
6de0: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74   new column to t
6df0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
6e00: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
6e10: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cted..**.** The 
6e20: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
6e30: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66  s routine once f
6e40: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64  or each column d
6e50: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e  eclaration.** in
6e60: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
6e70: 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69  statement.  sqli
6e80: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20  te3StartTable() 
6e90: 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66  gets called.** f
6ea0: 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e  irst to get thin
6eb0: 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20  gs going.  Then 
6ec0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
6ed0: 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a  called for each.
6ee0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f  ** column..*/.vo
6ef0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
6f00: 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  umn(Parse *pPars
6f10: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  e, Token *pName)
6f20: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
6f30: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
6f40: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
6f50: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
6f60: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
6f70: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  =0 ) return;.  z
6f80: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
6f90: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
6fa0: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
6fb0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
6fc0: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
6fd0: 0a 20 20 20 20 69 66 28 20 53 54 52 49 43 4d 50  .    if( STRICMP
6fe0: 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (z, p->aCol[i].z
6ff0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73  Name) ){.      s
7000: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7010: 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74  Parse, "duplicat
7020: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25  e column name: %
7030: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  s", z);.      sq
7040: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
7050: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
7060: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e  .  }.  if( (p->n
7070: 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Col & 0x7)==0 ){
7080: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65  .    Column *aNe
7090: 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  w;.    aNew = sq
70a0: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e  liteRealloc( p->
70b0: 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38  aCol, (p->nCol+8
70c0: 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  )*sizeof(p->aCol
70d0: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
70e0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
70f0: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
7100: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
7110: 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d   }.    p->aCol =
7120: 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f   aNew;.  }.  pCo
7130: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
7140: 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nCol];.  memset(
7150: 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCol, 0, sizeof(
7160: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
7170: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b  pCol->zName = z;
7180: 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  . .  /* If there
7190: 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63   is no type spec
71a0: 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68  ified, columns h
71b0: 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  ave the default 
71c0: 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e  affinity.  ** 'N
71d0: 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20 69  ONE'. If there i
71e0: 73 20 61 20 74 79 70 65 20 73 70 65 63 69 66 69  s a type specifi
71f0: 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33  ed, then sqlite3
7200: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20  AddColumnType() 
7210: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c  will.  ** be cal
7220: 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20  led next to set 
7230: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63  pCol->affinity c
7240: 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20  orrectly..  */. 
7250: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
7260: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
7270: 45 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a  E;.  p->nCol++;.
7280: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
7290: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
72a0: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
72b0: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
72c0: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
72d0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
72e0: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f  tatement.  A "NO
72f0: 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
7300: 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73  nt has.** been s
7310: 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e  een on a column.
7320: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
7330: 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20  ets the notNull 
7340: 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  flag on.** the c
7350: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
7360: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
7370: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
7380: 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61  te3AddNotNull(Pa
7390: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
73a0: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
73b0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
73c0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
73d0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
73e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
73f0: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66   p->nCol-1;.  if
7400: 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c  ( i>=0 ) p->aCol
7410: 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e  [i].notNull = on
7420: 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Error;.}../*.** 
7430: 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Scan the column 
7440: 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20  type name zType 
7450: 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61  (length nType) a
7460: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a  nd return the.**
7470: 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66 69   associated affi
7480: 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a  nity type..**.**
7490: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
74a0: 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65  es a case-indepe
74b0: 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20  ndent search of 
74c0: 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a  zType for the .*
74d0: 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20  * substrings in 
74e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  the following ta
74f0: 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74  ble. If one of t
7500: 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 73  he substrings is
7510: 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63  .** found, the c
7520: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66  orresponding aff
7530: 69 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e 65  inity is returne
7540: 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74  d. If zType cont
7550: 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61  ains.** more tha
7560: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62  n one of the sub
7570: 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73  strings, entries
7580: 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20   toward the top 
7590: 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  of .** the table
75a0: 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20   take priority. 
75b0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
75c0: 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e  zType is 'BLOBIN
75d0: 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  T', .** SQLITE_A
75e0: 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65  FF_INTEGER is re
75f0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75  turned..**.** Su
7600: 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66  bstring     | Af
7610: 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  finity.** ------
7620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49  ----------.** 'I
7640: 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20 53 51  NT'         | SQ
7650: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
7660: 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20 20  .** 'CHAR'      
7670: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
7680: 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20  EXT.** 'CLOB'   
7690: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
76a0: 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27  F_TEXT.** 'TEXT'
76b0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
76c0: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c  _AFF_TEXT.** 'BL
76d0: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
76e0: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 20  ITE_AFF_NONE.** 
76f0: 27 52 45 41 4c 27 20 20 20 20 20 20 20 20 7c 20  'REAL'        | 
7700: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
7710: 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20 20 20  ** 'FLOA'       
7720: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
7730: 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20 20  AL.** 'DOUB'    
7740: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
7750: 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  _REAL.**.** If n
7760: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
7770: 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f  rings in the abo
7780: 76 65 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75  ve table are fou
7790: 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46  nd,.** SQLITE_AF
77a0: 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74  F_NUMERIC is ret
77b0: 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73  urned..*/.char s
77c0: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
77d0: 70 65 28 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a  pe(const Token *
77e0: 70 54 79 70 65 29 7b 0a 20 20 75 33 32 20 68 20  pType){.  u32 h 
77f0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20  = 0;.  char aff 
7800: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  = SQLITE_AFF_NUM
7810: 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  ERIC;.  const un
7820: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e  signed char *zIn
7830: 20 3d 20 70 54 79 70 65 2d 3e 7a 3b 0a 20 20 63   = pType->z;.  c
7840: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
7850: 61 72 20 2a 7a 45 6e 64 20 3d 20 26 70 54 79 70  ar *zEnd = &pTyp
7860: 65 2d 3e 7a 5b 70 54 79 70 65 2d 3e 6e 5d 3b 0a  e->z[pType->n];.
7870: 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 21 3d 7a  .  while( zIn!=z
7880: 45 6e 64 20 29 7b 0a 20 20 20 20 68 20 3d 20 28  End ){.    h = (
7890: 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55  h<<8) + sqlite3U
78a0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 49 6e  pperToLower[*zIn
78b0: 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20  ];.    zIn++;.  
78c0: 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c    if( h==(('c'<<
78d0: 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27  24)+('h'<<16)+('
78e0: 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20  a'<<8)+'r') ){  
78f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48             /* CH
7900: 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  AR */.      aff 
7910: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
7920: 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  T; .    }else if
7930: 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b  ( h==(('c'<<24)+
7940: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
7950: 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20  8)+'b') ){      
7960: 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20   /* CLOB */.    
7970: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
7980: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c  FF_TEXT;.    }el
7990: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c  se if( h==(('t'<
79a0: 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28  <24)+('e'<<16)+(
79b0: 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20  'x'<<8)+'t') ){ 
79c0: 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f        /* TEXT */
79d0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
79e0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
79f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
7a00: 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('b'<<24)+('l'<<
7a10: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
7a20: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c  )          /* BL
7a30: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  OB */.        &&
7a40: 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46   (aff==SQLITE_AF
7a50: 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66  F_NUMERIC || aff
7a60: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
7a70: 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  L) ){.      aff 
7a80: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
7a90: 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  E;.#ifndef SQLIT
7aa0: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
7ab0: 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20  POINT.    }else 
7ac0: 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34  if( h==(('r'<<24
7ad0: 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27  )+('e'<<16)+('a'
7ae0: 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20  <<8)+'l')       
7af0: 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20     /* REAL */.  
7b00: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
7b10: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
7b20: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
7b30: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b  SQLITE_AFF_REAL;
7b40: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
7b50: 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c  ==(('f'<<24)+('l
7b60: 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b  '<<16)+('o'<<8)+
7b70: 27 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'a')          /*
7b80: 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20   FLOA */.       
7b90: 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   && aff==SQLITE_
7ba0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
7bb0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
7bc0: 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20  E_AFF_REAL;.    
7bd0: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
7be0: 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36  d'<<24)+('o'<<16
7bf0: 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20  )+('u'<<8)+'b') 
7c00: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42           /* DOUB
7c10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
7c20: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
7c30: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
7c40: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7c50: 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20  _REAL;.#endif.  
7c60: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30    }else if( (h&0
7c70: 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69  x00FFFFFF)==(('i
7c80: 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b  '<<16)+('n'<<8)+
7c90: 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e  't') ){    /* IN
7ca0: 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  T */.      aff =
7cb0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
7cc0: 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  GER;.      break
7cd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
7ce0: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
7cf0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7d00: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
7d10: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
7d20: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
7d30: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
7d40: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
7d50: 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73 74  ent.  The pFirst
7d60: 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69   token is the fi
7d70: 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20  rst.** token in 
7d80: 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20  the sequence of 
7d90: 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63  tokens that desc
7da0: 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f 66  ribe the type of
7db0: 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63   the.** column c
7dc0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
7dd0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70  onstruction.   p
7de0: 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73 74  Last is the last
7df0: 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65   token.** in the
7e00: 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20   sequence.  Use 
7e10: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
7e20: 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20   to construct a 
7e30: 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63  string.** that c
7e40: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70 65  ontains the type
7e50: 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  name of the colu
7e60: 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61  mn and store tha
7e70: 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a  t string.** in z
7e80: 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73  Type..*/ .void s
7e90: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54  qlite3AddColumnT
7ea0: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
7eb0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29  e, Token *pType)
7ec0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
7ed0: 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20  int i;.  Column 
7ee0: 2a 70 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 28 70  *pCol;..  if( (p
7ef0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
7f00: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
7f10: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
7f20: 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20  -1;.  if( i<0 ) 
7f30: 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d  return;.  pCol =
7f40: 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20   &p->aCol[i];.  
7f50: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
7f60: 3e 7a 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d  >zType);.  pCol-
7f70: 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  >zType = sqlite3
7f80: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
7f90: 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66  ype);.  pCol->af
7fa0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
7fb0: 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 54 79  AffinityType(pTy
7fc0: 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  pe);.}../*.** Th
7fd0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
7fe0: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
7ff0: 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  e for the most r
8000: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
8010: 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74  lumn.** of the t
8020: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
8030: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
8040: 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74  n..**.** Default
8050: 20 76 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f   value expressio
8060: 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74  ns must be const
8070: 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65  ant.  Raise an e
8080: 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73  xception if this
8090: 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63  .** is not the c
80a0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
80b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
80c0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
80d0: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
80e0: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
80f0: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
8100: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
8110: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65  oid sqlite3AddDe
8120: 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65  faultValue(Parse
8130: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
8140: 70 45 78 70 72 29 7b 0a 20 20 54 61 62 6c 65 20  pExpr){.  Table 
8150: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
8160: 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  ol;.  if( (p = p
8170: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
8180: 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c  )!=0 ){.    pCol
8190: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e   = &(p->aCol[p->
81a0: 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66  nCol-1]);.    if
81b0: 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  ( !sqlite3ExprIs
81c0: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
81d0: 6f 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  on(pExpr) ){.   
81e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
81f0: 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61  sg(pParse, "defa
8200: 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c  ult value of col
8210: 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20  umn [%s] is not 
8220: 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20  constant",.     
8230: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65       pCol->zName
8240: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8250: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
8260: 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66 6c  elete(pCol->pDfl
8270: 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e  t);.      pCol->
8280: 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45  pDflt = sqlite3E
8290: 78 70 72 44 75 70 28 70 45 78 70 72 29 3b 0a 20  xprDup(pExpr);. 
82a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
82b0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78  e3ExprDelete(pEx
82c0: 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  pr);.}../*.** De
82d0: 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d  signate the PRIM
82e0: 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20  ARY KEY for the 
82f0: 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73  table.  pList is
8300: 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73   a list of names
8310: 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   .** of columns 
8320: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72  that form the pr
8330: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70  imary key.  If p
8340: 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  List is NULL, th
8350: 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  en the.** most r
8360: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
8370: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
8380: 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  e is the primary
8390: 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61   key..**.** A ta
83a0: 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20  ble can have at 
83b0: 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79  most one primary
83c0: 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61   key.  If the ta
83d0: 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a  ble already has.
83e0: 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  ** a primary key
83f0: 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68   (and this is th
8400: 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79  e second primary
8410: 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74   key) then creat
8420: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  e an.** error..*
8430: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d  *.** If the PRIM
8440: 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20  ARY KEY is on a 
8450: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68  single column wh
8460: 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20  ose datatype is 
8470: 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e  INTEGER,.** then
8480: 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20   we will try to 
8490: 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  use that column 
84a0: 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53  as the rowid.  S
84b0: 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b  et the Table.iPK
84c0: 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ey.** field of t
84d0: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
84e0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  onstruction to b
84f0: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  e the index of t
8500: 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
8510: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
8520: 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69  .  Table.iPKey i
8530: 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74  s set to -1 if t
8540: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e  here is.** no IN
8550: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
8560: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
8570: 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  key is not an IN
8580: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
8590: 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  Y, then create a
85a0: 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78   unique.** index
85b0: 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e   for the key.  N
85c0: 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  o index is creat
85d0: 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50  ed for INTEGER P
85e0: 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a  RIMARY KEYs..*/.
85f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50  void sqlite3AddP
8600: 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72  rimaryKey(.  Par
8610: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
8620: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
8630: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
8640: 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  *pList,  /* List
8650: 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20   of field names 
8660: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
8670: 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
8680: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
8690: 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65  do with a unique
86a0: 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  ness conflict */
86b0: 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20  .  int autoInc, 
86c0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
86d0: 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e  the AUTOINCREMEN
86e0: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
86f0: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  sent */.  int so
8700: 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53  rtOrder     /* S
8710: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20  QLITE_SO_ASC or 
8720: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a  SQLITE_SO_DESC *
8730: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
8740: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
8750: 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  wTable;.  char *
8760: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
8770: 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20   iCol = -1, i;. 
8780: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67   if( pTab==0 ) g
8790: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
87a0: 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62  exit;.  if( pTab
87b0: 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a  ->hasPrimKey ){.
87c0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
87d0: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
87e0: 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22     "table \"%s\"
87f0: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
8800: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c  ne primary key",
8810: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
8820: 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f     goto primary_
8830: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  key_exit;.  }.  
8840: 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79  pTab->hasPrimKey
8850: 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 1;.  if( pLis
8860: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c  t==0 ){.    iCol
8870: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20   = pTab->nCol - 
8880: 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  1;.    pTab->aCo
8890: 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65  l[iCol].isPrimKe
88a0: 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 1;.  }else{.
88b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
88c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
88d0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f  ){.      for(iCo
88e0: 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
88f0: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
8900: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
8910: 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
8920: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[i].zName, pTa
8930: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
8940: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
8950: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8960: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8970: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61      if( iCol<pTa
8980: 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
8990: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43     pTab->aCol[iC
89a0: 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20  ol].isPrimKey = 
89b0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
89c0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
89d0: 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d  nExpr>1 ) iCol =
89e0: 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   -1;.  }.  if( i
89f0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
8a00: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
8a10: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
8a20: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
8a30: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65  .  }.  if( zType
8a40: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
8a50: 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47  mp(zType, "INTEG
8a60: 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ER")==0.        
8a70: 26 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51  && sortOrder==SQ
8a80: 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20  LITE_SO_ASC ){. 
8a90: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
8aa0: 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d   iCol;.    pTab-
8ab0: 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72  >keyConf = onErr
8ac0: 6f 72 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 75  or;.    pTab->au
8ad0: 74 6f 49 6e 63 20 3d 20 61 75 74 6f 49 6e 63 3b  toInc = autoInc;
8ae0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74  .  }else if( aut
8af0: 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20  oInc ){.#ifndef 
8b00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
8b10: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71  INCREMENT.    sq
8b20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8b30: 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45  arse, "AUTOINCRE
8b40: 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c  MENT is only all
8b50: 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20  owed on an ".   
8b60: 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49      "INTEGER PRI
8b70: 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64  MARY KEY");.#end
8b80: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
8b90: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
8ba0: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
8bb0: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
8bc0: 6f 72 2c 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72  or, 0, 0, sortOr
8bd0: 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69  der, 0);.    pLi
8be0: 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69  st = 0;.  }..pri
8bf0: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20  mary_key_exit:. 
8c00: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
8c10: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
8c20: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
8c30: 2a 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43  * Add a new CHEC
8c40: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20  K constraint to 
8c50: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
8c60: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
8c70: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
8c80: 73 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43  sqlite3AddCheckC
8c90: 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
8ca0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
8cb0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
8cc0: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68  t */.  Expr *pCh
8cd0: 65 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20  eckExpr  /* The 
8ce0: 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e  check expression
8cf0: 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
8d00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
8d10: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
8d20: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
8d30: 6c 65 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29  le;.  if( pTab )
8d40: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 43 48 45  {.    /* The CHE
8d50: 43 4b 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  CK expression mu
8d60: 73 74 20 62 65 20 64 75 70 6c 69 63 61 74 65 64  st be duplicated
8d70: 20 73 6f 20 74 68 61 74 20 74 6f 6b 65 6e 73 20   so that tokens 
8d80: 72 65 66 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20  refer.    ** to 
8d90: 6d 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20 61  malloced space a
8da0: 6e 64 20 6e 6f 74 20 74 68 65 20 28 65 70 68 65  nd not the (ephe
8db0: 6d 65 72 61 6c 29 20 74 65 78 74 20 6f 66 20 74  meral) text of t
8dc0: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 0a  he CREATE TABLE.
8dd0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
8de0: 20 2a 2f 0a 20 20 20 20 70 54 61 62 2d 3e 70 43   */.    pTab->pC
8df0: 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  heck = sqlite3Ex
8e00: 70 72 41 6e 64 28 70 54 61 62 2d 3e 70 43 68 65  prAnd(pTab->pChe
8e10: 63 6b 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44  ck, sqlite3ExprD
8e20: 75 70 28 70 43 68 65 63 6b 45 78 70 72 29 29 3b  up(pCheckExpr));
8e30: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
8e40: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
8e50: 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 7d 0a 0a  pCheckExpr);.}..
8e60: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
8e70: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
8e80: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
8e90: 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62  ently parsed tab
8ea0: 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20  le column.** to 
8eb0: 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65  the CollSeq give
8ec0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
8ed0: 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65  e3AddCollateType
8ee0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8ef0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
8f00: 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20  e, int nType){. 
8f10: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
8f20: 20 69 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20   i;..  if( (p = 
8f30: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
8f40: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
8f50: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
8f60: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c  ..  if( sqlite3L
8f70: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
8f80: 72 73 65 2c 20 7a 54 79 70 65 2c 20 6e 54 79 70  rse, zType, nTyp
8f90: 65 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  e) ){.    Index 
8fa0: 2a 70 49 64 78 3b 0a 20 20 20 20 70 2d 3e 61 43  *pIdx;.    p->aC
8fb0: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 73 71  ol[i].zColl = sq
8fc0: 6c 69 74 65 53 74 72 4e 44 75 70 28 7a 54 79 70  liteStrNDup(zTyp
8fd0: 65 2c 20 6e 54 79 70 65 29 3b 0a 20 20 0a 20 20  e, nType);.  .  
8fe0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
8ff0: 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61  mn is declared a
9000: 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52  s "<name> PRIMAR
9010: 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74  Y KEY COLLATE <t
9020: 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68  ype>",.    ** th
9030: 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20  en an index may 
9040: 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65  have been create
9050: 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e  d on this column
9060: 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20   before the.    
9070: 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70  ** collation typ
9080: 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72  e was added. Cor
9090: 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20  rect this if it 
90a0: 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20  is the case..   
90b0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78   */.    for(pIdx
90c0: 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  =p->pIndex; pIdx
90d0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
90e0: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
90f0: 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
9100: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
9110: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
9120: 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20  0]==i ){.       
9130: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d   pIdx->azColl[0]
9140: 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43   = p->aCol[i].zC
9150: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
9160: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9170: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
9180: 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74  turns the collat
9190: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
91a0: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
91b0: 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e   text.** encodin
91c0: 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  g identified by 
91d0: 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  the string zName
91e0: 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a  , length nName..
91f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
9200: 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  uested collation
9210: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74   sequence is not
9220: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e   available, or n
9230: 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  ot available.** 
9240: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
9250: 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c  native encoding,
9260: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
9270: 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65  actory is invoke
9280: 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20  d to.** request 
9290: 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61  it. If the colla
92a0: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65  tion factory doe
92b0: 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63  s not supply suc
92c0: 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a  h a sequence,.**
92d0: 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63   and the sequenc
92e0: 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69  e is available i
92f0: 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65  n another text e
9300: 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68  ncoding, then th
9310: 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  at is.** returne
9320: 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
9330: 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20   If no versions 
9340: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  of the requested
9350: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75   collations sequ
9360: 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62  ence are availab
9370: 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65  le, or.** anothe
9380: 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  r error occurs, 
9390: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
93a0: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65   and an error me
93b0: 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e  ssage written in
93c0: 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f  to.** pParse..*/
93d0: 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65  .CollSeq *sqlite
93e0: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50  3LocateCollSeq(P
93f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
9400: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
9410: 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 73   int nName){.  s
9420: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
9430: 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e  rse->db;.  u8 en
9440: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75  c = ENC(db);.  u
9450: 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d  8 initbusy = db-
9460: 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f  >init.busy;.  Co
9470: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20  llSeq *pColl;.. 
9480: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
9490: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
94a0: 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  enc, zName, nNam
94b0: 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20  e, initbusy);.  
94c0: 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26  if( !initbusy &&
94d0: 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f   (!pColl || !pCo
94e0: 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20  ll->xCmp) ){.   
94f0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
9500: 47 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20 70  GetCollSeq(db, p
9510: 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Coll, zName, nNa
9520: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  me);.    if( !pC
9530: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  oll ){.      if(
9540: 20 6e 4e 61 6d 65 3c 30 20 29 7b 0a 20 20 20 20   nName<0 ){.    
9550: 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c      nName = strl
9560: 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  en(zName);.     
9570: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
9580: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9590: 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74   "no such collat
95a0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 2e  ion sequence: %.
95b0: 2a 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d  *s", nName, zNam
95c0: 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20  e);.      pColl 
95d0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
95e0: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
95f0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
9600: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
9610: 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  l increment the 
9620: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a  schema cookie..*
9630: 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20  *.** The schema 
9640: 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74  cookie is used t
9650: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e  o determine when
9660: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
9670: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
9680: 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20  changes.  After 
9690: 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e  each schema chan
96a0: 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  ge, the cookie v
96b0: 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  alue.** changes.
96c0: 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73    When a process
96d0: 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65   first reads the
96e0: 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72   schema it recor
96f0: 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65  ds the.** cookie
9700: 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77  .  Thereafter, w
9710: 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20  henever it goes 
9720: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
9730: 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68  tabase,.** it ch
9740: 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  ecks the cookie 
9750: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
9760: 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20   schema has not 
9770: 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65  changed.** since
9780: 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61   it was last rea
9790: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c  d..**.** This pl
97a0: 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65  an is not comple
97b0: 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f  tely bullet-proo
97c0: 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62  f.  It is possib
97d0: 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63  le for.** the sc
97e0: 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d  hema to change m
97f0: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e  ultiple times an
9800: 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65  d for the cookie
9810: 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61   to be.** set ba
9820: 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75  ck to prior valu
9830: 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63  e.  But schema c
9840: 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65  hanges are infre
9850: 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65  quent.** and the
9860: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
9870: 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65  hitting the same
9880: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73   cookie value is
9890: 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63   only.** 1 chanc
98a0: 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77  e in 2^32.  So w
98b0: 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68  e're safe enough
98c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
98d0: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71  3ChangeCookie(sq
98e0: 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
98f0: 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *v, int iDb){.  
9900: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9910: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
9920: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
9930: 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
9940: 6b 69 65 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c  kie+1, 0);.  sql
9950: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9960: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
9970: 44 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Db, 0);.}../*.**
9980: 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d   Measure the num
9990: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
99a0: 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70  s needed to outp
99b0: 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  ut the given.** 
99c0: 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65  identifier.  The
99d0: 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
99e0: 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75   includes any qu
99f0: 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74  otes used.** but
9a00: 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64   does not includ
9a10: 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69  e the null termi
9a20: 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nator..**.** The
9a30: 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e   estimate is con
9a40: 73 65 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d  servative.  It m
9a50: 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
9a60: 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72  hat what is.** r
9a70: 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f  eally needed..*/
9a80: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e  .static int iden
9a90: 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68  tLength(const ch
9aa0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b  ar *z){.  int n;
9ab0: 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20  .  for(n=0; *z; 
9ac0: 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69  n++, z++){.    i
9ad0: 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b  f( *z=='"' ){ n+
9ae0: 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72  +; }.  }.  retur
9af0: 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  n n + 2;.}../*.*
9b00: 2a 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74  * Write an ident
9b10: 69 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65  ifier onto the e
9b20: 6e 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  nd of the given 
9b30: 73 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20  string.  Add.** 
9b40: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73  quote characters
9b50: 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73   as needed..*/.s
9b60: 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74  tatic void ident
9b70: 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  Put(char *z, int
9b80: 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53   *pIdx, char *zS
9b90: 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75  ignedIdent){.  u
9ba0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
9bb0: 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  dent = (unsigned
9bc0: 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64   char*)zSignedId
9bd0: 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ent;.  int i, j,
9be0: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
9bf0: 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a  = *pIdx;.  for(j
9c00: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
9c10: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73  ++){.    if( !is
9c20: 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29  alnum(zIdent[j])
9c30: 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27   && zIdent[j]!='
9c40: 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  _' ) break;.  }.
9c50: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a    needQuote =  z
9c60: 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69  Ident[j]!=0 || i
9c70: 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d  sdigit(zIdent[0]
9c80: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
9c90: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65      || sqlite3Ke
9ca0: 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74  ywordCode(zIdent
9cb0: 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69  , j)!=TK_ID;.  i
9cc0: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
9cd0: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66  [i++] = '"';.  f
9ce0: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
9cf0: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69  ]; j++){.    z[i
9d00: 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b  ++] = zIdent[j];
9d10: 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b  .    if( zIdent[
9d20: 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d  j]=='"' ) z[i++]
9d30: 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66   = '"';.  }.  if
9d40: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
9d50: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b  i++] = '"';.  z[
9d60: 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20  i] = 0;.  *pIdx 
9d70: 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = i;.}../*.** Ge
9d80: 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20  nerate a CREATE 
9d90: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
9da0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
9db0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62  the given.** tab
9dc0: 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68  le.  Memory to h
9dd0: 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20  old the text of 
9de0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
9df0: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
9e00: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
9e10: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
9e20: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
9e30: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
9e40: 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61  tatic char *crea
9e50: 74 65 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c  teTableStmt(Tabl
9e60: 65 20 2a 70 2c 20 69 6e 74 20 69 73 54 65 6d 70  e *p, int isTemp
9e70: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e  ){.  int i, k, n
9e80: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b  ;.  char *zStmt;
9e90: 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a  .  char *zSep, *
9ea0: 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a  zSep2, *zEnd, *z
9eb0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
9ec0: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72  ;.  n = 0;.  for
9ed0: 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c  (pCol = p->aCol,
9ee0: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
9ef0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
9f00: 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e     n += identLen
9f10: 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  gth(pCol->zName)
9f20: 3b 0a 20 20 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e  ;.    z = pCol->
9f30: 7a 54 79 70 65 3b 0a 20 20 20 20 69 66 28 20 7a  zType;.    if( z
9f40: 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 28   ){.      n += (
9f50: 73 74 72 6c 65 6e 28 7a 29 20 2b 20 31 29 3b 0a  strlen(z) + 1);.
9f60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d      }.  }.  n +=
9f70: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e   identLength(p->
9f80: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c  zName);.  if( n<
9f90: 35 30 20 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d  50 ){.    zSep =
9fa0: 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d   "";.    zSep2 =
9fb0: 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d   ",";.    zEnd =
9fc0: 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   ")";.  }else{. 
9fd0: 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22     zSep = "\n  "
9fe0: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
9ff0: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20  \n  ";.    zEnd 
a000: 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e  = "\n)";.  }.  n
a010: 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43   += 35 + 6*p->nC
a020: 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71  ol;.  zStmt = sq
a030: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e  liteMallocRaw( n
a040: 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d   );.  if( zStmt=
a050: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
a060: 20 73 74 72 63 70 79 28 7a 53 74 6d 74 2c 20 21   strcpy(zStmt, !
a070: 4f 4d 49 54 5f 54 45 4d 50 44 42 26 26 69 73 54  OMIT_TEMPDB&&isT
a080: 65 6d 70 20 3f 20 22 43 52 45 41 54 45 20 54 45  emp ? "CREATE TE
a090: 4d 50 20 54 41 42 4c 45 20 22 3a 22 43 52 45 41  MP TABLE ":"CREA
a0a0: 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b  TE TABLE ");.  k
a0b0: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29   = strlen(zStmt)
a0c0: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
a0d0: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
a0e0: 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20  );.  zStmt[k++] 
a0f0: 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f  = '(';.  for(pCo
a100: 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  l=p->aCol, i=0; 
a110: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
a120: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72  pCol++){.    str
a130: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
a140: 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73  Sep);.    k += s
a150: 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29  trlen(&zStmt[k])
a160: 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65  ;.    zSep = zSe
a170: 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74  p2;.    identPut
a180: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c  (zStmt, &k, pCol
a190: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ->zName);.    if
a1a0: 28 20 28 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79  ( (z = pCol->zTy
a1b0: 70 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  pe)!=0 ){.      
a1c0: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27  zStmt[k++] = ' '
a1d0: 3b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 26  ;.      strcpy(&
a1e0: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 29 3b 0a 20 20  zStmt[k], z);.  
a1f0: 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28      k += strlen(
a200: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  z);.    }.  }.  
a210: 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  strcpy(&zStmt[k]
a220: 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72  , zEnd);.  retur
a230: 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zStmt;.}../*.*
a240: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
a250: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f  s called to repo
a260: 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22  rt the final ")"
a270: 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73   that terminates
a280: 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41 42  .** a CREATE TAB
a290: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
a2a0: 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74  .** The table st
a2b0: 72 75 63 74 75 72 65 20 74 68 61 74 20 6f 74 68  ructure that oth
a2c0: 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  er action routin
a2d0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 62 75 69  es have been bui
a2e0: 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65  lding.** is adde
a2f0: 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61  d to the interna
a300: 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61  l hash tables, a
a310: 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72  ssuming no error
a320: 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72  s have.** occurr
a330: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74  ed..**.** An ent
a340: 72 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ry for the table
a350: 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20   is made in the 
a360: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20  master table on 
a370: 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20  disk, unless.** 
a380: 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72  this is a tempor
a390: 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d  ary table or db-
a3a0: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20  >init.busy==1.  
a3b0: 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75  When db->init.bu
a3c0: 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e  sy==1.** it mean
a3d0: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
a3e0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
a3f0: 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65  er table because
a400: 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e   we just.** conn
a410: 65 63 74 65 64 20 74 6f 20 74 68 65 20 64 61 74  ected to the dat
a420: 61 62 61 73 65 20 6f 72 20 62 65 63 61 75 73 65  abase or because
a430: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
a440: 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20  er table has.** 
a450: 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64  recently changed
a460: 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66  , so the entry f
a470: 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c  or this table al
a480: 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a  ready exists in.
a490: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ** the sqlite_ma
a4a0: 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20  ster table.  We 
a4b0: 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63  do not want to c
a4c0: 72 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a  reate it again..
a4d0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65  **.** If the pSe
a4e0: 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73  lect argument is
a4f0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65   not NULL, it me
a500: 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 72 6f  ans that this ro
a510: 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c  utine.** was cal
a520: 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
a530: 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
a540: 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41  from a .** "CREA
a550: 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20  TE TABLE ... AS 
a560: 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74  SELECT ..." stat
a570: 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75  ement.  The colu
a580: 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  mn names of.** t
a590: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c  he new table wil
a5a0: 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65 73 75  l match the resu
a5b0: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
a5c0: 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  LECT..*/.void sq
a5d0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20  lite3EndTable(. 
a5e0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
a5f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
a600: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
a610: 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20  oken *pCons,    
a620: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c         /* The ',
a630: 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68  ' token after th
a640: 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65  e last column de
a650: 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  fn. */.  Token *
a660: 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  pEnd,           
a670: 20 2f 2a 20 54 68 65 20 66 69 6e 61 6c 20 27 29   /* The final ')
a680: 27 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 43  ' token in the C
a690: 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20  REATE TABLE */. 
a6a0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
a6b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
a6c0: 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54  ct from a "CREAT
a6d0: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22  E ... AS SELECT"
a6e0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
a6f0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
a700: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
a710: 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28   int iDb;..  if(
a720: 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65   (pEnd==0 && pSe
a730: 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72  lect==0) || pPar
a740: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
a750: 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
a760: 29 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  ) ) {.    return
a770: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 70 50 61 72  ;.  }.  p = pPar
a780: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
a790: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
a7a0: 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  rn;..  assert( !
a7b0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
a7c0: 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20   !pSelect );..  
a7d0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
a7e0: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
a7f0: 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  e->db, p->pSchem
a800: 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  a);..#ifndef SQL
a810: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
a820: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65   /* Resolve name
a830: 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63  s in all CHECK c
a840: 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65 73  onstraint expres
a850: 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  sions..  */.  if
a860: 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20  ( p->pCheck ){. 
a870: 20 20 20 53 72 63 4c 69 73 74 20 73 53 72 63 3b     SrcList sSrc;
a880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a890: 20 20 20 2f 2a 20 46 61 6b 65 20 53 72 63 4c 69     /* Fake SrcLi
a8a0: 73 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70  st for pParse->p
a8b0: 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20  NewTable */.    
a8c0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8e0: 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
a8f0: 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  for pParse->pNew
a900: 54 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 6d 65  Table */..    me
a910: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
a920: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
a930: 6d 65 6d 73 65 74 28 26 73 53 72 63 2c 20 30 2c  memset(&sSrc, 0,
a940: 20 73 69 7a 65 6f 66 28 73 53 72 63 29 29 3b 0a   sizeof(sSrc));.
a950: 20 20 20 20 73 53 72 63 2e 6e 53 72 63 20 3d 20      sSrc.nSrc = 
a960: 31 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d  1;.    sSrc.a[0]
a970: 2e 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d  .zName = p->zNam
a980: 65 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d  e;.    sSrc.a[0]
a990: 2e 70 54 61 62 20 3d 20 70 3b 0a 20 20 20 20 73  .pTab = p;.    s
a9a0: 53 72 63 2e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  Src.a[0].iCursor
a9b0: 20 3d 20 2d 31 3b 0a 20 20 20 20 73 4e 43 2e 70   = -1;.    sNC.p
a9c0: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
a9d0: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
a9e0: 20 3d 20 26 73 53 72 63 3b 0a 20 20 20 20 73 4e   = &sSrc;.    sN
a9f0: 43 2e 69 73 43 68 65 63 6b 20 3d 20 31 3b 0a 20  C.isCheck = 1;. 
aa00: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
aa10: 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
aa20: 73 4e 43 2c 20 70 2d 3e 70 43 68 65 63 6b 29 20  sNC, p->pCheck) 
aa30: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  ){.      return;
aa40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
aa50: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
aa60: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29  LITE_OMIT_CHECK)
aa70: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   */..  /* If the
aa80: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
aa90: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
aaa0: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
aab0: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
aac0: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
aad0: 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70   or "sqlite_temp
aae0: 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f  _master" table o
aaf0: 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a  n the disk..  **
ab00: 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
ab10: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61   to the disk aga
ab20: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
ab30: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
ab40: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74  r.  ** for the t
ab50: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62  able from the db
ab60: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66  ->init.newTnum f
ab70: 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65  ield.  (The page
ab80: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f   number.  ** sho
ab90: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75  uld have been pu
aba0: 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73  t there by the s
abb0: 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74  qliteOpenCb rout
abc0: 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ine.).  */.  if(
abd0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
abe0: 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  {.    p->tnum = 
abf0: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
ac00: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
ac10: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
ac20: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72   then create a r
ac30: 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65  ecord for the ne
ac40: 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  w table.  ** in 
ac50: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
ac60: 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64  R table of the d
ac70: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72 65  atabase.  The re
ac80: 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  cord number.  **
ac90: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
aca0: 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64 20  le entry should 
acb0: 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74 68  already be on th
acc0: 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  e stack..  **.  
acd0: 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
ace0: 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c  TEMPORARY table,
acf0: 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79   write the entry
ad00: 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69   into the auxili
ad10: 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  ary.  ** file in
ad20: 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68  stead of into th
ad30: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
ad40: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
ad50: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
ad60: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
ad70: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
ad80: 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f  har *zType;    /
ad90: 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62  * "view" or "tab
ada0: 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  le" */.    char 
adb0: 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56  *zType2;   /* "V
adc0: 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20  IEW" or "TABLE" 
add0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
ade0: 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  mt;    /* Text o
adf0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
ae00: 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45  LE or CREATE VIE
ae10: 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a  W statement */..
ae20: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
ae30: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
ae40: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
ae50: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69  eturn;..    sqli
ae60: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ae70: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
ae80: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
ae90: 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72  the rootpage for
aea0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 61   the new table a
aeb0: 6e 64 20 70 75 73 68 20 69 74 20 6f 6e 74 6f 20  nd push it onto 
aec0: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a  the stack..    *
aed0: 2a 20 41 20 76 69 65 77 20 68 61 73 20 6e 6f 20  * A view has no 
aee0: 72 6f 6f 74 70 61 67 65 2c 20 73 6f 20 6a 75 73  rootpage, so jus
aef0: 74 20 70 75 73 68 20 61 20 7a 65 72 6f 20 6f 6e  t push a zero on
af00: 74 6f 20 74 68 65 20 73 74 61 63 6b 20 66 6f 72  to the stack for
af10: 0a 20 20 20 20 2a 2a 20 76 69 65 77 73 2e 20 20  .    ** views.  
af20: 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65  Initialize zType
af30: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
af40: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
af50: 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ( p->pSelect==0 
af60: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65  ){.      /* A re
af70: 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20  gular table */. 
af80: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61       zType = "ta
af90: 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70  ble";.      zTyp
afa0: 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69  e2 = "TABLE";.#i
afb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
afc0: 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65  T_VIEW.    }else
afd0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65  {.      /* A vie
afe0: 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65  w */.      zType
aff0: 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20   = "view";.     
b000: 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22   zType2 = "VIEW"
b010: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
b020: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
b030: 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  s a CREATE TABLE
b040: 20 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e   xx AS SELECT ..
b050: 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53  ., execute the S
b060: 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61  ELECT.    ** sta
b070: 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61  tement to popula
b080: 74 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  te the new table
b090: 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  . The root-page 
b0a0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20  number for the. 
b0b0: 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20     ** new table 
b0c0: 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  is on the top of
b0d0: 20 74 68 65 20 76 64 62 65 20 73 74 61 63 6b 2e   the vdbe stack.
b0e0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
b0f0: 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68  nce the SELECT h
b100: 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79  as been coded by
b110: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
b120: 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20  , it is in a.   
b130: 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61   ** suitable sta
b140: 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  te to query for 
b150: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
b160: 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65   and types to be
b170: 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20   used.    ** by 
b180: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20  the new table.. 
b190: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73     **.    ** A s
b1a0: 68 61 72 65 64 2d 63 61 63 68 65 20 77 72 69 74  hared-cache writ
b1b0: 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  e-lock is not re
b1c0: 71 75 69 72 65 64 20 74 6f 20 77 72 69 74 65 20  quired to write 
b1d0: 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  to the new table
b1e0: 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63  ,.    ** as a sc
b1f0: 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68  hema-lock must h
b200: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
b210: 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65   obtained to cre
b220: 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20  ate it. Since.  
b230: 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f    ** a schema-lo
b240: 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20  ck excludes all 
b250: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 75  other database u
b260: 73 65 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d  sers, the write-
b270: 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a  lock would.    *
b280: 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a  * be redundant..
b290: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
b2a0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
b2b0: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a  Table *pSelTab;.
b2c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b2d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
b2e0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
b2f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b300: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
b310: 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  Db, 0);.      sq
b320: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b330: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
b340: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  1, 0);.      pPa
b350: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20  rse->nTab = 2;. 
b360: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
b370: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
b380: 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31  ct, SRT_Table, 1
b390: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
b3a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b3b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
b3c0: 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
b3d0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
b3e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
b3f0: 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
b400: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
b410: 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65  t(pParse, 0, pSe
b420: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69  lect);.        i
b430: 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20  f( pSelTab==0 ) 
b440: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
b450: 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d  assert( p->aCol=
b460: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =0 );.        p-
b470: 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
b480: 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70  >nCol;.        p
b490: 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->aCol = pSelTab
b4a0: 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->aCol;.        
b4b0: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
b4c0: 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  0;.        pSelT
b4d0: 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
b4e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
b4f0: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c  eteTable(0, pSel
b500: 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
b510: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70    }..    /* Comp
b520: 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ute the complete
b530: 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
b540: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ATE statement */
b550: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
b560: 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   ){.      zStmt 
b570: 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d  = createTableStm
b580: 74 28 70 2c 20 70 2d 3e 70 53 63 68 65 6d 61 3d  t(p, p->pSchema=
b590: 3d 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62  =pParse->db->aDb
b5a0: 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20  [1].pSchema);.  
b5b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
b5c0: 20 3d 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 50 61   = pEnd->z - pPa
b5d0: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
b5e0: 7a 20 2b 20 31 3b 0a 20 20 20 20 20 20 7a 53 74  z + 1;.      zSt
b5f0: 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
b600: 6e 74 66 28 22 43 52 45 41 54 45 20 25 73 20 25  ntf("CREATE %s %
b610: 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c  .*s", zType2, n,
b620: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
b630: 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 7d 0a 0a 20  ken.z);.    }.. 
b640: 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72     /* A slot for
b650: 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 20   the record has 
b660: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
b670: 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20  ocated in the . 
b680: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53     ** SQLITE_MAS
b690: 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a  TER table.  We j
b6a0: 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61  ust need to upda
b6b0: 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74  te that slot wit
b6c0: 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65  h all.    ** the
b6d0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27   information we'
b6e0: 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 20 20 54  ve collected.  T
b6f0: 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
b700: 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 0a 20 20   preallocated.  
b710: 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 74 68 65    ** slot is the
b720: 20 32 6e 64 20 69 74 65 6d 20 6f 6e 20 74 68 65   2nd item on the
b730: 20 73 74 61 63 6b 2e 20 20 54 68 65 20 74 6f 70   stack.  The top
b740: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69 73   of the stack is
b750: 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74   the.    ** root
b760: 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65   page for the ne
b770: 77 20 74 61 62 6c 65 20 28 6f 72 20 61 20 30 20  w table (or a 0 
b780: 69 66 20 74 68 69 73 20 69 73 20 61 20 76 69 65  if this is a vie
b790: 77 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  w)..    */.    s
b7a0: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
b7b0: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
b7c0: 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a  "UPDATE %Q.%s ".
b7d0: 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74 79           "SET ty
b7e0: 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51  pe='%s', name=%Q
b7f0: 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72  , tbl_name=%Q, r
b800: 6f 6f 74 70 61 67 65 3d 23 30 2c 20 73 71 6c 3d  ootpage=#0, sql=
b810: 25 51 20 22 0a 20 20 20 20 20 20 20 22 57 48 45  %Q ".       "WHE
b820: 52 45 20 72 6f 77 69 64 3d 23 31 22 2c 0a 20 20  RE rowid=#1",.  
b830: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
b840: 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
b850: 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20  ABLE(iDb),.     
b860: 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d   zType,.      p-
b870: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d  >zName,.      p-
b880: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 7a 53  >zName,.      zS
b890: 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tmt.    );.    s
b8a0: 71 6c 69 74 65 46 72 65 65 28 7a 53 74 6d 74 29  qliteFree(zStmt)
b8b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
b8c0: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c  ngeCookie(db, v,
b8d0: 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
b8e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
b8f0: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a  INCREMENT.    /*
b900: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
b910: 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61   we need to crea
b920: 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71  te an sqlite_seq
b930: 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a  uence table for.
b940: 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74      ** keeping t
b950: 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72  rack of autoincr
b960: 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20  ement keys..    
b970: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 75  */.    if( p->au
b980: 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 44  toInc ){.      D
b990: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
b9a0: 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 69 66  b[iDb];.      if
b9b0: 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
b9c0: 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20  pSeqTab==0 ){.  
b9d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
b9e0: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
b9f0: 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
ba00: 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69  TE TABLE %Q.sqli
ba10: 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65  te_sequence(name
ba20: 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20  ,seq)",.        
ba30: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20    pDb->zName.   
ba40: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
ba50: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
ba60: 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65    /* Reparse eve
ba70: 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74  rything to updat
ba80: 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64  e our internal d
ba90: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a  ata structures *
baa0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
bab0: 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73 65  eOp3(v, OP_Parse
bac0: 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 0a  Schema, iDb, 0,.
bad0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
bae0: 50 72 69 6e 74 66 28 22 74 62 6c 5f 6e 61 6d 65  Printf("tbl_name
baf0: 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29  ='%q'",p->zName)
bb00: 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P3_DYNAMIC);. 
bb10: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68   }...  /* Add th
bb20: 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69  e table to the i
bb30: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
bb40: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
bb50: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
bb60: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
bb70: 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72  y && pParse->nEr
bb80: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c  r==0 ){.    Tabl
bb90: 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65  e *pOld;.    FKe
bba0: 79 20 2a 70 46 4b 65 79 3b 20 0a 20 20 20 20 53  y *pFKey; .    S
bbb0: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
bbc0: 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20   p->pSchema;.   
bbd0: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48   pOld = sqlite3H
bbe0: 61 73 68 49 6e 73 65 72 74 28 26 70 53 63 68 65  ashInsert(&pSche
bbf0: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e  ma->tblHash, p->
bc00: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d  zName, strlen(p-
bc10: 3e 7a 4e 61 6d 65 29 2b 31 2c 70 29 3b 0a 20 20  >zName)+1,p);.  
bc20: 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20    if( pOld ){.  
bc30: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
bc40: 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  Old );  /* Mallo
bc50: 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
bc60: 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e  ed inside HashIn
bc70: 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  sert() */.      
bc80: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 23 69  return;.    }.#i
bc90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
bca0: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
bcb0: 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70    for(pFKey=p->p
bcc0: 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b  FKey; pFKey; pFK
bcd0: 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  ey=pFKey->pNextF
bce0: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rom){.      int 
bcf0: 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b  nTo = strlen(pFK
bd00: 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20  ey->zTo) + 1;.  
bd10: 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74      pFKey->pNext
bd20: 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  To = sqlite3Hash
bd30: 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 61  Find(&pSchema->a
bd40: 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f  FKey, pFKey->zTo
bd50: 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73 71  , nTo);.      sq
bd60: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
bd70: 26 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c  &pSchema->aFKey,
bd80: 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f   pFKey->zTo, nTo
bd90: 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a  , pFKey);.    }.
bda0: 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72 73  #endif.    pPars
bdb0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
bdc0: 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65  ;.    db->nTable
bdd0: 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  ++;.    db->flag
bde0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
bdf0: 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e  rnChanges;..#ifn
be00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
be10: 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69  ALTERTABLE.    i
be20: 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29  f( !p->pSelect )
be30: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
be40: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e  ar *zName = (con
be50: 73 74 20 63 68 61 72 20 2a 29 70 50 61 72 73 65  st char *)pParse
be60: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a  ->sNameToken.z;.
be70: 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b        int nName;
be80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
be90: 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73  pSelect && pCons
bea0: 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20   && pEnd );.    
beb0: 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d    if( pCons->z==
bec0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  0 ){.        pCo
bed0: 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  ns = pEnd;.     
bee0: 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d   }.      nName =
bef0: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
bf00: 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 3b  Cons->z - zName;
bf10: 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c  .      p->addCol
bf20: 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71  Offset = 13 + sq
bf30: 6c 69 74 65 33 75 74 66 38 43 68 61 72 4c 65 6e  lite3utf8CharLen
bf40: 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a  (zName, nName);.
bf50: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
bf60: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
bf70: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
bf80: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
bf90: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
bfa0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
bfb0: 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
bfc0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
bfd0: 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73  eateView(.  Pars
bfe0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
bff0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
c000: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
c010: 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a   *pBegin,     /*
c020: 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
c030: 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
c040: 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
c050: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
c060: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
c070: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
c080: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
c090: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
c0a0: 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me2,     /* The 
c0b0: 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
c0c0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
c0d0: 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63   view */.  Selec
c0e0: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a  t *pSelect,   /*
c0f0: 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   A SELECT statem
c100: 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ent that will be
c110: 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65  come the new vie
c120: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
c130: 70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55  p         /* TRU
c140: 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52  E for a TEMPORAR
c150: 59 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54  Y view */.){.  T
c160: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  able *p;.  int n
c170: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
c180: 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f  ed char *z;.  To
c190: 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69  ken sEnd;.  DbFi
c1a0: 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65  xer sFix;.  Toke
c1b0: 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  n *pName;.  int 
c1c0: 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  iDb;..  if( pPar
c1d0: 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20  se->nVar>0 ){.  
c1e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
c1f0: 67 28 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d  g(pParse, "param
c200: 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c  eters are not al
c210: 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22 29  lowed in views")
c220: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
c230: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
c240: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
c250: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61    }.  sqlite3Sta
c260: 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  rtTable(pParse, 
c270: 70 42 65 67 69 6e 2c 20 70 4e 61 6d 65 31 2c 20  pBegin, pName1, 
c280: 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20  pName2, isTemp, 
c290: 31 2c 20 30 29 3b 0a 20 20 70 20 3d 20 70 50 61  1, 0);.  p = pPa
c2a0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
c2b0: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50    if( p==0 || pP
c2c0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
c2d0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
c2e0: 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a  elete(pSelect);.
c2f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
c300: 20 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74    sqlite3TwoPart
c310: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
c320: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
c330: 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71  ame);.  iDb = sq
c340: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
c350: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
c360: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 69 66  ->pSchema);.  if
c370: 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74  ( sqlite3FixInit
c380: 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
c390: 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61  iDb, "view", pNa
c3a0: 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74  me).    && sqlit
c3b0: 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69  e3FixSelect(&sFi
c3c0: 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b  x, pSelect).  ){
c3d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
c3e0: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
c3f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
c400: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20   }..  /* Make a 
c410: 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69  copy of the enti
c420: 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  re SELECT statem
c430: 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
c440: 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20   the view..  ** 
c450: 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20  This will force 
c460: 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b  all the Expr.tok
c470: 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62  en.z values to b
c480: 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20  e dynamically.  
c490: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74  ** allocated rat
c4a0: 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74  her than point t
c4b0: 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  o the input stri
c4c0: 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73  ng - which means
c4d0: 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20   that.  ** they 
c4e0: 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74  will persist aft
c4f0: 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  er the current s
c500: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61  qlite3_exec() ca
c510: 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f  ll returns..  */
c520: 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20  .  p->pSelect = 
c530: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
c540: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  (pSelect);.  sql
c550: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
c560: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28  (pSelect);.  if(
c570: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61   sqlite3MallocFa
c580: 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 72 65  iled() ){.    re
c590: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
c5a0: 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69  !pParse->db->ini
c5b0: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71  t.busy ){.    sq
c5c0: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
c5d0: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
c5e0: 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  p);.  }..  /* Lo
c5f0: 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  cate the end of 
c600: 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20  the CREATE VIEW 
c610: 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65  statement.  Make
c620: 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20   sEnd point to. 
c630: 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a   ** the end..  *
c640: 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73  /.  sEnd = pPars
c650: 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20  e->sLastToken;. 
c660: 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d   if( sEnd.z[0]!=
c670: 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d  0 && sEnd.z[0]!=
c680: 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e  ';' ){.    sEnd.
c690: 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d  z += sEnd.n;.  }
c6a0: 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20  .  sEnd.n = 0;. 
c6b0: 20 6e 20 3d 20 73 45 6e 64 2e 7a 20 2d 20 70 42   n = sEnd.z - pB
c6c0: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 28  egin->z;.  z = (
c6d0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
c6e0: 68 61 72 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a  har*)pBegin->z;.
c6f0: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
c700: 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20  (z[n-1]==';' || 
c710: 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29  isspace(z[n-1]))
c720: 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e   ){ n--; }.  sEn
c730: 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20  d.z = &z[n-1];. 
c740: 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20   sEnd.n = 1;..  
c750: 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e  /* Use sqlite3En
c760: 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20  dTable() to add 
c770: 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20  the view to the 
c780: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
c790: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
c7a0: 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  EndTable(pParse,
c7b0: 20 30 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20   0, &sEnd, 0);. 
c7c0: 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69   return;.}.#endi
c7d0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
c7e0: 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65  _VIEW */..#ifnde
c7f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
c800: 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62  EW./*.** The Tab
c810: 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61  le structure pTa
c820: 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ble is really a 
c830: 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74  VIEW.  Fill in t
c840: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  he names of.** t
c850: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
c860: 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54  e view in the pT
c870: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20  able structure. 
c880: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
c890: 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e  er.** of errors.
c8a0: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73    If an error is
c8b0: 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65   seen leave an e
c8c0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
c8d0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
c8e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
c8f0: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
c900: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
c910: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
c920: 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61  .  Table *pSelTa
c930: 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74  b;   /* A fake t
c940: 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  able from which 
c950: 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c  we get the resul
c960: 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63  t set */.  Selec
c970: 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20  t *pSel;     /* 
c980: 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  Copy of the SELE
c990: 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  CT that implemen
c9a0: 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  ts the view */. 
c9b0: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20   int nErr = 0;  
c9c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c9d0: 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
c9e0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ed */.  int n;  
c9f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
ca00: 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74  porarily holds t
ca10: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
ca20: 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f  sors assigned */
ca30: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ..  assert( pTab
ca40: 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f  le );..  /* A po
ca50: 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e  sitive nCol mean
ca60: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61  s the columns na
ca70: 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65  mes for this vie
ca80: 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61  w are.  ** alrea
ca90: 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20  dy known..  */. 
caa0: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
cab0: 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  l>0 ) return 0;.
cac0: 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65  .  /* A negative
cad0: 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69   nCol is a speci
cae0: 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e  al marker meanin
caf0: 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75  g that we are cu
cb00: 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79  rrently.  ** try
cb10: 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  ing to compute t
cb20: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  he column names.
cb30: 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68    If we enter th
cb40: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a  is routine with.
cb50: 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20    ** a negative 
cb60: 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  nCol, it means t
cb70: 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73  wo or more views
cb80: 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69   form a loop, li
cb90: 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  ke this:.  **.  
cba0: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
cbb0: 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54  EW one AS SELECT
cbc0: 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a   * FROM two;.  *
cbd0: 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
cbe0: 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20  W two AS SELECT 
cbf0: 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a  * FROM one;.  **
cc00: 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
cc10: 74 68 69 73 20 65 72 72 6f 72 20 69 73 20 63 61  this error is ca
cc20: 75 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20  ught previously 
cc30: 61 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  and so the follo
cc40: 77 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73  wing test.  ** s
cc50: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69  hould always fai
cc60: 6c 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20  l.  But we will 
cc70: 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63  leave it in plac
cc80: 65 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66  e just to be saf
cc90: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  e..  */.  if( pT
cca0: 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a  able->nCol<0 ){.
ccb0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ccc0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65  Msg(pParse, "vie
ccd0: 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72  w %s is circular
cce0: 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61  ly defined", pTa
ccf0: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  ble->zName);.   
cd00: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
cd10: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
cd20: 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f  >nCol>=0 );..  /
cd30: 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
cd40: 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77   far, it means w
cd50: 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  e need to comput
cd60: 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  e the table name
cd70: 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  s..  ** Note tha
cd80: 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  t the call to sq
cd90: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
cda0: 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78  Select() will ex
cdb0: 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a  pand any.  ** "*
cdc0: 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  " elements in th
cdd0: 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66  e results set of
cde0: 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77 69   the view and wi
cdf0: 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72  ll assign cursor
ce00: 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c  s.  ** to the el
ce10: 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52  ements of the FR
ce20: 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20  OM clause.  But 
ce30: 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  we do not want t
ce40: 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a  hese changes.  *
ce50: 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e  * to be permanen
ce60: 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75  t.  So the compu
ce70: 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f  tation is done o
ce80: 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  n a copy of the 
ce90: 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74  SELECT.  ** stat
cea0: 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e  ement that defin
ceb0: 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a  es the view..  *
cec0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
ced0: 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20  le->pSelect );. 
cee0: 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53   pSel = sqlite3S
cef0: 65 6c 65 63 74 44 75 70 28 70 54 61 62 6c 65 2d  electDup(pTable-
cf00: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28  >pSelect);.  if(
cf10: 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 6e 20 3d   pSel ){.    n =
cf20: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
cf30: 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
cf40: 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
cf50: 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72  Parse, pSel->pSr
cf60: 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  c);.    pTable->
cf70: 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 70  nCol = -1;.    p
cf80: 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
cf90: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
cfa0: 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65  t(pParse, 0, pSe
cfb0: 6c 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  l);.    pParse->
cfc0: 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66  nTab = n;.    if
cfd0: 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20  ( pSelTab ){.   
cfe0: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c     assert( pTabl
cff0: 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  e->aCol==0 );.  
d000: 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
d010: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c   = pSelTab->nCol
d020: 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ;.      pTable->
d030: 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
d040: 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c  aCol;.      pSel
d050: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
d060: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43       pSelTab->aC
d070: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ol = 0;.      sq
d080: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
d090: 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  (0, pSelTab);.  
d0a0: 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68      pTable->pSch
d0b0: 65 6d 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42  ema->flags |= DB
d0c0: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20  _UnresetViews;. 
d0d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d0e0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
d0f0: 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  ;.      nErr++;.
d100: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
d110: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
d120: 65 6c 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  el);.  } else {.
d130: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a      nErr++;.  }.
d140: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
d150: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
d160: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
d170: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d180: 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
d190: 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
d1a0: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65  n names from eve
d1b0: 72 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62  ry VIEW in datab
d1c0: 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74  ase idx..*/.stat
d1d0: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69  ic void sqliteVi
d1e0: 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74  ewResetAll(sqlit
d1f0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29  e3 *db, int idx)
d200: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
d210: 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f  .  if( !DbHasPro
d220: 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
d230: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20  B_UnresetViews) 
d240: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
d250: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
d260: 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e  t(&db->aDb[idx].
d270: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
d280: 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73  ); i;i=sqliteHas
d290: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54  hNext(i)){.    T
d2a0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
d2b0: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
d2c0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
d2d0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73  elect ){.      s
d2e0: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
d2f0: 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20  Names(pTab);.   
d300: 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72   }.  }.  DbClear
d310: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
d320: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
d330: 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  s);.}.#else.# de
d340: 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52  fine sqliteViewR
d350: 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e  esetAll(A,B).#en
d360: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
d370: 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_VIEW */../*.*
d380: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d390: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
d3a0: 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20   VDBE to adjust 
d3b0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
d3c0: 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53  ema.** used by S
d3d0: 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62  QLite when the b
d3e0: 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73  tree layer moves
d3f0: 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61   a table root pa
d400: 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d  ge. The.** root-
d410: 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
d420: 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61  or index in data
d430: 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61  base iDb has cha
d440: 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a  nged from iFrom.
d450: 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2f 0a 23 69  ** to iTo..*/.#i
d460: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d470: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69  T_AUTOVACUUM.voi
d480: 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67  d sqlite3RootPag
d490: 65 4d 6f 76 65 64 28 44 62 20 2a 70 44 62 2c 20  eMoved(Db *pDb, 
d4a0: 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
d4b0: 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  To){.  HashElem 
d4c0: 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a  *pElem;.  Hash *
d4d0: 70 48 61 73 68 3b 0a 0a 20 20 70 48 61 73 68 20  pHash;..  pHash 
d4e0: 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  = &pDb->pSchema-
d4f0: 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28  >tblHash;.  for(
d500: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
d510: 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45  First(pHash); pE
d520: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
d530: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
d540: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
d550: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
d560: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
d570: 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d  if( pTab->tnum==
d580: 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
d590: 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Tab->tnum = iTo;
d5a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
d5b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68     }.  }.  pHash
d5c0: 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
d5d0: 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72  ->idxHash;.  for
d5e0: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
d5f0: 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
d600: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
d610: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
d620: 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  )){.    Index *p
d630: 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Idx = sqliteHash
d640: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
d650: 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d   if( pIdx->tnum=
d660: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
d670: 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pIdx->tnum = iTo
d680: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
d690: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
d6a0: 72 74 28 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rt(0);.}.#endif.
d6b0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64  ./*.** Write cod
d6c0: 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74  e to erase the t
d6d0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
d6e0: 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20  age iTable from 
d6f0: 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a  database iDb..**
d700: 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65   Also write code
d710: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73   to modify the s
d720: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
d730: 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  le and internal 
d740: 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72  schema.** if a r
d750: 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74  oot-page of anot
d760: 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
d770: 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d  ed by the btree-
d780: 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20  layer whilst.** 
d790: 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28  erasing iTable (
d7a0: 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
d7b0: 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63  with an auto-vac
d7c0: 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  uum database)..*
d7d0: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  / .static void d
d7e0: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50  estroyRootPage(P
d7f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
d800: 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44  t iTable, int iD
d810: 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
d820: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
d830: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
d840: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d850: 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65  _Destroy, iTable
d860: 2c 20 69 44 62 29 3b 0a 23 69 66 6e 64 65 66 20  , iDb);.#ifndef 
d870: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
d880: 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44  VACUUM.  /* OP_D
d890: 65 73 74 72 6f 79 20 70 75 73 68 65 73 20 61 6e  estroy pushes an
d8a0: 20 69 6e 74 65 67 65 72 20 6f 6e 74 6f 20 74 68   integer onto th
d8b0: 65 20 73 74 61 63 6b 2e 20 49 66 20 74 68 69 73  e stack. If this
d8c0: 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73   integer.  ** is
d8d0: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
d8e0: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
d8f0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
d900: 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20  table moved to. 
d910: 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61   ** location iTa
d920: 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ble. The followi
d930: 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73  ng code modifies
d940: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
d950: 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a  er table to.  **
d960: 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20   reflect this.. 
d970: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 30   **.  ** The "#0
d980: 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20  " in the SQL is 
d990: 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61  a special consta
d9a0: 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68  nt that means wh
d9b0: 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a  atever value.  *
d9c0: 2a 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20  * is on the top 
d9d0: 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 20 53  of the stack.  S
d9e0: 65 65 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  ee sqlite3Regist
d9f0: 65 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a 20  erExpr()..  */. 
da00: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
da10: 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
da20: 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
da30: 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20  SET rootpage=%d 
da40: 57 48 45 52 45 20 23 30 20 41 4e 44 20 72 6f 6f  WHERE #0 AND roo
da50: 74 70 61 67 65 3d 23 30 22 2c 0a 20 20 20 20 20  tpage=#0",.     
da60: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
da70: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
da80: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69  MA_TABLE(iDb), i
da90: 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 7d  Table);.#endif.}
daa0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44  ../*.** Write VD
dab0: 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  BE code to erase
dac0: 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
dad0: 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69  all associated i
dae0: 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a  ndices on disk..
daf0: 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74  ** Code to updat
db00: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
db10: 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69  ter tables and i
db20: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64  nternal schema d
db30: 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e  efinitions.** in
db40: 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67   case a root-pag
db50: 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
db60: 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
db70: 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
db80: 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61  ee layer.** is a
db90: 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20  lso added (this 
dba0: 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20  can happen with 
dbb0: 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
dbc0: 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61  atabase)..*/.sta
dbd0: 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
dbe0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
dbf0: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
dc00: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
dc10: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
dc20: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
dc30: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
dc40: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
dc50: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
dc60: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64  b->pSchema);.  d
dc70: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
dc80: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75  Parse, pTab->tnu
dc90: 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70  m, iDb);.  for(p
dca0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
dcb0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
dcc0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64  x->pNext){.    d
dcd0: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
dce0: 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75  Parse, pIdx->tnu
dcf0: 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c  m, iDb);.  }.#el
dd00: 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  se.  /* If the d
dd10: 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61  atabase may be a
dd20: 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62  uto-vacuum capab
dd30: 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d  le (if SQLITE_OM
dd40: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
dd50: 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  ** is not define
dd60: 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69  d), then it is i
dd70: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c  mportant to call
dd80: 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74   OP_Destroy on t
dd90: 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e  he.  ** table an
dda0: 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67  d index root-pag
ddb0: 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61  es in order, sta
ddc0: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e  rting with the n
ddd0: 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a  umerically .  **
dde0: 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
ddf0: 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20  ge number. This 
de00: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
de10: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74  none of the root
de20: 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  -pages.  ** to b
de30: 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72  e destroyed is r
de40: 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65  elocated by an e
de50: 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f  arlier OP_Destro
de60: 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20  y. i.e. if the. 
de70: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65   ** following we
de80: 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20  re coded:.  **. 
de90: 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34   ** OP_Destroy 4
dea0: 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a   0.  ** ....  **
deb0: 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a   OP_Destroy 5 0.
dec0: 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f    **.  ** and ro
ded0: 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e  ot page 5 happen
dee0: 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72  ed to be the lar
def0: 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
df00: 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a  umber in the.  *
df10: 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  * database, then
df20: 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75   root page 5 wou
df30: 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70  ld be moved to p
df40: 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20  age 4 by the .  
df50: 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34  ** "OP_Destroy 4
df60: 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20   0" opcode. The 
df70: 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44  subsequent "OP_D
df80: 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c  estroy 5 0" woul
df90: 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65  d hit.  ** a fre
dfa0: 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a  e-list page..  *
dfb0: 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
dfc0: 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74  Tab->tnum;.  int
dfd0: 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b   iDestroyed = 0;
dfe0: 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
dff0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
e000: 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73  .    int iLarges
e010: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
e020: 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c  iDestroyed==0 ||
e030: 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64   iTab<iDestroyed
e040: 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65   ){.      iLarge
e050: 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d  st = iTab;.    }
e060: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
e070: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
e080: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
e090: 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  xt){.      int i
e0a0: 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d  Idx = pIdx->tnum
e0b0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e0c0: 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  pIdx->pSchema==p
e0d0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
e0e0: 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74        if( (iDest
e0f0: 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64  royed==0 || (iId
e100: 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26  x<iDestroyed)) &
e110: 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20  & iIdx>iLargest 
e120: 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67  ){.        iLarg
e130: 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20  est = iIdx;.    
e140: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
e150: 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b  ( iLargest==0 ){
e160: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
e170: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e180: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
e190: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
e1a0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
e1b0: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
e1c0: 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
e1d0: 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73  (pParse, iLarges
e1e0: 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69  t, iDb);.      i
e1f0: 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72  Destroyed = iLar
e200: 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gest;.    }.  }.
e210: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
e220: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
e230: 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65  called to do the
e240: 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20   work of a DROP 
e250: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
e260: 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65  .** pName is the
e270: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
e280: 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64  le to be dropped
e290: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e2a0: 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65  3DropTable(Parse
e2b0: 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
e2c0: 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73  t *pName, int is
e2d0: 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29  View, int noErr)
e2e0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
e2f0: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
e300: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
e310: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
e320: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
e330: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
e340: 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
e350: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
e360: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
e370: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
e380: 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70  ->nSrc==1 );.  p
e390: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
e3a0: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
e3b0: 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
e3c0: 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
e3d0: 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20 69  zDatabase);..  i
e3e0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
e3f0: 20 20 69 66 28 20 6e 6f 45 72 72 20 29 7b 0a 20    if( noErr ){. 
e400: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
e410: 72 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  rClear(pParse);.
e420: 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 65      }.    goto e
e430: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
e440: 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
e450: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
e460: 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
e470: 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ma);.  assert( i
e480: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
e490: 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65 66 20  >nDb );.#ifndef 
e4a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
e4b0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
e4c0: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
e4d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
e4e0: 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
e4f0: 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  iDb);.    const 
e500: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
e510: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
e520: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
e530: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
e540: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
e550: 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a  zTab, 0, zDb)){.
e560: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
e570: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
e580: 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
e590: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f   ){.      if( !O
e5a0: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
e5b0: 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
e5c0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
e5d0: 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  OP_TEMP_VIEW;.  
e5e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e5f0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
e600: 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20  _DROP_VIEW;.    
e610: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
e620: 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
e630: 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
e640: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
e650: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
e660: 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
e670: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
e680: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
e690: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
e6a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
e6b0: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
e6c0: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
e6d0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  ab->zName, 0, zD
e6e0: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
e6f0: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
e700: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e710: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
e720: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
e730: 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e  DELETE, pTab->zN
e740: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
e750: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
e760: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
e770: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
e780: 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c  f( pTab->readOnl
e790: 79 20 7c 7c 20 70 54 61 62 3d 3d 64 62 2d 3e 61  y || pTab==db->a
e7a0: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
e7b0: 3e 70 53 65 71 54 61 62 20 29 7b 0a 20 20 20 20  >pSeqTab ){.    
e7c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
e7d0: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
e7e0: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f  s may not be dro
e7f0: 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  pped", pTab->zNa
e800: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
e810: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
e820: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
e830: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
e840: 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41  * Ensure DROP TA
e850: 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20  BLE is not used 
e860: 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44  on a view, and D
e870: 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20  ROP VIEW is not 
e880: 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74  used.  ** on a t
e890: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
e8a0: 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d   isView && pTab-
e8b0: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
e8c0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
e8d0: 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
e8e0: 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65  DROP TABLE to de
e8f0: 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20  lete table %s", 
e900: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
e910: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
e920: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  _table;.  }.  if
e930: 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61  ( !isView && pTa
e940: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
e950: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
e960: 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
e970: 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65  ROP VIEW to dele
e980: 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61  te view %s", pTa
e990: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
e9a0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
e9b0: 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ble;.  }.#endif.
e9c0: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
e9d0: 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
e9e0: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
e9f0: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20   master table.  
ea00: 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  ** on disk..  */
ea10: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
ea20: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
ea30: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72   if( v ){.    Tr
ea40: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
ea50: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
ea60: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
ea70: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
ea80: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
ea90: 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 20  rse, 0, iDb);.. 
eaa0: 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74     /* Drop all t
eab0: 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74  riggers associat
eac0: 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
ead0: 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
eae0: 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73 20   Code.    ** is 
eaf0: 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d  generated to rem
eb00: 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ove entries from
eb10: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61   sqlite_master a
eb20: 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c  nd/or.    ** sql
eb30: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
eb40: 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  if required..   
eb50: 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72   */.    pTrigger
eb60: 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65   = pTab->pTrigge
eb70: 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54  r;.    while( pT
eb80: 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20  rigger ){.      
eb90: 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
eba0: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
ebb0: 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20  >pSchema || .   
ebc0: 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d         pTrigger-
ebd0: 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
ebe0: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
ebf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f        sqlite3Dro
ec00: 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72  pTriggerPtr(pPar
ec10: 73 65 2c 20 70 54 72 69 67 67 65 72 2c 20 31 29  se, pTrigger, 1)
ec20: 3b 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72  ;.      pTrigger
ec30: 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
ec40: 78 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  xt;.    }..#ifnd
ec50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
ec60: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
ec70: 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65   /* Remove any e
ec80: 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71  ntries of the sq
ec90: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
eca0: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
ecb0: 69 74 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  ith.    ** the t
ecc0: 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
ecd0: 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  ed. This is done
ece0: 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c   before the tabl
ecf0: 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 20  e is dropped.   
ed00: 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65   ** at the btree
ed10: 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20   level, in case 
ed20: 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
ed30: 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20  nce table needs 
ed40: 74 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61  to.    ** move a
ed50: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
ed60: 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70  e drop (can happ
ed70: 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  en in auto-vacuu
ed80: 6d 20 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a  m mode)..    */.
ed90: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 75      if( pTab->au
eda0: 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 73  toInc ){.      s
edb0: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
edc0: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
edd0: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
ede0: 73 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  s.sqlite_sequenc
edf0: 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  e WHERE name=%Q"
ee00: 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  ,.        pDb->z
ee10: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
ee20: 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
ee30: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
ee40: 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f  Drop all SQLITE_
ee50: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64  MASTER table and
ee60: 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74   index entries t
ee70: 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
ee80: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54  .    ** table. T
ee90: 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20  he program name 
eea0: 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68  loops through th
eeb0: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e master table a
eec0: 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a  nd deletes.    *
eed0: 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74  * every row that
eee0: 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
eef0: 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  le of the same n
ef00: 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62  ame as the one b
ef10: 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70  eing.    ** drop
ef20: 70 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72  ped. Triggers ar
ef30: 65 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61  e handled sepera
ef40: 74 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74  tely because a t
ef50: 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20  rigger can be.  
ef60: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20    ** created in 
ef70: 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
ef80: 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  e that refers to
ef90: 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74   a table in anot
efa0: 68 65 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  her.    ** datab
efb0: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
efc0: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
efd0: 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
efe0: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
eff0: 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c   %Q.%s WHERE tbl
f000: 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70  _name=%Q and typ
f010: 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20  e!='trigger'",. 
f020: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d         pDb->zNam
f030: 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
f040: 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  iDb), pTab->zNam
f050: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56  e);.    if( !isV
f060: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 64 65 73  iew ){.      des
f070: 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65  troyTable(pParse
f080: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 0a  , pTab);.    }..
f090: 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
f0a0: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72  e table entry fr
f0b0: 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65  om SQLite's inte
f0c0: 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20  rnal schema and 
f0d0: 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a 20 74 68  modify.    ** th
f0e0: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
f0f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
f100: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
f110: 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c  _DropTable, iDb,
f120: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   0, pTab->zName,
f130: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
f140: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
f150: 20 76 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20   v, iDb);.  }.  
f160: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
f170: 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78  ll(db, iDb);..ex
f180: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20  it_drop_table:. 
f190: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
f1a0: 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a  elete(pName);.}.
f1b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
f1c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
f1d0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f   create a new fo
f1e0: 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65  reign key on the
f1f0: 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e   table.** curren
f200: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
f210: 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f  uction.  pFromCo
f220: 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  l determines whi
f230: 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  ch columns.** in
f240: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
f250: 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  le point to the 
f260: 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66  foreign key.  If
f270: 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65   pFromCol==0 the
f280: 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65  n.** connect the
f290: 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74   key to the last
f2a0: 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64   column inserted
f2b0: 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61  .  pTo is the na
f2c0: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62  me of.** the tab
f2d0: 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20  le referred to. 
f2e0: 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73   pToCol is a lis
f2f0: 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  t of tables in t
f300: 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20  he other.** pTo 
f310: 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66  table that the f
f320: 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74  oreign key point
f330: 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e  s to.  flags con
f340: 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66  tains all.** inf
f350: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
f360: 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  he conflict reso
f370: 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
f380: 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69  s specified.** i
f390: 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c  n the ON DELETE,
f3a0: 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f   ON UPDATE and O
f3b0: 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73  N INSERT clauses
f3c0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20  ..**.** An FKey 
f3d0: 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
f3e0: 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74  ated and added t
f3f0: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
f400: 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63  ently.** under c
f410: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74  onstruction in t
f420: 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  he pParse->pNewT
f430: 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65  able field.  The
f440: 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20   new FKey.** is 
f450: 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20  not linked into 
f460: 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69  db->aFKey at thi
f470: 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64  s point - that d
f480: 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a  oes not happen.*
f490: 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 45  * until sqlite3E
f4a0: 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a  ndTable()..**.**
f4b0: 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   The foreign key
f4c0: 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45   is set for IMME
f4d0: 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67  DIATE processing
f4e0: 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  .  A subsequent 
f4f0: 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  call.** to sqlit
f500: 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
f510: 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65  y() might change
f520: 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45   this to DEFERRE
f530: 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  D..*/.void sqlit
f540: 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b  e3CreateForeignK
f550: 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
f560: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
f570: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
f580: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72  .  ExprList *pFr
f590: 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d  omCol,  /* Colum
f5a0: 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65  ns in this table
f5b0: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
f5c0: 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
f5d0: 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20  Token *pTo,     
f5e0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
f5f0: 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
f600: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
f610: 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c  ToCol,    /* Col
f620: 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65  umns in the othe
f630: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  r table */.  int
f640: 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
f650: 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
f660: 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
f670: 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  hms. */.){.#ifnd
f680: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
f690: 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65  OREIGN_KEY.  FKe
f6a0: 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20  y *pFKey = 0;.  
f6b0: 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73  Table *p = pPars
f6c0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
f6d0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  int nByte;.  int
f6e0: 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a   i;.  int nCol;.
f6f0: 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73    char *z;..  as
f700: 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a  sert( pTo!=0 );.
f710: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50    if( p==0 || pP
f720: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
f730: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20  o fk_end;.  if( 
f740: 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
f750: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
f760: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28  >nCol-1;.    if(
f770: 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66   iCol<0 ) goto f
f780: 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70  k_end;.    if( p
f790: 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
f7a0: 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
f7b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
f7c0: 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65  sg(pParse, "fore
f7d0: 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20  ign key on %s". 
f7e0: 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64          " should
f7f0: 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20   reference only 
f800: 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  one column of ta
f810: 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20  ble %T",.       
f820: 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e    p->aCol[iCol].
f830: 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20  zName, pTo);.   
f840: 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
f850: 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d      }.    nCol =
f860: 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
f870: 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
f880: 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f  ->nExpr!=pFromCo
f890: 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  l->nExpr ){.    
f8a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f8b0: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
f8c0: 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d  "number of colum
f8d0: 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  ns in foreign ke
f8e0: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
f8f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22   the number of "
f900: 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e  .        "column
f910: 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e  s in the referen
f920: 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20  ced table");.   
f930: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
f940: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20  }else{.    nCol 
f950: 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  = pFromCol->nExp
f960: 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  r;.  }.  nByte =
f970: 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20   sizeof(*pFKey) 
f980: 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46  + nCol*sizeof(pF
f990: 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20  Key->aCol[0]) + 
f9a0: 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66  pTo->n + 1;.  if
f9b0: 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
f9c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f  for(i=0; i<pToCo
f9d0: 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  l->nExpr; i++){.
f9e0: 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73        nByte += s
f9f0: 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b  trlen(pToCol->a[
fa00: 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
fa10: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
fa20: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
fa30: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
fa40: 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20  pFKey==0 ) goto 
fa50: 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d  fk_end;.  pFKey-
fa60: 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46  >pFrom = p;.  pF
fa70: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d  Key->pNextFrom =
fa80: 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d   p->pFKey;.  z =
fa90: 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31   (char*)&pFKey[1
faa0: 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  ];.  pFKey->aCol
fab0: 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d   = (struct sColM
fac0: 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69  ap*)z;.  z += si
fad0: 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c  zeof(struct sCol
fae0: 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b  Map)*nCol;.  pFK
faf0: 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d  ey->zTo = z;.  m
fb00: 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c  emcpy(z, pTo->z,
fb10: 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54   pTo->n);.  z[pT
fb20: 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b  o->n] = 0;.  z +
fb30: 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46  = pTo->n+1;.  pF
fb40: 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30  Key->pNextTo = 0
fb50: 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20  ;.  pFKey->nCol 
fb60: 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46  = nCol;.  if( pF
fb70: 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
fb80: 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e   pFKey->aCol[0].
fb90: 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  iFrom = p->nCol-
fba0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
fbb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
fbc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
fbd0: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
fbe0: 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b  0; j<p->nCol; j+
fbf0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
fc00: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
fc10: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
fc20: 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
fc30: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
fc40: 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43         pFKey->aC
fc50: 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b  ol[i].iFrom = j;
fc60: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
fc70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fc80: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e    }.      if( j>
fc90: 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  =p->nCol ){.    
fca0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
fcb0: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
fcc0: 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20         "unknown 
fcd0: 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e  column \"%s\" in
fce0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
fcf0: 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20  inition", .     
fd00: 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61       pFromCol->a
fd10: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
fd20: 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
fd30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
fd40: 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20   }.  if( pToCol 
fd50: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
fd60: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
fd70: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
fd80: 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  en(pToCol->a[i].
fd90: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
fda0: 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
fdb0: 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d  l = z;.      mem
fdc0: 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  cpy(z, pToCol->a
fdd0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  [i].zName, n);. 
fde0: 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20       z[n] = 0;. 
fdf0: 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20       z += n+1;. 
fe00: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
fe10: 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30  ->isDeferred = 0
fe20: 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74  ;.  pFKey->delet
fe30: 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20  eConf = flags & 
fe40: 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75  0xff;.  pFKey->u
fe50: 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61  pdateConf = (fla
fe60: 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66  gs >> 8 ) & 0xff
fe70: 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72  ;.  pFKey->inser
fe80: 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e  tConf = (flags >
fe90: 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a  > 16 ) & 0xff;..
fea0: 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
feb0: 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
fec0: 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
fed0: 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
fee0: 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
fef0: 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
ff00: 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
ff10: 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 23 65 6e  Free(pFKey);.#en
ff20: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
ff30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
ff40: 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71  IGN_KEY) */.  sq
ff50: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
ff60: 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20  ete(pFromCol);. 
ff70: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ff80: 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a  Delete(pToCol);.
ff90: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
ffa0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
ffb0: 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c  when an INITIALL
ffc0: 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49  Y IMMEDIATE or I
ffd0: 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
ffe0: 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73  D.** clause is s
fff0: 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61  een as part of a
10000 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
10010 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73  inition.  The is
10020 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61  Deferred.** para
10030 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49  meter is 1 for I
10040 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
10050 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54  D and 0 for INIT
10060 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e  IALLY IMMEDIATE.
10070 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72  .** The behavior
10080 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
10090 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f  ently created fo
100a0 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a  reign key is adj
100b0 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69  usted.** accordi
100c0 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ngly..*/.void sq
100d0 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
100e0 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72  nKey(Parse *pPar
100f0 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72  se, int isDeferr
10100 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ed){.#ifndef SQL
10110 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
10120 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54  _KEY.  Table *pT
10130 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  ab;.  FKey *pFKe
10140 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d  y;.  if( (pTab =
10150 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
10160 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79  le)==0 || (pFKey
10170 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d   = pTab->pFKey)=
10180 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
10190 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
101a0 20 3d 20 69 73 44 65 66 65 72 72 65 64 3b 0a 23   = isDeferred;.#
101b0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  endif.}../*.** G
101c0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
101d0 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64  t will erase and
101e0 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70   refill index *p
101f0 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  Idx.  This is.**
10200 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c   used to initial
10210 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61  ize a newly crea
10220 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20  ted index or to 
10230 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  recompute the.**
10240 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69   content of an i
10250 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65  ndex in response
10260 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f   to a REINDEX co
10270 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20  mmand..**.** if 
10280 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e  memRootPage is n
10290 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20  ot negative, it 
102a0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 69  means that the i
102b0 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a  ndex is newly.**
102c0 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 6d   created.  The m
102d0 65 6d 6f 72 79 20 63 65 6c 6c 20 73 70 65 63 69  emory cell speci
102e0 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50  fied by memRootP
102f0 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  age contains the
10300 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  .** root page nu
10310 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
10320 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61  x.  If memRootPa
10330 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
10340 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65  then.** the inde
10350 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
10360 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65   and must be cle
10370 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ared before bein
10380 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a  g refilled and.*
10390 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * the root page 
103a0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
103b0 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  dex is taken fro
103c0 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a  m pIndex->tnum..
103d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
103e0 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
103f0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
10400 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20   Index *pIndex, 
10410 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29  int memRootPage)
10420 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
10430 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
10440 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  ;  /* The table 
10450 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20  that is indexed 
10460 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
10470 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 20 20 20  pParse->nTab;   
10480 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
10490 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61  sor used for pTa
104a0 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20  b */.  int iIdx 
104b0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 31  = pParse->nTab+1
104c0 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63  ;     /* Btree c
104d0 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
104e0 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61  Index */.  int a
104f0 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  ddr1;           
10500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
10510 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c  ress of top of l
10520 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75  oop */.  int tnu
10530 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
10540 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
10550 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  page of index */
10560 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
10570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10580 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
10590 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72  de into this vir
105a0 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a  tual machine */.
105b0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b    KeyInfo *pKey;
105c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105d0 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20   /* KeyInfo for 
105e0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
105f0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
10600 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
10610 2d 3e 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  ->db, pIndex->pS
10620 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
10630 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
10640 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
10650 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
10660 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
10670 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78  _REINDEX, pIndex
10680 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20  ->zName, 0,.    
10690 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44    pParse->db->aD
106a0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29  b[iDb].zName ) )
106b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
106c0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
106d0 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  equire a write-l
106e0 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
106f0 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73   to perform this
10700 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
10710 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
10720 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
10730 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61  ab->tnum, 1, pTa
10740 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20  b->zName);..  v 
10750 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
10760 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
10770 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
10780 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
10790 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
107a0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
107b0 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 52 6f  P_MemLoad, memRo
107c0 6f 74 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  otPage, 0);.    
107d0 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tnum = 0;.  }els
107e0 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49  e{.    tnum = pI
107f0 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20  ndex->tnum;.    
10800 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10810 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e  (v, OP_Clear, tn
10820 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20  um, iDb);.  }.  
10830 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10840 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
10850 69 44 62 2c 20 30 29 3b 0a 20 20 70 4b 65 79 20  iDb, 0);.  pKey 
10860 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
10870 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
10880 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  ndex);.  sqlite3
10890 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
108a0 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74  enWrite, iIdx, t
108b0 6e 75 6d 2c 20 28 63 68 61 72 20 2a 29 70 4b 65  num, (char *)pKe
108c0 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  y, P3_KEYINFO_HA
108d0 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74 65  NDOFF);.  sqlite
108e0 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
108f0 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
10900 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
10910 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
10920 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10930 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
10940 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65   0);.  sqlite3Ge
10950 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 76  nerateIndexKey(v
10960 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62 29 3b  , pIndex, iTab);
10970 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f  .  if( pIndex->o
10980 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
10990 29 7b 0a 20 20 20 20 69 6e 74 20 63 75 72 61 64  ){.    int curad
109a0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
109b0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
109c0 20 20 20 20 69 6e 74 20 61 64 64 72 32 20 3d 20      int addr2 = 
109d0 63 75 72 61 64 64 72 2b 34 3b 0a 20 20 20 20 73  curaddr+4;.    s
109e0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
109f0 50 32 28 76 2c 20 63 75 72 61 64 64 72 2d 31 2c  P2(v, curaddr-1,
10a00 20 61 64 64 72 32 29 3b 0a 20 20 20 20 73 71 6c   addr2);.    sql
10a10 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10a20 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c   OP_Rowid, iTab,
10a30 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
10a40 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10a50 41 64 64 49 6d 6d 2c 20 31 2c 20 30 29 3b 0a 20  AddImm, 1, 0);. 
10a60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10a70 64 4f 70 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71  dOp(v, OP_IsUniq
10a80 75 65 2c 20 69 49 64 78 2c 20 61 64 64 72 32 29  ue, iIdx, addr2)
10a90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10aa0 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  eOp3(v, OP_Halt,
10ab0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
10ac0 4e 54 2c 20 4f 45 5f 41 62 6f 72 74 2c 0a 20 20  NT, OE_Abort,.  
10ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ae0 20 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d    "indexed colum
10af0 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75  ns are not uniqu
10b00 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  e", P3_STATIC);.
10b10 20 20 20 20 61 73 73 65 72 74 28 20 61 64 64 72      assert( addr
10b20 32 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 43 75  2==sqlite3VdbeCu
10b30 72 72 65 6e 74 41 64 64 72 28 76 29 20 29 3b 0a  rrentAddr(v) );.
10b40 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
10b50 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
10b60 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 30 29  Insert, iIdx, 0)
10b70 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
10b80 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
10b90 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b   iTab, addr1+1);
10ba0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
10bb0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
10bc0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
10bd0 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
10be0 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 73 71  , iTab, 0);.  sq
10bf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10c00 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78  , OP_Close, iIdx
10c10 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  , 0);.}../*.** C
10c20 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  reate a new inde
10c30 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62  x for an SQL tab
10c40 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d  le.  pName1.pNam
10c50 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  e2 is the name o
10c60 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  f the index .** 
10c70 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20  and pTblList is 
10c80 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
10c90 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
10ca0 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
10cb0 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
10cc0 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
10cd0 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
10ce0 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
10cf0 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
10d00 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
10d10 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
10d20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
10d30 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
10d40 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
10d50 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
10d60 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
10d70 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
10d80 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
10d90 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
10da0 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
10db0 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
10dc0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
10dd0 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
10de0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
10df0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
10e00 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
10e10 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
10e20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
10e30 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
10e40 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
10e50 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
10e60 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
10e70 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
10e80 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
10e90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10ea0 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
10eb0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10ec0 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61    /* All informa
10ed0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
10ee0 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  parse */.  Token
10ef0 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
10f00 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69   First part of i
10f10 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
10f20 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  e NULL */.  Toke
10f30 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
10f40 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
10f50 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
10f60 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72   be NULL */.  Sr
10f70 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c  cList *pTblName,
10f80 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64   /* Table to ind
10f90 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e  ex. Use pParse->
10fa0 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a  pNewTable if 0 *
10fb0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
10fc0 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74  ist,   /* A list
10fd0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
10fe0 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
10ff0 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
11000 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
11010 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
11020 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
11030 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
11040 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  art,     /* The 
11050 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
11060 74 20 62 65 67 69 6e 73 20 61 20 43 52 45 41 54  t begins a CREAT
11070 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
11080 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45  t */.  Token *pE
11090 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  nd,       /* The
110a0 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73   ")" that closes
110b0 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
110c0 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  X statement */. 
110d0 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20   int sortOrder, 
110e0 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65      /* Sort orde
110f0 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79  r of primary key
11100 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c   when pList==NUL
11110 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74  L */.  int ifNot
11120 45 78 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69  Exist     /* Omi
11130 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78  t error if index
11140 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
11150 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
11160 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Tab = 0;     /* 
11170 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
11180 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
11190 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a  pIndex = 0;   /*
111a0 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
111b0 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68   created */.  ch
111c0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20  ar *zName = 0;  
111d0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
111e0 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
111f0 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
11200 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
11210 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61  haracters in zNa
11220 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  me */.  int i, j
11230 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64  ;.  Token nullId
11240 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65  ;        /* Fake
11250 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d   token for an em
11260 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20  pty ID list */. 
11270 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20   DbFixer sFix;  
11280 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73        /* For ass
11290 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  igning database 
112a0 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20  names to pTable 
112b0 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
112c0 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74  erMask;   /* 1 t
112d0 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20  o honor DESC in 
112e0 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e  index.  0 to ign
112f0 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ore. */.  sqlite
11300 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
11310 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  db;.  Db *pDb;  
11320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11330 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65  e specific table
11340 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
11350 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65  indexed database
11360 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
11370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
11380 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
11390 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e  ase that is bein
113a0 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54  g written */.  T
113b0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
113c0 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
113d0 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  ed name of the i
113e0 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a  ndex to create *
113f0 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  /.  struct ExprL
11400 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49  ist_item *pListI
11410 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  tem; /* For loop
11420 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a  ing over pList *
11430 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  /.  int nCol;.  
11440 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a  int nExtra = 0;.
11450 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a    char *zExtra;.
11460 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
11470 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61  Err || sqlite3Ma
11480 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a  llocFailed() ){.
11490 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
114a0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
114b0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
114c0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
114d0 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
114e0 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69    Return early i
114f0 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  f not found..  *
11500 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65  /.  if( pTblName
11510 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55  !=0 ){..    /* U
11520 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20  se the two-part 
11530 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65  index name to de
11540 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61  termine the data
11550 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20  base .    ** to 
11560 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74  search for the t
11570 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20  able. 'Fix' the 
11580 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
11590 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66  is db.    ** bef
115a0 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74  ore looking up t
115b0 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  he table..    */
115c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
115d0 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b  me1 && pName2 );
115e0 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
115f0 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
11600 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
11610 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
11620 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67     if( iDb<0 ) g
11630 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
11640 69 6e 64 65 78 3b 0a 0a 23 69 66 6e 64 65 66 20  index;..#ifndef 
11650 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50  SQLITE_OMIT_TEMP
11660 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  DB.    /* If the
11670 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20   index name was 
11680 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65  unqualified, che
11690 63 6b 20 69 66 20 74 68 65 20 74 68 65 20 74 61  ck if the the ta
116a0 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  ble.    ** is a 
116b0 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73  temp table. If s
116c0 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  o, set the datab
116d0 61 73 65 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2f  ase to 1..    */
116e0 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
116f0 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70  te3SrcListLookup
11700 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d  (pParse, pTblNam
11710 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d  e);.    if( pNam
11720 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d  e2 && pName2->n=
11730 3d 30 20 26 26 20 70 54 61 62 20 26 26 20 70 54  =0 && pTab && pT
11740 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  ab->pSchema==db-
11750 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
11760 29 7b 0a 20 20 20 20 20 20 69 44 62 20 3d 20 31  ){.      iDb = 1
11770 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
11780 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
11790 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50  ixInit(&sFix, pP
117a0 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65  arse, iDb, "inde
117b0 78 22 2c 20 70 4e 61 6d 65 29 20 26 26 0a 20 20  x", pName) &&.  
117c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 78        sqlite3Fix
117d0 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70  SrcList(&sFix, p
117e0 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20 29 7b 0a  TblName).    ){.
117f0 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
11800 20 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e 73   the parser cons
11810 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d 65 20  tructs pTblName 
11820 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69 64  from a single id
11830 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20 20 20  entifier,.      
11840 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  ** sqlite3FixSrc
11850 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72 20 66  List can never f
11860 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ail. */.      as
11870 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20  sert(0);.    }. 
11880 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
11890 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
118a0 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61  rse, pTblName->a
118b0 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  [0].zName, .    
118c0 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b      pTblName->a[
118d0 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
118e0 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67     if( !pTab ) g
118f0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
11900 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72  index;.    asser
11910 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t( db->aDb[iDb].
11920 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
11930 53 63 68 65 6d 61 20 29 3b 0a 20 20 7d 65 6c 73  Schema );.  }els
11940 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
11950 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Name==0 );.    p
11960 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
11970 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28  ewTable;.    if(
11980 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78   !pTab ) goto ex
11990 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
119a0 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
119b0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
119c0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
119d0 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20  a);.  }.  pDb = 
119e0 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a  &db->aDb[iDb];..
119f0 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c    if( pTab==0 ||
11a00 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
11a10 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
11a20 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54  _index;.  if( pT
11a30 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  ab->readOnly ){.
11a40 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11a50 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
11a60 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65  le %s may not be
11a70 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d   indexed", pTab-
11a80 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
11a90 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
11aa0 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  dex;.  }.#ifndef
11ab0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
11ac0 57 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53  W.  if( pTab->pS
11ad0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
11ae0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11af0 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20  rse, "views may 
11b00 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
11b10 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
11b20 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11b30 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20  }.#endif..  /*. 
11b40 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d   ** Find the nam
11b50 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  e of the index. 
11b60 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
11b70 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
11b80 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64  another.  ** ind
11b90 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68  ex or table with
11ba0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
11bb0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65   .  **.  ** Exce
11bc0 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72  ption:  If we ar
11bd0 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61  e reading the na
11be0 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74  mes of permanent
11bf0 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68   indices from th
11c00 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  e.  ** sqlite_ma
11c10 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61  ster table (beca
11c20 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  use some other p
11c30 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74  rocess changed t
11c40 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20  he schema) and. 
11c50 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   ** one of the i
11c60 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69  ndex names colli
11c70 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d  des with the nam
11c80 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79  e of a temporary
11c90 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69   table or.  ** i
11ca0 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69  ndex, then we wi
11cb0 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70  ll continue to p
11cc0 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65  rocess this inde
11cd0 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  x..  **.  ** If 
11ce0 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  pName==0 it mean
11cf0 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20  s that we are.  
11d00 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  ** dealing with 
11d10 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
11d20 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
11d30 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  nt.  We have to 
11d40 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20  invent our.  ** 
11d50 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  own name..  */. 
11d60 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
11d70 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
11d80 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
11d90 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 53  Name);.    if( S
11da0 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
11db0 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
11dc0 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  se) ) goto exit_
11dd0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11de0 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
11df0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
11e00 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
11e10 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
11e20 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
11e30 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
11e40 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
11e50 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
11e60 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
11e70 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
11e80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ){.      if( SQL
11e90 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
11ea0 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
11eb0 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  ) ) goto exit_cr
11ec0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
11ed0 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
11ee0 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
11ef0 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30  , pDb->zName)!=0
11f00 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
11f10 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20  !ifNotExist ){. 
11f20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11f30 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11f40 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61   "index %s alrea
11f50 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d  dy exists", zNam
11f60 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
11f70 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
11f80 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
11f90 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
11fa0 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
11fb0 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d  (db, zName, 0)!=
11fc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
11fd0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11fe0 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
11ff0 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e  lready a table n
12000 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29  amed %s", zName)
12010 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
12020 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12030 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
12050 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20  r zBuf[30];.    
12060 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78  int n;.    Index
12070 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72   *pLoop;.    for
12080 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e  (pLoop=pTab->pIn
12090 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b  dex, n=1; pLoop;
120a0 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e   pLoop=pLoop->pN
120b0 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  ext, n++){}.    
120c0 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 5f 25  sprintf(zBuf,"_%
120d0 64 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65  d",n);.    zName
120e0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
120f0 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d  3SetString(&zNam
12100 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69  e, "sqlite_autoi
12110 6e 64 65 78 5f 22 2c 20 70 54 61 62 2d 3e 7a 4e  ndex_", pTab->zN
12120 61 6d 65 2c 20 7a 42 75 66 2c 20 28 63 68 61 72  ame, zBuf, (char
12130 2a 29 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  *)0);.    if( zN
12140 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
12150 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
12160 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
12170 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69   for authorizati
12180 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  on to create an 
12190 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e  index..  */.#ifn
121a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
121b0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
121c0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
121d0 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61   *zDb = pDb->zNa
121e0 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
121f0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
12200 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
12210 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
12220 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29  (iDb), 0, zDb) )
12230 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
12240 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12250 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51      }.    i = SQ
12260 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
12270 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  X;.    if( !OMIT
12280 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
12290 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43  1 ) i = SQLITE_C
122a0 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
122b0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
122c0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
122d0 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61  e, i, zName, pTa
122e0 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
122f0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
12300 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12310 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
12320 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d  ..  /* If pList=
12330 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69  =0, it means thi
12340 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
12350 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70  lled to make a p
12360 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20  rimary.  ** key 
12370 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20  out of the last 
12380 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20  column added to 
12390 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
123a0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20  construction..  
123b0 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66  ** So create a f
123c0 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75  ake list to simu
123d0 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a  late this..  */.
123e0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
123f0 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d  {.    nullId.z =
12400 20 28 75 38 2a 29 70 54 61 62 2d 3e 61 43 6f 6c   (u8*)pTab->aCol
12410 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a  [pTab->nCol-1].z
12420 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64  Name;.    nullId
12430 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68 61  .n = strlen((cha
12440 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20  r*)nullId.z);.  
12450 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
12460 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
12470 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a  0, 0, &nullId);.
12480 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
12490 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
124a0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70  ate_index;.    p
124b0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  List->a[0].sortO
124c0 72 64 65 72 20 3d 20 73 6f 72 74 4f 72 64 65 72  rder = sortOrder
124d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75  ;.  }..  /* Figu
124e0 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
124f0 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
12500 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 73  re required to s
12510 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a  tore explicitly.
12520 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63    ** specified c
12530 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
12540 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20  e names..  */.  
12550 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
12560 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
12570 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
12580 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
12590 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  pr;.    if( pExp
125a0 72 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72  r ){.      nExtr
125b0 61 20 2b 3d 20 28 31 20 2b 20 73 74 72 6c 65 6e  a += (1 + strlen
125c0 28 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a  (pExpr->pColl->z
125d0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Name));.    }.  
125e0 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c  }..  /* .  ** Al
125f0 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
12600 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a   structure. .  *
12610 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c  /.  nName = strl
12620 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 43 6f  en(zName);.  nCo
12630 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  l = pList->nExpr
12640 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  ;.  pIndex = sql
12650 69 74 65 4d 61 6c 6c 6f 63 28 20 0a 20 20 20 20  iteMalloc( .    
12660 20 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20    sizeof(Index) 
12670 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  +              /
12680 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  * Index structur
12690 65 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65  e  */.      size
126a0 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 20 2b 20 20  of(int)*nCol +  
126b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
126c0 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a  x.aiColumn   */.
126d0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74        sizeof(int
126e0 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20  )*(nCol+1) +    
126f0 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f     /* Index.aiRo
12700 77 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20  wEst   */.      
12710 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 2a 6e  sizeof(char *)*n
12720 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 2f 2a 20  Col +        /* 
12730 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20  Index.azColl    
12740 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
12750 28 75 38 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20  (u8)*nCol +     
12760 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
12770 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20  aSortOrder */.  
12780 20 20 20 20 6e 4e 61 6d 65 20 2b 20 31 20 2b 20      nName + 1 + 
12790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127a0 20 2f 2a 20 49 6e 64 65 78 2e 7a 4e 61 6d 65 20   /* Index.zName 
127b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e 45       */.      nE
127c0 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20  xtra            
127d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
127e0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
127f0 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 29 3b 0a 20   names */.  );. 
12800 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c   if( sqlite3Mall
12810 6f 63 46 61 69 6c 65 64 28 29 20 29 20 67 6f 74  ocFailed() ) got
12820 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
12830 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  dex;.  pIndex->a
12840 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 20 2a  iColumn = (int *
12850 29 28 26 70 49 6e 64 65 78 5b 31 5d 29 3b 0a 20  )(&pIndex[1]);. 
12860 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73   pIndex->aiRowEs
12870 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 2a 29  t = (unsigned *)
12880 28 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  (&pIndex->aiColu
12890 6d 6e 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e  mn[nCol]);.  pIn
128a0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63  dex->azColl = (c
128b0 68 61 72 20 2a 2a 29 28 26 70 49 6e 64 65 78 2d  har **)(&pIndex-
128c0 3e 61 69 52 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31  >aiRowEst[nCol+1
128d0 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 53  ]);.  pIndex->aS
128e0 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a  ortOrder = (u8 *
128f0 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  )(&pIndex->azCol
12900 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64  l[nCol]);.  pInd
12910 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  ex->zName = (cha
12920 72 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 53  r *)(&pIndex->aS
12930 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 29 3b  ortOrder[nCol]);
12940 0a 20 20 7a 45 78 74 72 61 20 3d 20 28 63 68 61  .  zExtra = (cha
12950 72 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 7a 4e  r *)(&pIndex->zN
12960 61 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29 3b 0a 20  ame[nName+1]);. 
12970 20 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d 3e   strcpy(pIndex->
12980 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  zName, zName);. 
12990 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20   pIndex->pTable 
129a0 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78  = pTab;.  pIndex
129b0 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73  ->nColumn = pLis
129c0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64  t->nExpr;.  pInd
129d0 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e  ex->onError = on
129e0 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d  Error;.  pIndex-
129f0 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61  >autoIndex = pNa
12a00 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d  me==0;.  pIndex-
12a10 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  >pSchema = db->a
12a20 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
12a30 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
12a40 73 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64  see if we should
12a50 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75   honor DESC requ
12a60 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f  ests on index co
12a70 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28  lumns.  */.  if(
12a80 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66   pDb->pSchema->f
12a90 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b  ile_format>=4 ){
12aa0 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61  .    sortOrderMa
12ab0 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f  sk = -1;   /* Ho
12ac0 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65  nor DESC */.  }e
12ad0 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64  lse{.    sortOrd
12ae0 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f  erMask = 0;    /
12af0 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f  * Ignore DESC */
12b00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20  .  }..  /* Scan 
12b10 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65  the names of the
12b20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
12b30 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
12b40 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61  xed and.  ** loa
12b50 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64  d the column ind
12b60 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e  ices into the In
12b70 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 20  dex structure.  
12b80 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a  Report an error.
12b90 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75    ** if any colu
12ba0 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e  mn is not found.
12bb0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
12bc0 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74   pListItem=pList
12bd0 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  ->a; i<pList->nE
12be0 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49  xpr; i++, pListI
12bf0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  tem++){.    cons
12c00 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65  t char *zColName
12c10 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e   = pListItem->zN
12c20 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  ame;.    Column 
12c30 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 20 20 69 6e  *pTabCol;.    in
12c40 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  t requestedSortO
12c50 72 64 65 72 3b 0a 20 20 20 20 63 68 61 72 20 2a  rder;.    char *
12c60 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zColl;          
12c70 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
12c80 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a  ation sequence *
12c90 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  /..    for(j=0, 
12ca0 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43  pTabCol=pTab->aC
12cb0 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ol; j<pTab->nCol
12cc0 3b 20 6a 2b 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b  ; j++, pTabCol++
12cd0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
12ce0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6c  ite3StrICmp(zCol
12cf0 4e 61 6d 65 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a  Name, pTabCol->z
12d00 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
12d10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12d20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  j>=pTab->nCol ){
12d30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
12d40 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
12d50 74 61 62 6c 65 20 25 73 20 68 61 73 20 6e 6f 20  table %s has no 
12d60 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22  column named %s"
12d70 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
12d80 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29  zName, zColName)
12d90 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
12da0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12db0 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
12dc0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
12dd0 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  j;.    if( pList
12de0 49 74 65 6d 2d 3e 70 45 78 70 72 20 29 7b 0a 20  Item->pExpr ){. 
12df0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
12e00 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70  stItem->pExpr->p
12e10 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 7a 43  Coll );.      zC
12e20 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20  oll = zExtra;.  
12e30 20 20 20 20 73 74 72 63 70 79 28 7a 45 78 74 72      strcpy(zExtr
12e40 61 2c 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45  a, pListItem->pE
12e50 78 70 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  xpr->pColl->zNam
12e60 65 29 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61  e);.      zExtra
12e70 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 43 6f 6c   += (strlen(zCol
12e80 6c 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 65 6c  l) + 1);.    }el
12e90 73 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20  se{.      zColl 
12ea0 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
12eb0 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28  zColl;.      if(
12ec0 20 21 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !zColl ){.     
12ed0 20 20 20 7a 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70     zColl = db->p
12ee0 44 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b  DfltColl->zName;
12ef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12f00 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
12f10 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69 74 65  .busy && !sqlite
12f20 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
12f30 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31  Parse, zColl, -1
12f40 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
12f50 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12f60 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
12f70 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
12f80 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75   zColl;.    requ
12f90 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d  estedSortOrder =
12fa0 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74   pListItem->sort
12fb0 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65  Order & sortOrde
12fc0 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65  rMask;.    pInde
12fd0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
12fe0 20 3d 20 72 65 71 75 65 73 74 65 64 53 6f 72 74   = requestedSort
12ff0 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20 73 71 6c  Order;.  }.  sql
13000 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
13010 74 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66  t(pIndex);..  if
13020 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e  ( pTab==pParse->
13030 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20  pNewTable ){.   
13040 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
13050 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
13060 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75   to create an au
13070 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73  tomatic index as
13080 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74   a.    ** result
13090 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45   of a PRIMARY KE
130a0 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
130b0 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64  se on a column d
130c0 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20  efinition, or.  
130d0 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b    ** a PRIMARY K
130e0 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
130f0 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  use following th
13100 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  e column definit
13110 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65  ions..    ** i.e
13120 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a  . one of:.    **
13130 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
13140 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59  ABLE t(x PRIMARY
13150 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a   KEY, y);.    **
13160 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
13170 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20  x, y, UNIQUE(x, 
13180 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  y));.    **.    
13190 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63  ** Either way, c
131a0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
131b0 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
131c0 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64   has such an ind
131d0 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f  ex. If.    ** so
131e0 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63  , don't bother c
131f0 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65  reating this one
13200 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c  . This only appl
13210 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75  ies to.    ** au
13220 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61  tomatically crea
13230 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65  ted indices. Use
13240 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65  rs can do as the
13250 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20  y wish with.    
13260 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69  ** explicit indi
13270 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ces..    */.    
13280 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
13290 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
132a0 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
132b0 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
132c0 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  .      int k;.  
132d0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
132e0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
132f0 6e 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ne );.      asse
13300 72 74 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e  rt( pIdx->autoIn
13310 64 65 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73  dex );.      ass
13320 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  ert( pIndex->onE
13330 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b  rror!=OE_None );
13340 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ..      if( pIdx
13350 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65  ->nColumn!=pInde
13360 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e  x->nColumn ) con
13370 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
13380 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43  (k=0; k<pIdx->nC
13390 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20  olumn; k++){.   
133a0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
133b0 2a 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  *z1 = pIdx->azCo
133c0 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 63  ll[k];.        c
133d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20  onst char *z2 = 
133e0 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b  pIndex->azColl[k
133f0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
13400 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  Idx->aiColumn[k]
13410 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  !=pIndex->aiColu
13420 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20  mn[k] ) break;. 
13430 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
13440 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 21 3d  >aSortOrder[k]!=
13450 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
13460 65 72 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20  er[k] ) break;. 
13470 20 20 20 20 20 20 20 69 66 28 20 7a 31 21 3d 7a         if( z1!=z
13480 32 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  2 && sqlite3StrI
13490 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72  Cmp(z1, z2) ) br
134a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
134b0 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e     if( k==pIdx->
134c0 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
134d0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
134e0 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e  rror!=pIndex->on
134f0 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  Error ){.       
13500 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74     /* This const
13510 72 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68  raint creates th
13520 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20  e same index as 
13530 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  a previous.     
13540 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
13550 6e 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d  nt specified som
13560 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52  ewhere in the CR
13570 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
13580 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20  ment..          
13590 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f  ** However the O
135a0 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
135b0 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  es are different
135c0 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a  . If both this .
135d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
135e0 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20  straint and the 
135f0 70 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c  previous equival
13600 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68  ent constraint h
13610 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20  ave explicit.   
13620 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e         ** ON CON
13630 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68  FLICT clauses th
13640 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20  is is an error. 
13650 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74  Otherwise, use t
13660 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
13670 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69  explicitly speci
13680 66 69 65 64 20 62 65 68 61 76 69 6f 75 72 20 66  fied behaviour f
13690 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  or the index..  
136a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
136b0 20 20 20 20 20 69 66 28 20 21 28 70 49 64 78 2d       if( !(pIdx-
136c0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
136d0 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e  ault || pIndex->
136e0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
136f0 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ult) ){.        
13700 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13710 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
13720 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
13730 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e  nflicting ON CON
13740 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73 70  FLICT clauses sp
13750 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20  ecified", 0);.  
13760 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13770 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
13780 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
13790 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
137a0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d   pIdx->onError =
137b0 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
137c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
137d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
137e0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
137f0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
13800 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
13810 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64  Link the new Ind
13820 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ex structure to 
13830 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f  its table and to
13840 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20   the other.  ** 
13850 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
13860 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a  se structures. .
13870 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
13880 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
13890 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20  Index *p;.    p 
138a0 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
138b0 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63  ert(&pIndex->pSc
138c0 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a  hema->idxHash, .
138d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138e0 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d           pIndex-
138f0 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
13900 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  Index->zName)+1,
13910 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66   pIndex);.    if
13920 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ( p ){.      ass
13930 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29  ert( p==pIndex )
13940 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
13950 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f  t have failed */
13960 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
13970 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13980 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61     }.    db->fla
13990 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
139a0 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20  ernChanges;.    
139b0 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
139c0 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
139d0 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
139e0 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a  .newTnum;.    }.
139f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
13a00 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
13a10 73 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20  s 0 then create 
13a20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73  the index on dis
13a30 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e  k.  This.  ** in
13a40 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74  volves writing t
13a50 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68  he index into th
13a60 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e master table a
13a70 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  nd filling in th
13a80 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74  e.  ** index wit
13a90 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  h the current ta
13aa0 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20  ble contents..  
13ab0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e  **.  ** The db->
13ac0 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 77  init.busy is 0 w
13ad0 68 65 6e 20 74 68 65 20 75 73 65 72 20 66 69 72  hen the user fir
13ae0 73 74 20 65 6e 74 65 72 73 20 61 20 43 52 45 41  st enters a CREA
13af0 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63  TE INDEX .  ** c
13b00 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69  ommand.  db->ini
13b10 74 2e 62 75 73 79 20 69 73 20 31 20 77 68 65 6e  t.busy is 1 when
13b20 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6f   a database is o
13b30 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20  pened and .  ** 
13b40 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
13b50 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64  tements are read
13b60 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74   out of the mast
13b70 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20  er table.  In.  
13b80 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63 61  ** the latter ca
13b90 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72  se the index alr
13ba0 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64  eady exists on d
13bb0 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68  isk, which is wh
13bc0 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20  y.  ** we don't 
13bd0 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65  want to recreate
13be0 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   it..  **.  ** I
13bf0 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74  f pTblName==0 it
13c00 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65   means this inde
13c10 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  x is generated a
13c20 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a  s a primary key.
13c30 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63    ** or UNIQUE c
13c40 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43  onstraint of a C
13c50 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
13c60 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68  ement.  Since th
13c70 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73  e table.  ** has
13c80 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74   just been creat
13c90 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  ed, it contains 
13ca0 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20  no data and the 
13cb0 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61  index initializa
13cc0 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63  tion.  ** step c
13cd0 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20  an be skipped.. 
13ce0 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 64   */.  else if( d
13cf0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
13d00 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  ){.    Vdbe *v;.
13d10 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
13d20 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20  .    int iMem = 
13d30 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
13d40 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
13d50 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
13d60 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
13d70 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13d80 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a  _index;...    /*
13d90 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74   Create the root
13da0 70 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64  page for the ind
13db0 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  ex.    */.    sq
13dc0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
13dd0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
13de0 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   1, iDb);.    sq
13df0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13e00 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  , OP_CreateIndex
13e10 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73  , iDb, 0);.    s
13e20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
13e30 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
13e40 69 4d 65 6d 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  iMem, 0);..    /
13e50 2a 20 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d  * Gather the com
13e60 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
13e70 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  e CREATE INDEX s
13e80 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20  tatement into.  
13e90 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76    ** the zStmt v
13ea0 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20  ariable.    */. 
13eb0 20 20 20 69 66 28 20 70 53 74 61 72 74 20 26 26     if( pStart &&
13ec0 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 2f   pEnd ){.      /
13ed0 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  * A named index 
13ee0 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74  with an explicit
13ef0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
13f00 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20  atement */.     
13f10 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
13f20 4d 50 72 69 6e 74 66 28 22 43 52 45 41 54 45 25  MPrintf("CREATE%
13f30 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20  s INDEX %.*s",. 
13f40 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d         onError==
13f50 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22  OE_None ? "" : "
13f60 20 55 4e 49 51 55 45 22 2c 0a 20 20 20 20 20 20   UNIQUE",.      
13f70 20 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d    pEnd->z - pNam
13f80 65 2d 3e 7a 20 2b 20 31 2c 0a 20 20 20 20 20 20  e->z + 1,.      
13f90 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20    pName->z);.   
13fa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
13fb0 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   An automatic in
13fc0 64 65 78 20 63 72 65 61 74 65 64 20 62 79 20 61  dex created by a
13fd0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
13fe0 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
13ff0 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53  t */.      /* zS
14000 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
14010 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20  intf(""); */.   
14020 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20     zStmt = 0;.  
14030 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
14040 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69  an entry in sqli
14050 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68  te_master for th
14060 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a  is index.    */.
14070 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
14080 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
14090 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20          "INSERT 
140a0 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45  INTO %Q.%s VALUE
140b0 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c  S('index',%Q,%Q,
140c0 23 30 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20  #0,%Q);",.      
140d0 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
140e0 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
140f0 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20  LE(iDb),.       
14100 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a   pIndex->zName,.
14110 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
14120 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 53 74  ame,.        zSt
14130 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  mt.    );.    sq
14140 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14150 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
14160 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
14170 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  zStmt);..    /* 
14180 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77  Fill the index w
14190 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70  ith data and rep
141a0 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e  arse the schema.
141b0 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69   Code an OP_Expi
141c0 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76  re.    ** to inv
141d0 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d  alidate all pre-
141e0 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
141f0 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nts..    */.    
14200 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a  if( pTblName ){.
14210 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
14220 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
14230 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a   pIndex, iMem);.
14240 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61        sqlite3Cha
14250 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c  ngeCookie(db, v,
14260 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
14270 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
14280 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69  P_ParseSchema, i
14290 44 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  Db, 0,.         
142a0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
142b0 6e 61 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e 64  name='%q'", pInd
142c0 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44  ex->zName), P3_D
142d0 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73  YNAMIC);.      s
142e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
142f0 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c  v, OP_Expire, 0,
14300 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   0);.    }.  }..
14310 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67    /* When adding
14320 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65   an index to the
14330 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73   list of indices
14340 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61   for a table, ma
14350 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c  ke.  ** sure all
14360 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64   indices labeled
14370 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65   OE_Replace come
14380 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65   after all those
14390 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45   labeled.  ** OE
143a0 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69  _Ignore.  This i
143b0 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20  s necessary for 
143c0 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
143d0 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a  ation of UPDATE.
143e0 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e    ** and INSERT.
143f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
14400 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62  init.busy || pTb
14410 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  lName==0 ){.    
14420 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  if( onError!=OE_
14430 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d  Replace || pTab-
14440 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20  >pIndex==0.     
14450 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e      || pTab->pIn
14460 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
14470 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20  _Replace){.     
14480 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
14490 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
144a0 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65       pTab->pInde
144b0 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  x = pIndex;.    
144c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
144d0 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61  ex *pOther = pTa
144e0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
144f0 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e   while( pOther->
14500 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d  pNext && pOther-
14510 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21  >pNext->onError!
14520 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20  =OE_Replace ){. 
14530 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20         pOther = 
14540 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
14550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
14560 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74  dex->pNext = pOt
14570 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
14580 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20    pOther->pNext 
14590 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  = pIndex;.    }.
145a0 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
145b0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20    }..  /* Clean 
145c0 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  up before exitin
145d0 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65  g */.exit_create
145e0 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49  _index:.  if( pI
145f0 6e 64 65 78 20 29 7b 0a 20 20 20 20 66 72 65 65  ndex ){.    free
14600 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20  Index(pIndex);. 
14610 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
14620 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
14630 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  );.  sqlite3SrcL
14640 69 73 74 44 65 6c 65 74 65 28 70 54 62 6c 4e 61  istDelete(pTblNa
14650 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  me);.  sqliteFre
14660 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  e(zName);.  retu
14670 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  rn;.}../*.** Gen
14680 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 61  erate code to ma
14690 6b 65 20 73 75 72 65 20 74 68 65 20 66 69 6c 65  ke sure the file
146a0 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20 69   format number i
146b0 73 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 6f  s at least minFo
146c0 72 6d 61 74 2e 0a 2a 2a 20 54 68 65 20 67 65 6e  rmat..** The gen
146d0 65 72 61 74 65 64 20 63 6f 64 65 20 77 69 6c 6c  erated code will
146e0 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69   increase the fi
146f0 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72  le format number
14700 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
14710 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 69  /.void sqlite3Mi
14720 6e 69 6d 75 6d 46 69 6c 65 46 6f 72 6d 61 74 28  nimumFileFormat(
14730 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
14740 6e 74 20 69 44 62 2c 20 69 6e 74 20 6d 69 6e 46  nt iDb, int minF
14750 6f 72 6d 61 74 29 7b 0a 20 20 56 64 62 65 20 2a  ormat){.  Vdbe *
14760 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  v;.  v = sqlite3
14770 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
14780 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
14790 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
147a0 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69  (v, OP_ReadCooki
147b0 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20  e, iDb, 1);.    
147c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
147d0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
147e0 6d 69 6e 46 6f 72 6d 61 74 2c 20 30 29 3b 0a 20  minFormat, 0);. 
147f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14800 64 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20 30 2c  dOp(v, OP_Ge, 0,
14810 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
14820 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20  entAddr(v)+3);. 
14830 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14840 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
14850 72 2c 20 6d 69 6e 46 6f 72 6d 61 74 2c 20 30 29  r, minFormat, 0)
14860 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14870 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
14880 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b  Cookie, iDb, 1);
14890 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  .  }.}../*.** Fi
148a0 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52  ll the Index.aiR
148b0 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69  owEst[] array wi
148c0 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72  th default infor
148d0 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61  mation - informa
148e0 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73  tion.** to be us
148f0 65 64 20 77 68 65 6e 20 77 65 20 68 61 76 65 20  ed when we have 
14900 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c  not run the ANAL
14910 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  YZE command..**.
14920 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69  ** aiRowEst[0] i
14930 73 20 73 75 70 70 6f 73 65 20 74 6f 20 63 6f 6e  s suppose to con
14940 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  tain the number 
14950 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  of elements in t
14960 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e  he index..** Sin
14970 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f  ce we do not kno
14980 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69  w, guess 1 milli
14990 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d  on.  aiRowEst[1]
149a0 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
149b0 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  of the.** number
149c0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
149d0 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68  table that match
149e0 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
149f0 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20  value of the.** 
14a00 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  first column of 
14a10 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f  the index.  aiRo
14a20 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73  wEst[2] is an es
14a30 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
14a40 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20  mber.** of rows 
14a50 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70  that match any p
14a60 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e  articular combin
14a70 69 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  iation of the fi
14a80 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  rst 2 columns.**
14a90 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
14aa0 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49  And so forth.  I
14ab0 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  t must always be
14ac0 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a   the case that.*
14ad0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69  .**           ai
14ae0 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77  RowEst[N]<=aiRow
14af0 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20  Est[N-1].**     
14b00 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e        aiRowEst[N
14b10 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74  ]>=1.**.** Apart
14b20 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68   from that, we h
14b30 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f  ave little to go
14b40 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75   on besides intu
14b50 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68  ition as to.** h
14b60 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68  ow aiRowEst[] sh
14b70 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69  ould be initiali
14b80 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  zed.  The number
14b90 73 20 67 65 6e 65 72 61 74 65 64 20 68 65 72 65  s generated here
14ba0 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e  .** are based on
14bb0 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20   typical values 
14bc0 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20  found in actual 
14bd0 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64  indices..*/.void
14be0 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
14bf0 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64  owEst(Index *pId
14c00 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 2a  x){.  unsigned *
14c10 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 45  a = pIdx->aiRowE
14c20 73 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  st;.  int i;.  a
14c30 73 73 65 72 74 28 20 61 21 3d 30 20 29 3b 0a 20  ssert( a!=0 );. 
14c40 20 61 5b 30 5d 20 3d 20 31 30 30 30 30 30 30 3b   a[0] = 1000000;
14c50 0a 20 20 66 6f 72 28 69 3d 70 49 64 78 2d 3e 6e  .  for(i=pIdx->n
14c60 43 6f 6c 75 6d 6e 3b 20 69 3e 3d 31 3b 20 69 2d  Column; i>=1; i-
14c70 2d 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 31  -){.    a[i] = 1
14c80 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64  0;.  }.  if( pId
14c90 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
14ca0 6f 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70 49 64  one ){.    a[pId
14cb0 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31 3b  x->nColumn] = 1;
14cc0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
14cd0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
14ce0 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67  drop an existing
14cf0 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54   named index.  T
14d00 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
14d10 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52  mplements the DR
14d20 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  OP INDEX stateme
14d30 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
14d40 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72  te3DropIndex(Par
14d50 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
14d60 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ist *pName, int 
14d70 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64  ifExists){.  Ind
14d80 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64  ex *pIndex;.  Vd
14d90 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
14da0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
14db0 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
14dc0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
14dd0 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c  r || sqlite3Mall
14de0 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20  ocFailed() ){.  
14df0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
14e00 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73  _index;.  }.  as
14e10 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
14e20 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51  c==1 );.  if( SQ
14e30 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
14e40 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
14e50 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  e) ){.    goto e
14e60 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
14e70 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
14e80 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
14e90 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  db, pName->a[0].
14ea0 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
14eb0 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
14ec0 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
14ed0 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69  {.    if( !ifExi
14ee0 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  sts ){.      sql
14ef0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14f00 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  rse, "no such in
14f10 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c  dex: %S", pName,
14f20 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   0);.    }.    p
14f30 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
14f40 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  ma = 1;.    goto
14f50 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
14f60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64  ;.  }.  if( pInd
14f70 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b  ex->autoIndex ){
14f80 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
14f90 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
14fa0 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
14fb0 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20  ith UNIQUE ".   
14fc0 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b     "or PRIMARY K
14fd0 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  EY constraint ca
14fe0 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22  nnot be dropped"
14ff0 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  , 0);.    goto e
15000 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
15010 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
15020 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
15030 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  (db, pIndex->pSc
15040 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53  hema);.#ifndef S
15050 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
15060 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
15070 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49   int code = SQLI
15080 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20  TE_DROP_INDEX;. 
15090 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
150a0 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
150b0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
150c0 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
150d0 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
150e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
150f0 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  = SCHEMA_TABLE(i
15100 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  Db);.    if( sql
15110 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
15120 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
15130 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
15140 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
15150 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
15160 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15170 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
15180 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  iDb ) code = SQL
15190 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
151a0 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
151b0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
151c0 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64  arse, code, pInd
151d0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  ex->zName, pTab-
151e0 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
151f0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
15200 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
15210 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
15220 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
15230 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
15240 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
15250 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
15260 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
15270 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
15280 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
15290 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
152a0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
152b0 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
152c0 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  .%s WHERE name=%
152d0 51 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61  Q",.       db->a
152e0 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
152f0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
15300 2c 0a 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ,.       pIndex-
15310 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20  >zName.    );.  
15320 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
15330 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62  ookie(db, v, iDb
15340 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  );.    destroyRo
15350 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
15360 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  Index->tnum, iDb
15370 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15380 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70  beOp3(v, OP_Drop
15390 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 70  Index, iDb, 0, p
153a0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Index->zName, 0)
153b0 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70  ;.  }..exit_drop
153c0 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65  _index:.  sqlite
153d0 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
153e0 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
153f0 70 70 41 72 72 61 79 20 70 6f 69 6e 74 73 20 69  ppArray points i
15400 6e 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20  nto a structure 
15410 77 68 65 72 65 20 74 68 65 72 65 20 69 73 20 61  where there is a
15420 6e 20 61 72 72 61 79 20 70 6f 69 6e 74 65 72 0a  n array pointer.
15430 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74  ** followed by t
15440 77 6f 20 69 6e 74 65 67 65 72 73 2e 20 54 68 65  wo integers. The
15450 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 69   first integer i
15460 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  s the.** number 
15470 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  of elements in t
15480 68 65 20 73 74 72 75 63 74 75 72 65 20 61 72 72  he structure arr
15490 61 79 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  ay.  The second 
154a0 69 6e 74 65 67 65 72 0a 2a 2a 20 69 73 20 74 68  integer.** is th
154b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f  e number of allo
154c0 63 61 74 65 64 20 73 6c 6f 74 73 20 69 6e 20 74  cated slots in t
154d0 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  he array..**.** 
154e0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
154f0 74 68 65 20 73 74 72 75 63 74 75 72 65 20 6c 6f  the structure lo
15500 6f 6b 73 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69  oks something li
15510 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
15520 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 61        struct Exa
15530 6d 70 6c 65 31 20 7b 0a 2a 2a 20 20 20 20 20 20  mple1 {.**      
15540 20 20 20 20 73 74 72 75 63 74 20 73 75 62 45 6c      struct subEl
15550 65 6d 20 2a 61 45 6e 74 72 79 3b 0a 2a 2a 20 20  em *aEntry;.**  
15560 20 20 20 20 20 20 20 20 69 6e 74 20 6e 45 6e 74          int nEnt
15570 72 79 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ry;.**          
15580 69 6e 74 20 6e 41 6c 6c 6f 63 3b 0a 2a 2a 20 20  int nAlloc;.**  
15590 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68        }.**.** Th
155a0 65 20 70 6e 45 6e 74 72 79 20 70 61 72 61 6d 65  e pnEntry parame
155b0 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ter points to th
155c0 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20  e equivalent of 
155d0 45 78 61 6d 70 6c 65 31 2e 6e 45 6e 74 72 79 2e  Example1.nEntry.
155e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
155f0 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ine allocates a 
15600 6e 65 77 20 73 6c 6f 74 20 69 6e 20 74 68 65 20  new slot in the 
15610 61 72 72 61 79 2c 20 7a 65 72 6f 73 20 69 74 20  array, zeros it 
15620 6f 75 74 2c 0a 2a 2a 20 61 6e 64 20 72 65 74 75  out,.** and retu
15630 72 6e 73 20 69 74 73 20 69 6e 64 65 78 2e 20 20  rns its index.  
15640 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20  If malloc fails 
15650 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
15660 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  r is returned..*
15670 2a 0a 2a 2a 20 73 7a 45 6e 74 72 79 20 69 73 20  *.** szEntry is 
15680 74 68 65 20 73 69 7a 65 6f 66 20 6f 66 20 61 20  the sizeof of a 
15690 73 69 6e 67 6c 65 20 61 72 72 61 79 20 65 6e 74  single array ent
156a0 72 79 2e 20 20 69 6e 69 74 53 69 7a 65 20 69 73  ry.  initSize is
156b0 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20   the .** number 
156c0 6f 66 20 61 72 72 61 79 20 65 6e 74 72 69 65 73  of array entries
156d0 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68   allocated on th
156e0 65 20 69 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61  e initial alloca
156f0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
15700 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
15710 65 28 76 6f 69 64 20 2a 2a 70 70 41 72 72 61 79  e(void **ppArray
15720 2c 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 69  , int szEntry, i
15730 6e 74 20 69 6e 69 74 53 69 7a 65 29 7b 0a 20 20  nt initSize){.  
15740 63 68 61 72 20 2a 70 3b 0a 20 20 69 6e 74 20 2a  char *p;.  int *
15750 61 6e 20 3d 20 28 69 6e 74 2a 29 26 70 70 41 72  an = (int*)&ppAr
15760 72 61 79 5b 31 5d 3b 0a 20 20 69 66 28 20 61 6e  ray[1];.  if( an
15770 5b 30 5d 3e 3d 61 6e 5b 31 5d 20 29 7b 0a 20 20  [0]>=an[1] ){.  
15780 20 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20    void *pNew;.  
15790 20 20 69 6e 74 20 6e 65 77 53 69 7a 65 3b 0a 20    int newSize;. 
157a0 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 61 6e 5b     newSize = an[
157b0 31 5d 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b  1]*2 + initSize;
157c0 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
157d0 74 65 52 65 61 6c 6c 6f 63 28 2a 70 70 41 72 72  teRealloc(*ppArr
157e0 61 79 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e  ay, newSize*szEn
157f0 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  try);.    if( pN
15800 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ew==0 ){.      r
15810 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
15820 20 20 20 20 61 6e 5b 31 5d 20 3d 20 6e 65 77 53      an[1] = newS
15830 69 7a 65 3b 0a 20 20 20 20 2a 70 70 41 72 72 61  ize;.    *ppArra
15840 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  y = pNew;.  }.  
15850 70 20 3d 20 2a 70 70 41 72 72 61 79 3b 0a 20 20  p = *ppArray;.  
15860 6d 65 6d 73 65 74 28 26 70 5b 61 6e 5b 30 5d 2a  memset(&p[an[0]*
15870 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45  szEntry], 0, szE
15880 6e 74 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20  ntry);.  return 
15890 61 6e 5b 30 5d 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  an[0]++;.}../*.*
158a0 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65  * Append a new e
158b0 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69  lement to the gi
158c0 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65  ven IdList.  Cre
158d0 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74  ate a new IdList
158e0 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a   if.** need be..
158f0 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69  **.** A new IdLi
15900 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
15910 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f  or NULL if mallo
15920 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64  c() fails..*/.Id
15930 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
15940 69 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74  istAppend(IdList
15950 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
15960 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69  pToken){.  int i
15970 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
15980 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
15990 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
159a0 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a  zeof(IdList) );.
159b0 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
159c0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
159d0 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
159e0 20 30 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 73 71   0;.  }.  i = sq
159f0 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
15a00 74 65 28 28 76 6f 69 64 2a 2a 29 26 70 4c 69 73  te((void**)&pLis
15a10 74 2d 3e 61 2c 20 73 69 7a 65 6f 66 28 70 4c 69  t->a, sizeof(pLi
15a20 73 74 2d 3e 61 5b 30 5d 29 2c 20 35 29 3b 0a 20  st->a[0]), 5);. 
15a30 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
15a40 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
15a50 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
15a60 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
15a70 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
15a80 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
15a90 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29  romToken(pToken)
15aa0 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
15ab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
15ac0 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a  e an IdList..*/.
15ad0 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69  void sqlite3IdLi
15ae0 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20  stDelete(IdList 
15af0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
15b00 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
15b10 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
15b20 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
15b30 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
15b40 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
15b50 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  a[i].zName);.  }
15b60 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
15b70 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
15b80 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
15b90 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
15ba0 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  e index in pList
15bb0 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69   of the identifi
15bc0 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52  er named zId.  R
15bd0 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e  eturn -1.** if n
15be0 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  ot found..*/.int
15bf0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
15c00 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  dex(IdList *pLis
15c10 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
15c20 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
15c30 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
15c40 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f   return -1;.  fo
15c50 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
15c60 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nId; i++){.    i
15c70 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
15c80 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
15c90 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
15ca0 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
15cb0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
15cc0 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
15cd0 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  w table name to 
15ce0 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73  the given SrcLis
15cf0 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
15d00 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e   SrcList if.** n
15d10 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65  eed be.  A new e
15d20 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20  ntry is created 
15d30 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65  in the SrcList e
15d40 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73  ven if pToken is
15d50 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e   NULL..**.** A n
15d60 65 77 20 53 72 63 4c 69 73 74 20 69 73 20 72 65  ew SrcList is re
15d70 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
15d80 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  if malloc() fail
15d90 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74  s..**.** If pDat
15da0 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c  abase is not nul
15db0 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
15dc0 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
15dd0 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61  n optional.** da
15de0 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66  tabase name pref
15df0 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20  ix.  Like this: 
15e00 20 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65   "database.table
15e10 22 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73  ".  The pDatabas
15e20 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  e.** points to t
15e30 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
15e40 64 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69  d the pTable poi
15e50 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  nts to the datab
15e60 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65  ase name..** The
15e70 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61   SrcList.a[].zNa
15e80 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c  me field is fill
15e90 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
15ea0 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67  e name which mig
15eb0 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20  ht.** come from 
15ec0 70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61  pTable (if pData
15ed0 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72  base is NULL) or
15ee0 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e   from pDatabase.
15ef0 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b    .** SrcList.a[
15f00 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66  ].zDatabase is f
15f10 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64  illed with the d
15f20 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f  atabase name fro
15f30 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20  m pTable,.** or 
15f40 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20  with NULL if no 
15f50 64 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63  database is spec
15f60 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ified..**.** In 
15f70 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
15f80 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  call like this:.
15f90 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
15fa0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
15fb0 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a  nd(A,B,0);.**.**
15fc0 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62   Then B is a tab
15fd0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
15fe0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73  database name is
15ff0 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49   unspecified.  I
16000 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65  f called.** like
16010 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
16020 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
16030 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 43 29  istAppend(A,B,C)
16040 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69  ;.**.** Then C i
16050 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
16060 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61   and B is the da
16070 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a  tabase name..*/.
16080 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
16090 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72  SrcListAppend(Sr
160a0 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  cList *pList, To
160b0 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b  ken *pTable, Tok
160c0 65 6e 20 2a 70 44 61 74 61 62 61 73 65 29 7b 0a  en *pDatabase){.
160d0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
160e0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
160f0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
16100 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
16110 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
16120 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20  (SrcList) );.   
16130 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
16140 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c  return 0;.    pL
16150 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b  ist->nAlloc = 1;
16160 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
16170 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e  ->nSrc>=pList->n
16180 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63  Alloc ){.    Src
16190 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
161a0 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d  pList->nAlloc *=
161b0 20 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73   2;.    pNew = s
161c0 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69  qliteRealloc(pLi
161d0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
161e0 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74     sizeof(*pList
161f0 29 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c  ) + (pList->nAll
16200 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69  oc-1)*sizeof(pLi
16210 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  st->a[0]) );.   
16220 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
16230 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
16240 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
16250 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
16260 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  0;.    }.    pLi
16270 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  st = pNew;.  }. 
16280 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
16290 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b  >a[pList->nSrc];
162a0 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c  .  memset(pItem,
162b0 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74   0, sizeof(pList
162c0 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  ->a[0]));.  if( 
162d0 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61  pDatabase && pDa
162e0 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a  tabase->z==0 ){.
162f0 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
16300 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61  0;.  }.  if( pDa
16310 74 61 62 61 73 65 20 26 26 20 70 54 61 62 6c 65  tabase && pTable
16320 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70   ){.    Token *p
16330 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65  Temp = pDatabase
16340 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  ;.    pDatabase 
16350 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54  = pTable;.    pT
16360 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20  able = pTemp;.  
16370 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  }.  pItem->zName
16380 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
16390 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 29 3b  omToken(pTable);
163a0 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  .  pItem->zDatab
163b0 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ase = sqlite3Nam
163c0 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 61 74 61  eFromToken(pData
163d0 62 61 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  base);.  pItem->
163e0 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  iCursor = -1;.  
163f0 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74  pItem->isPopulat
16400 65 64 20 3d 20 30 3b 0a 20 20 70 4c 69 73 74 2d  ed = 0;.  pList-
16410 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72  >nSrc++;.  retur
16420 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
16430 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f 72 73  * Assign cursors
16440 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   to all tables i
16450 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76  n a SrcList.*/.v
16460 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
16470 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
16480 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
16490 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
164a0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
164b0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
164c0 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28  pItem;.  assert(
164d0 70 4c 69 73 74 20 7c 7c 20 73 71 6c 69 74 65 33  pList || sqlite3
164e0 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
164f0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
16500 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
16510 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
16520 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
16530 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
16540 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75    if( pItem->iCu
16550 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b  rsor>=0 ) break;
16560 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43  .      pItem->iC
16570 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
16580 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nTab++;.      if
16590 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
165a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
165b0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
165c0 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
165d0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e  pItem->pSelect->
165e0 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSrc);.      }. 
165f0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
16600 2a 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74  * Add an alias t
16610 6f 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74  o the last ident
16620 69 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76  ifier on the giv
16630 65 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69  en identifier li
16640 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
16650 74 65 33 53 72 63 4c 69 73 74 41 64 64 41 6c 69  te3SrcListAddAli
16660 61 73 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  as(SrcList *pLis
16670 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
16680 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26  ){.  if( pList &
16690 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20  & pList->nSrc>0 
166a0 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  ){.    pList->a[
166b0 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 2e 7a  pList->nSrc-1].z
166c0 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e  Alias = sqlite3N
166d0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f  ameFromToken(pTo
166e0 6b 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ken);.  }.}../*.
166f0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
16700 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
16710 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
16720 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
16730 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
16740 73 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74  stDelete(SrcList
16750 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
16760 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  i;.  struct SrcL
16770 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
16780 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
16790 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
167a0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
167b0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  i=0; i<pList->nS
167c0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
167d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
167e0 65 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  e(pItem->zDataba
167f0 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  se);.    sqliteF
16800 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  ree(pItem->zName
16810 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
16820 65 28 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  e(pItem->zAlias)
16830 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
16840 65 74 65 54 61 62 6c 65 28 30 2c 20 70 49 74 65  eteTable(0, pIte
16850 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71  m->pTab);.    sq
16860 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
16870 65 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  e(pItem->pSelect
16880 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
16890 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e  prDelete(pItem->
168a0 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pOn);.    sqlite
168b0 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 49  3IdListDelete(pI
168c0 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
168d0 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
168e0 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
168f0 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  Begin a transact
16900 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
16910 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74  te3BeginTransact
16920 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
16930 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20  e, int type){.  
16940 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
16950 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b  dbe *v;.  int i;
16960 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
16970 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
16980 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
16990 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
169a0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
169b0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
169c0 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64  ite3MallocFailed
169d0 28 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  () ) return;.  i
169e0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
169f0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
16a00 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
16a10 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29  "BEGIN", 0, 0) )
16a20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20   return;..  v = 
16a30 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
16a40 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76  Parse);.  if( !v
16a50 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
16a60 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52   type!=TK_DEFERR
16a70 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ED ){.    for(i=
16a80 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
16a90 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
16aa0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
16ab0 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c  _Transaction, i,
16ac0 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55   (type==TK_EXCLU
16ad0 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 7d 0a  SIVE)+1);.    }.
16ae0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
16af0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74  eAddOp(v, OP_Aut
16b00 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a  oCommit, 0, 0);.
16b10 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
16b20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
16b30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
16b40 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  mitTransaction(P
16b50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
16b60 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
16b70 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
16b80 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
16b90 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
16ba0 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
16bb0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
16bc0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
16bd0 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c  r || sqlite3Mall
16be0 6f 63 46 61 69 6c 65 64 28 29 20 29 20 72 65 74  ocFailed() ) ret
16bf0 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
16c00 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
16c10 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
16c20 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22  ACTION, "COMMIT"
16c30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
16c40 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
16c50 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
16c60 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
16c70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16c80 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
16c90 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  t, 1, 0);.  }.}.
16ca0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
16cb0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
16cc0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
16cd0 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e  lbackTransaction
16ce0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
16cf0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
16d00 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66    Vdbe *v;..  if
16d10 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
16d20 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
16d30 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  0 || db->aDb[0].
16d40 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
16d50 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
16d60 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61  Err || sqlite3Ma
16d70 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20 72  llocFailed() ) r
16d80 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
16d90 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
16da0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
16db0 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42  NSACTION, "ROLLB
16dc0 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65  ACK", 0, 0) ) re
16dd0 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  turn;..  v = sql
16de0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
16df0 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
16e00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16e10 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43  ddOp(v, OP_AutoC
16e20 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20  ommit, 1, 1);.  
16e30 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
16e40 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61  sure the TEMP da
16e50 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61  tabase is open a
16e60 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  nd available for
16e70 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a   use.  Return.**
16e80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
16e90 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e  rrors.  Leave an
16ea0 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
16eb0 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
16ec0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
16ed0 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 4f  tic int sqlite3O
16ee0 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
16ef0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
16f00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
16f10 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
16f20 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ( db->aDb[1].pBt
16f30 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ==0 && !pParse->
16f40 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69  explain ){.    i
16f50 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  nt rc = sqlite3B
16f60 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20  treeFactory(db, 
16f70 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c  0, 0, MAX_PAGES,
16f80 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74   &db->aDb[1].pBt
16f90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
16fa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16fb0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16fc0 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
16fd0 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  e to open a temp
16fe0 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22  orary database "
16ff0 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66  .        "file f
17000 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f  or storing tempo
17010 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20  rary tables");. 
17020 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
17030 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
17040 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
17050 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
17060 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20  !db->autoCommit 
17070 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
17080 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
17090 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e  rans(db->aDb[1].
170a0 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  pBt, 1);.      i
170b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
170c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
170d0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
170e0 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67  se, "unable to g
170f0 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  et a write lock 
17100 6f 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  on ".          "
17110 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61  the temporary da
17120 74 61 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20  tabase file");. 
17130 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
17140 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
17150 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
17160 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
17170 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  rt( db->aDb[1].p
17180 53 63 68 65 6d 61 20 29 3b 0a 20 20 7d 0a 20 20  Schema );.  }.  
17190 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
171a0 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
171b0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
171c0 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
171d0 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61  a cookie and sta
171e0 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61  rt.** a read-tra
171f0 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c  nsaction for all
17200 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
17210 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  files..**.** It 
17220 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  is important tha
17230 74 20 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f  t all schema coo
17240 6b 69 65 73 20 62 65 20 76 65 72 69 66 69 65 64  kies be verified
17250 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64   and all.** read
17260 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65   transactions be
17270 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
17280 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61  anything else ha
17290 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ppens in.** the 
172a0 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42  VDBE program.  B
172b0 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ut this routine 
172c0 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66  can be called af
172d0 74 65 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a  ter much other.*
172e0 2a 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20  * code has been 
172f0 67 65 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68  generated.  So h
17300 65 72 65 20 69 73 20 77 68 61 74 20 77 65 20 64  ere is what we d
17310 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  o:.**.** The fir
17320 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
17330 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
17340 77 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f  we code an OP_Go
17350 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  to that.** will 
17360 6a 75 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75  jump to a subrou
17370 74 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20  tine at the end 
17380 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20  of the program. 
17390 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f   Then we.** reco
173a0 72 64 20 65 76 65 72 79 20 64 61 74 61 62 61 73  rd every databas
173b0 65 20 74 68 61 74 20 6e 65 65 64 73 20 69 74 73  e that needs its
173c0 20 73 63 68 65 6d 61 20 76 65 72 69 66 69 65 64   schema verified
173d0 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73   in the.** pPars
173e0 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69  e->cookieMask fi
173f0 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74  eld.  Later, aft
17400 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64  er all other cod
17410 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65  e has been.** ge
17420 6e 65 72 61 74 65 64 2c 20 74 68 65 20 73 75 62  nerated, the sub
17430 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65  routine that doe
17440 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72  s the cookie ver
17450 69 66 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a  ifications and.*
17460 2a 20 73 74 61 72 74 73 20 74 68 65 20 74 72 61  * starts the tra
17470 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62  nsactions will b
17480 65 20 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20  e coded and the 
17490 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65  OP_Goto P2 value
174a0 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65  .** will be made
174b0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
174c0 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
174d0 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66  he generation of
174e0 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76   the.** cookie v
174f0 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72  erification subr
17500 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70  outine code happ
17510 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69  ens in sqlite3Fi
17520 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a  nishCoding()..**
17530 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65  .** If iDb<0 the
17540 6e 20 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f  n code the OP_Go
17550 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20  to only - don't 
17560 73 65 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69  set flag to veri
17570 66 79 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61  fy the.** schema
17580 20 6f 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65   on any database
17590 73 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  s.  This can be 
175a0 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e  used to position
175b0 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20   the OP_Goto.** 
175c0 65 61 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64  early in the cod
175d0 65 2c 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f  e, before we kno
175e0 77 20 69 66 20 61 6e 79 20 64 61 74 61 62 61 73  w if any databas
175f0 65 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65  e tables will be
17600 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   used..*/.void s
17610 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
17620 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
17630 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
17640 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
17650 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
17660 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  mask;..  v = sql
17670 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
17680 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
17690 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
176a0 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
176b0 69 66 20 74 68 65 72 65 20 77 61 73 20 61 20 70  if there was a p
176c0 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20  rior error */.  
176d0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
176e0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
176f0 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a  ookieGoto==0 ){.
17700 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
17710 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33  ieGoto = sqlite3
17720 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
17730 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20  Goto, 0, 0)+1;. 
17740 20 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20   }.  if( iDb>=0 
17750 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
17760 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
17770 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
17780 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c  b[iDb].pBt!=0 ||
17790 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61   iDb==1 );.    a
177a0 73 73 65 72 74 28 20 69 44 62 3c 33 32 20 29 3b  ssert( iDb<32 );
177b0 0a 20 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69  .    mask = 1<<i
177c0 44 62 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61  Db;.    if( (pPa
177d0 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
177e0 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
177f0 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
17800 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  ieMask |= mask;.
17810 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f        pParse->co
17820 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d  okieValue[iDb] =
17830 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
17840 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f  chema->schema_co
17850 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69 66 28 20  okie;.      if( 
17860 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
17870 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
17880 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d    sqlite3OpenTem
17890 70 44 61 74 61 62 61 73 65 28 70 50 61 72 73 65  pDatabase(pParse
178a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
178b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
178c0 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
178d0 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66   that prepares f
178e0 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72  or doing an oper
178f0 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69  ation that.** mi
17900 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64  ght change the d
17910 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
17920 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
17930 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  ts a new transac
17940 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e  tion if we are n
17950 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  ot already withi
17960 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  n.** a transacti
17970 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20 61  on.  If we are a
17980 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61 20  lready within a 
17990 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
179a0 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a  n a checkpoint.*
179b0 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20  * is set if the 
179c0 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72  setStatement par
179d0 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e 20  ameter is true. 
179e0 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68   A checkpoint sh
179f0 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66  ould.** be set f
17a00 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68  or operations th
17a10 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64  at might fail (d
17a20 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69  ue to a constrai
17a30 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74  nt) part of.** t
17a40 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20 61  he way through a
17a50 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65  nd which will ne
17a60 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20  ed to undo some 
17a70 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20 68  writes without h
17a80 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  aving to.** roll
17a90 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74  back the whole t
17aa0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72  ransaction.  For
17ab0 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72   operations wher
17ac0 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
17ad0 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63  s.** can be chec
17ae0 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63  ked before any c
17af0 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
17b00 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  to the database,
17b10 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20   it is never.** 
17b20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
17b30 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74 68  o a write and th
17b40 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f  e checkpoint sho
17b50 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a  uld not be set..
17b60 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62  **.** Only datab
17b70 61 73 65 20 69 44 62 20 61 6e 64 20 74 68 65 20  ase iDb and the 
17b80 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 61 72  temp database ar
17b90 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20  e made writable 
17ba0 62 79 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a  by this call..**
17bb0 20 49 66 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e   If iDb==0, then
17bc0 20 74 68 65 20 6d 61 69 6e 20 61 6e 64 20 74 65   the main and te
17bd0 6d 70 20 64 61 74 61 62 61 73 65 73 20 61 72 65  mp databases are
17be0 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20   made writable. 
17bf0 20 20 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74    If.** iDb==1 t
17c00 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d  hen only the tem
17c10 70 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 61  p database is ma
17c20 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 49 66  de writable.  If
17c30 20 69 44 62 3e 31 20 74 68 65 6e 20 74 68 65 0a   iDb>1 then the.
17c40 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61 75 78  ** specified aux
17c50 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
17c60 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61 74  and the temp dat
17c70 61 62 61 73 65 20 61 72 65 20 6d 61 64 65 20 77  abase are made w
17c80 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  ritable..*/.void
17c90 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
17ca0 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73  teOperation(Pars
17cb0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73  e *pParse, int s
17cc0 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74  etStatement, int
17cd0 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76   iDb){.  Vdbe *v
17ce0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
17cf0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
17d00 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
17d10 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
17d20 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
17d30 2c 20 69 44 62 29 3b 0a 20 20 70 50 61 72 73 65  , iDb);.  pParse
17d40 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31  ->writeMask |= 1
17d50 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20 73 65 74  <<iDb;.  if( set
17d60 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 50 61  Statement && pPa
17d70 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29  rse->nested==0 )
17d80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
17d90 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 61  eAddOp(v, OP_Sta
17da0 74 65 6d 65 6e 74 2c 20 69 44 62 2c 20 30 29 3b  tement, iDb, 0);
17db0 0a 20 20 7d 0a 20 20 69 66 28 20 28 4f 4d 49 54  .  }.  if( (OMIT
17dc0 5f 54 45 4d 50 44 42 20 7c 7c 20 69 44 62 21 3d  _TEMPDB || iDb!=
17dd0 31 29 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62  1) && pParse->db
17de0 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 21 3d 30 20  ->aDb[1].pBt!=0 
17df0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
17e00 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
17e10 6e 28 70 50 61 72 73 65 2c 20 73 65 74 53 74 61  n(pParse, setSta
17e20 74 65 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a  tement, 1);.  }.
17e30 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
17e40 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20  o see if pIndex 
17e50 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  uses the collati
17e60 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
17e70 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72  l.  Return.** tr
17e80 75 65 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e  ue if it does an
17e90 64 20 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f  d false if it do
17ea0 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64  es not..*/.#ifnd
17eb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
17ec0 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e  EINDEX.static in
17ed0 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  t collationMatch
17ee0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f  (const char *zCo
17ef0 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ll, Index *pInde
17f00 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  x){.  int i;.  f
17f10 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78  or(i=0; i<pIndex
17f20 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
17f30 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
17f40 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43  *z = pIndex->azC
17f50 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  oll[i];.    if( 
17f60 7a 3d 3d 7a 43 6f 6c 6c 20 7c 7c 20 28 7a 20 26  z==zColl || (z &
17f70 26 20 7a 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71  & zColl && 0==sq
17f80 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
17f90 7a 43 6f 6c 6c 29 29 20 29 7b 0a 20 20 20 20 20  zColl)) ){.     
17fa0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
17fb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
17fc0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
17fd0 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
17fe0 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74  ndices of pTab t
17ff0 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  hat use the coll
18000 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
18010 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c  Coll..** If pCol
18020 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
18030 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
18040 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e  of pTab..*/.#ifn
18050 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18060 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
18070 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65  oid reindexTable
18080 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
18090 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61  Table *pTab, cha
180a0 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b  r const *zColl){
180b0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
180c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
180d0 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
180e0 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
180f0 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78  */..  for(pIndex
18100 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
18110 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49  Index; pIndex=pI
18120 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  ndex->pNext){.  
18130 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c    if( zColl==0 |
18140 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  | collationMatch
18150 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20  (zColl, pIndex) 
18160 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  ){.      int iDb
18170 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
18180 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
18190 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
181a0 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
181b0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
181c0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
181d0 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
181e0 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
181f0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
18200 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
18210 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
18220 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
18230 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ces of all table
18240 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
18250 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20  es where the.** 
18260 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20  indices use the 
18270 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
18280 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43  ce pColl.  If pC
18290 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
182a0 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64  mpute.** all ind
182b0 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e  ices everywhere.
182c0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
182d0 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
182e0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
182f0 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72  dexDatabases(Par
18300 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72  se *pParse, char
18310 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a   const *zColl){.
18320 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
18330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18340 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   A single databa
18350 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
18360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18370 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
18380 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
18390 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
183a0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
183b0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
183c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
183d0 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20    HashElem *k;  
183e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
183f0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
18400 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20  r tables in pDb 
18410 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
18420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18430 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
18440 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a  he database */..
18450 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62    for(iDb=0, pDb
18460 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62  =db->aDb; iDb<db
18470 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44  ->nDb; iDb++, pD
18480 62 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 44  b++){.    if( pD
18490 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==0 ) continue;
184a0 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74  .    for(k=sqlit
184b0 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d  eHashFirst(&pDb-
184c0 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
184d0 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65  h);  k; k=sqlite
184e0 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20  HashNext(k)){.  
184f0 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c      pTab = (Tabl
18500 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  e*)sqliteHashDat
18510 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e  a(k);.      rein
18520 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c  dexTable(pParse,
18530 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20   pTab, zColl);. 
18540 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
18550 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
18560 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52  e code for the R
18570 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
18580 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49  **.**        REI
18590 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20 20  NDEX            
185a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185b0 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 1.**        R
185c0 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69  EINDEX  <collati
185d0 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20 20  on>             
185e0 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20    -- 2.**       
185f0 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
18600 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d  base>.?<tablenam
18610 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20  e>  -- 3.**     
18620 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61     REINDEX  ?<da
18630 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e  tabase>.?<indexn
18640 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a  ame>  -- 4.**.**
18650 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61   Form 1 causes a
18660 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
18670 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
18680 61 73 65 73 20 74 6f 20 62 65 20 72 65 62 75 69  ases to be rebui
18690 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65  lt..** Form 2 re
186a0 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63  builds all indic
186b0 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61  es in all databa
186c0 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65  ses that use the
186d0 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74   named.** collat
186e0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46  ing function.  F
186f0 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62  orms 3 and 4 reb
18700 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69  uild the named i
18710 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69  ndex or all.** i
18720 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
18730 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64  d with the named
18740 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64   table..*/.#ifnd
18750 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
18760 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69  EINDEX.void sqli
18770 74 65 33 52 65 69 6e 64 65 78 28 50 61 72 73 65  te3Reindex(Parse
18780 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
18790 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a  *pName1, Token *
187a0 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53  pName2){.  CollS
187b0 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
187c0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
187d0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
187e0 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72  be reindexed, or
187f0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20   NULL */.  char 
18800 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *z;             
18810 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
18820 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  f a table or ind
18830 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ex */.  const ch
18840 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20  ar *zDb;        
18850 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
18860 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
18870 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
18880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18890 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  A table in the d
188a0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64  atabase */.  Ind
188b0 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
188c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
188d0 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
188e0 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69  with pTab */.  i
188f0 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
18900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
18910 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  e database index
18920 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c   number */.  sql
18930 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
18940 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20  e->db;   /* The 
18950 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
18960 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ion */.  Token *
18970 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20  pObjName;       
18980 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
18990 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  the table or ind
189a0 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ex to be reindex
189b0 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  ed */..  /* Read
189c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
189d0 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f  hema. If an erro
189e0 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
189f0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
18a00 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69  .  ** and code i
18a10 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
18a20 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69  urn NULL. */.  i
18a30 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
18a40 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
18a50 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72  pParse) ){.    r
18a60 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  eturn;.  }..  if
18a70 28 20 70 4e 61 6d 65 31 3d 3d 30 20 7c 7c 20 70  ( pName1==0 || p
18a80 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  Name1->z==0 ){. 
18a90 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
18aa0 73 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a  ses(pParse, 0);.
18ab0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65      return;.  }e
18ac0 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 32 3d 3d  lse if( pName2==
18ad0 30 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d  0 || pName2->z==
18ae0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
18af0 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20   pName1->z );.  
18b00 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
18b10 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
18b20 20 45 4e 43 28 64 62 29 2c 20 28 63 68 61 72 2a   ENC(db), (char*
18b30 29 70 4e 61 6d 65 31 2d 3e 7a 2c 20 70 4e 61 6d  )pName1->z, pNam
18b40 65 31 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69  e1->n, 0);.    i
18b50 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
18b60 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20    char *zColl = 
18b70 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 28 63  sqliteStrNDup((c
18b80 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4e 61 6d  onst char *)pNam
18b90 65 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d 3e 6e  e1->z, pName1->n
18ba0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f  );.      if( zCo
18bb0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ll ){.        re
18bc0 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
18bd0 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  Parse, zColl);. 
18be0 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
18bf0 65 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  e(zColl);.      
18c00 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  }.      return;.
18c10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 44 62 20      }.  }.  iDb 
18c20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
18c30 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
18c40 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f  me1, pName2, &pO
18c50 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  bjName);.  if( i
18c60 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
18c70 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65   z = sqlite3Name
18c80 46 72 6f 6d 54 6f 6b 65 6e 28 70 4f 62 6a 4e 61  FromToken(pObjNa
18c90 6d 65 29 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d  me);.  zDb = db-
18ca0 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
18cb0 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
18cc0 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
18cd0 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54  , zDb);.  if( pT
18ce0 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  ab ){.    reinde
18cf0 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
18d00 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  Tab, 0);.    sql
18d10 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20  iteFree(z);.    
18d20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49  return;.  }.  pI
18d30 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
18d40 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a  ndIndex(db, z, z
18d50 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  Db);.  sqliteFre
18d60 65 28 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  e(z);.  if( pInd
18d70 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
18d80 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
18d90 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
18da0 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
18db0 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
18dc0 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29  rse, pIndex, -1)
18dd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
18de0 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  }.  sqlite3Error
18df0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
18e00 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20  ble to identify 
18e10 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65  the object to be
18e20 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a   reindexed");.}.
18e30 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
18e40 74 75 72 6e 20 61 20 64 79 6e 61 6d 69 63 6c 79  turn a dynamicly
18e50 20 61 6c 6c 6f 63 61 74 65 64 20 4b 65 79 49 6e   allocated KeyIn
18e60 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
18e70 74 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a  t can be used.**
18e80 20 77 69 74 68 20 4f 50 5f 4f 70 65 6e 52 65 61   with OP_OpenRea
18e90 64 20 6f 72 20 4f 50 5f 4f 70 65 6e 57 72 69 74  d or OP_OpenWrit
18ea0 65 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61  e to access data
18eb0 62 61 73 65 20 69 6e 64 65 78 20 70 49 64 78 2e  base index pIdx.
18ec0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
18ed0 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65 72 20  sful, a pointer 
18ee0 74 6f 20 74 68 65 20 6e 65 77 20 73 74 72 75 63  to the new struc
18ef0 74 75 72 65 20 69 73 20 72 65 74 75 72 6e 65 64  ture is returned
18f00 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
18f10 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * the caller is 
18f20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
18f30 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 46 72  calling sqliteFr
18f40 65 65 28 29 20 6f 6e 20 74 68 65 20 72 65 74 75  ee() on the retu
18f50 72 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72  rned .** pointer
18f60 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
18f70 63 75 72 73 20 28 6f 75 74 20 6f 66 20 6d 65 6d  curs (out of mem
18f80 6f 72 79 20 6f 72 20 6d 69 73 73 69 6e 67 20 63  ory or missing c
18f90 6f 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20 73 65 71  ollation .** seq
18fa0 75 65 6e 63 65 29 2c 20 4e 55 4c 4c 20 69 73 20  uence), NULL is 
18fb0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
18fc0 20 73 74 61 74 65 20 6f 66 20 70 50 61 72 73 65   state of pParse
18fd0 20 75 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c   updated to refl
18fe0 65 63 74 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  ect.** the error
18ff0 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71  ..*/.KeyInfo *sq
19000 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
19010 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
19020 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20   Index *pIdx){. 
19030 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43   int i;.  int nC
19040 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ol = pIdx->nColu
19050 6d 6e 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73  mn;.  int nBytes
19060 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66   = sizeof(KeyInf
19070 6f 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69  o) + (nCol-1)*si
19080 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b  zeof(CollSeq*) +
19090 20 6e 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f   nCol;.  KeyInfo
190a0 20 2a 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e 66   *pKey = (KeyInf
190b0 6f 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  o *)sqliteMalloc
190c0 28 6e 42 79 74 65 73 29 3b 0a 0a 20 20 69 66 28  (nBytes);..  if(
190d0 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 70 4b 65   pKey ){.    pKe
190e0 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  y->aSortOrder = 
190f0 28 75 38 20 2a 29 26 28 70 4b 65 79 2d 3e 61 43  (u8 *)&(pKey->aC
19100 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20  oll[nCol]);.    
19110 61 73 73 65 72 74 28 20 26 70 4b 65 79 2d 3e 61  assert( &pKey->a
19120 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 3d  SortOrder[nCol]=
19130 3d 26 28 28 28 75 38 20 2a 29 70 4b 65 79 29 5b  =&(((u8 *)pKey)[
19140 6e 42 79 74 65 73 5d 29 20 29 3b 0a 20 20 20 20  nBytes]) );.    
19150 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
19160 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   i++){.      cha
19170 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d  r *zColl = pIdx-
19180 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
19190 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 20    assert( zColl 
191a0 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61  );.      pKey->a
191b0 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65  Coll[i] = sqlite
191c0 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
191d0 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31  Parse, zColl, -1
191e0 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61  );.      pKey->a
191f0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
19200 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
19210 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b  i];.    }.    pK
19220 65 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f  ey->nField = nCo
19230 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  l;.  }..  if( pP
19240 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
19250 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4b 65    sqliteFree(pKe
19260 79 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 30  y);.    pKey = 0
19270 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
19280 4b 65 79 3b 0a 7d 0a                             Key;.}.