/ Hex Artifact Content
Login

Artifact 28208a9049d7bf61f16fcb4bb850406857135953:


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 34 30 32 20 32 30 30 36 2f 30 36 2f 31 36  1.402 2006/06/16
02f0: 20 30 38 3a 30 31 3a 30 33 20 64 61 6e 69 65 6c   08:01:03 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 20 20 20 20 20 20 20 20 20 20  t iDb;          
04e0: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04f0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
0500: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
0510: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
0520: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
0530: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
0540: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0550: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0560: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0570: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0580: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0590: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
05a0: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
05b0: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
05c0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
05d0: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
05e0: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05f0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
0600: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
0610: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
0620: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
0630: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
0640: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0650: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0660: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0670: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0680: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0690: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
06a0: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
06b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
06c0: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
06d0: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
06e0: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06f0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
0700: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
0710: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
0720: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
0730: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
0740: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0750: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0760: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0770: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0780: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0790: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
07a0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
07b0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
07c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
07d0: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
07e0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07f0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
0800: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
0810: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
0820: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
0830: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
0840: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0850: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0860: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0870: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0880: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0890: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
08a0: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
08b0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
08c0: 20 20 69 6e 74 20 6e 42 79 74 65 73 3b 0a 20 20    int nBytes;.  
08d0: 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b 0a 0a 20  TableLock *p;.. 
08e0: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 54   if( 0==sqlite3T
08f0: 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c  hreadDataReadOnl
0900: 79 28 29 2d 3e 75 73 65 53 68 61 72 65 64 44 61  y()->useSharedDa
0910: 74 61 20 7c 7c 20 69 44 62 3c 30 20 29 7b 0a 20  ta || iDb<0 ){. 
0920: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
0930: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
0940: 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b  rse->nTableLock;
0950: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 26   i++){.    p = &
0960: 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f  pParse->aTableLo
0970: 63 6b 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  ck[i];.    if( p
0980: 2d 3e 69 44 62 3d 3d 69 44 62 20 26 26 20 70 2d  ->iDb==iDb && p-
0990: 3e 69 54 61 62 3d 3d 69 54 61 62 20 29 7b 0a 20  >iTab==iTab ){. 
09a0: 20 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65 4c       p->isWriteL
09b0: 6f 63 6b 20 3d 20 28 70 2d 3e 69 73 57 72 69 74  ock = (p->isWrit
09c0: 65 4c 6f 63 6b 20 7c 7c 20 69 73 57 72 69 74 65  eLock || isWrite
09d0: 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 65 74  Lock);.      ret
09e0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  urn;.    }.  }..
09f0: 20 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65 6f    nBytes = sizeo
0a00: 66 28 54 61 62 6c 65 4c 6f 63 6b 29 20 2a 20 28  f(TableLock) * (
0a10: 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f  pParse->nTableLo
0a20: 63 6b 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 52  ck+1);.  sqliteR
0a30: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 28 76 6f  eallocOrFree((vo
0a40: 69 64 20 2a 2a 29 26 70 50 61 72 73 65 2d 3e 61  id **)&pParse->a
0a50: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
0a60: 73 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  s);.  if( pParse
0a70: 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 29 7b 0a  ->aTableLock ){.
0a80: 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d      p = &pParse-
0a90: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 70 50 61 72  >aTableLock[pPar
0aa0: 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b 2b  se->nTableLock++
0ab0: 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d 20  ];.    p->iDb = 
0ac0: 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62  iDb;.    p->iTab
0ad0: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e   = iTab;.    p->
0ae0: 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69 73  isWriteLock = is
0af0: 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20 70  WriteLock;.    p
0b00: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
0b10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
0b20: 64 65 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f  de an OP_TableLo
0b30: 63 6b 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66  ck instruction f
0b40: 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f  or each table lo
0b50: 63 6b 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73  cked by the.** s
0b60: 74 61 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67  tatement (config
0b70: 75 72 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f  ured by calls to
0b80: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
0b90: 6b 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  k())..*/.static 
0ba0: 76 6f 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f  void codeTableLo
0bb0: 63 6b 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  cks(Parse *pPars
0bc0: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56  e){.  int i;.  V
0bd0: 64 62 65 20 2a 70 56 64 62 65 3b 20 0a 20 20 61  dbe *pVdbe; .  a
0be0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 54 68  ssert( sqlite3Th
0bf0: 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79  readDataReadOnly
0c00: 28 29 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74  ()->useSharedDat
0c10: 61 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 54 61  a || pParse->nTa
0c20: 62 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20  bleLock==0 );.. 
0c30: 20 69 66 28 20 30 3d 3d 28 70 56 64 62 65 20 3d   if( 0==(pVdbe =
0c40: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0c50: 70 50 61 72 73 65 29 29 20 29 7b 0a 20 20 20 20  pParse)) ){.    
0c60: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66  return;.  }..  f
0c70: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
0c80: 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b  ->nTableLock; i+
0c90: 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f 63  +){.    TableLoc
0ca0: 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e  k *p = &pParse->
0cb0: 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20  aTableLock[i];. 
0cc0: 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e 69     int p1 = p->i
0cd0: 44 62 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  Db;.    if( p->i
0ce0: 73 57 72 69 74 65 4c 6f 63 6b 20 29 7b 0a 20 20  sWriteLock ){.  
0cf0: 20 20 20 20 70 31 20 3d 20 2d 31 2a 28 70 31 2b      p1 = -1*(p1+
0d00: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  1);.    }.    sq
0d10: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 70 56 64  lite3VdbeOp3(pVd
0d20: 62 65 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b  be, OP_TableLock
0d30: 2c 20 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70  , p1, p->iTab, p
0d40: 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ->zName, P3_STAT
0d50: 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
0d60: 0a 20 20 23 64 65 66 69 6e 65 20 63 6f 64 65 54  .  #define codeT
0d70: 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a 23 65 6e  ableLocks(x).#en
0d80: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
0d90: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
0da0: 64 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65  d after a single
0db0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68   SQL statement h
0dc0: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65  as been.** parse
0dd0: 64 20 61 6e 64 20 61 20 56 44 42 45 20 70 72 6f  d and a VDBE pro
0de0: 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20  gram to execute 
0df0: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20 68  that statement h
0e00: 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65 70 61  as been.** prepa
0e10: 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  red.  This routi
0e20: 6e 65 20 70 75 74 73 20 74 68 65 20 66 69 6e 69  ne puts the fini
0e30: 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20 6f 6e  shing touches on
0e40: 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f   the.** VDBE pro
0e50: 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74 73 20  gram and resets 
0e60: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
0e70: 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e 65 78  ture for the nex
0e80: 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a  t.** parse..**.*
0e90: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61  * Note that if a
0ea0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
0eb0: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
0ec0: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e  e case that.** n
0ed0: 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20  o VDBE code was 
0ee0: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f  generated..*/.vo
0ef0: 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  id sqlite3Finish
0f00: 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a 70 50  Coding(Parse *pP
0f10: 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
0f20: 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
0f30: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d  ..  if( sqlite3M
0f40: 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20  allocFailed() ) 
0f50: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
0f60: 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20 72  arse->nested ) r
0f70: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50  eturn;.  if( !pP
0f80: 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20  arse->pVdbe ){. 
0f90: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72     if( pParse->r
0fa0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
0fb0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
0fc0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
0fd0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
0fe0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
0ff0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42     }.  }..  /* B
1000: 65 67 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69  egin by generati
1010: 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74  ng some terminat
1020: 69 6f 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20  ion code at the 
1030: 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  end of the.  ** 
1040: 76 64 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a  vdbe program.  *
1050: 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
1060: 3e 64 62 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74  >db;.  v = sqlit
1070: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1080: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
1090: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10a0: 4f 70 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 30  Op(v, OP_Halt, 0
10b0: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  , 0);..    /* Th
10c0: 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63 6f  e cookie mask co
10d0: 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74 20 66  ntains one bit f
10e0: 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65  or each database
10f0: 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20 20   file open..    
1100: 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66 6f 72  ** (Bit 0 is for
1110: 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69 73 20   main, bit 1 is 
1120: 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20 73 6f  for temp, and so
1130: 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73 20 61   forth.)  Bits a
1140: 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 66 6f  re.    ** set fo
1150: 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  r each database 
1160: 74 68 61 74 20 69 73 20 75 73 65 64 2e 20 20 47  that is used.  G
1170: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1180: 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a 20 74  start a.    ** t
1190: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65 61  ransaction on ea
11a0: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
11b0: 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79 20 74   and to verify t
11c0: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
11d0: 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68 20  .    ** on each 
11e0: 75 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20  used database.. 
11f0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
1200: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
1210: 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20  >0 ){.      u32 
1220: 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20  mask;.      int 
1230: 69 44 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  iDb;.      sqlit
1240: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1250: 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  , pParse->cookie
1260: 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20 20 20 66  Goto-1);.      f
1270: 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d 31  or(iDb=0, mask=1
1280: 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 6d  ; iDb<db->nDb; m
1290: 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29 7b  ask<<=1, iDb++){
12a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 61  .        if( (ma
12b0: 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 63 6f 6f  sk & pParse->coo
12c0: 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63 6f  kieMask)==0 ) co
12d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
12e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12f0: 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
1300: 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20 26  on, iDb, (mask &
1310: 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61   pParse->writeMa
1320: 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  sk)!=0);.       
1330: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1340: 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f  p(v, OP_VerifyCo
1350: 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50 61 72 73  okie, iDb, pPars
1360: 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69  e->cookieValue[i
1370: 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Db]);.      }.. 
1380: 20 20 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c       /* Once all
1390: 20 74 68 65 20 63 6f 6f 6b 69 65 73 20 68 61 76   the cookies hav
13a0: 65 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20  e been verified 
13b0: 61 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  and transactions
13c0: 20 6f 70 65 6e 65 64 2c 20 0a 20 20 20 20 20 20   opened, .      
13d0: 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65  ** obtain the re
13e0: 71 75 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f 63  quired table-loc
13f0: 6b 73 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  ks. This is a no
1400: 2d 6f 70 20 75 6e 6c 65 73 73 20 74 68 65 20 0a  -op unless the .
1410: 20 20 20 20 20 20 2a 2a 20 73 68 61 72 65 64 2d        ** shared-
1420: 63 61 63 68 65 20 66 65 61 74 75 72 65 20 69 73  cache feature is
1430: 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20 20   enabled..      
1440: 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 54 61 62  */.      codeTab
1450: 6c 65 4c 6f 63 6b 73 28 70 50 61 72 73 65 29 3b  leLocks(pParse);
1460: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1470: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
1480: 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 63  to, 0, pParse->c
1490: 6f 6f 6b 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20  ookieGoto);.    
14a0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
14b0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20  E_OMIT_TRACE.   
14c0: 20 2f 2a 20 41 64 64 20 61 20 4e 6f 2d 6f 70 20   /* Add a No-op 
14d0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
14e0: 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
14f0: 6f 66 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20  of the compiled 
1500: 53 51 4c 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  SQL.    ** state
1510: 6d 65 6e 74 20 61 73 20 69 74 73 20 50 33 20 61  ment as its P3 a
1520: 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 64  rgument.  This d
1530: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1540: 68 65 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79  he functionality
1550: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  .    ** of the p
1560: 72 6f 67 72 61 6d 2e 20 0a 20 20 20 20 2a 2a 0a  rogram. .    **.
1570: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75      ** This is u
1580: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
1590: 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 29   sqlite3_trace()
15a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
15b0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
15c0: 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20 70 50  P_Noop, 0, 0, pP
15d0: 61 72 73 65 2d 3e 7a 53 71 6c 2c 20 70 50 61 72  arse->zSql, pPar
15e0: 73 65 2d 3e 7a 54 61 69 6c 2d 70 50 61 72 73 65  se->zTail-pParse
15f0: 2d 3e 7a 53 71 6c 29 3b 0a 23 65 6e 64 69 66 20  ->zSql);.#endif 
1600: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  /* SQLITE_OMIT_T
1610: 52 41 43 45 20 2a 2f 0a 20 20 7d 0a 0a 0a 20 20  RACE */.  }...  
1620: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1630: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1640: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1650: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1660: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1670: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
1680: 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 46 49 4c  led() ){.    FIL
1690: 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d 3e  E *trace = (db->
16a0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
16b0: 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20 73  dbeTrace)!=0 ? s
16c0: 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20 73  tdout : 0;.    s
16d0: 71 6c 69 74 65 33 56 64 62 65 54 72 61 63 65 28  qlite3VdbeTrace(
16e0: 76 2c 20 74 72 61 63 65 29 3b 0a 20 20 20 20 73  v, trace);.    s
16f0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
1700: 61 64 79 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e  ady(v, pParse->n
1710: 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65  Var, pParse->nMe
1720: 6d 2b 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20  m+3,.           
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
1740: 61 72 73 65 2d 3e 6e 54 61 62 2b 33 2c 20 70 50  arse->nTab+3, pP
1750: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a  arse->explain);.
1760: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
1770: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1780: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
1790: 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  esSet = 0;.  }el
17a0: 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72  se if( pParse->r
17b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17c0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
17d0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
17e0: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61   }.  pParse->nTa
17f0: 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  b = 0;.  pParse-
1800: 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61  >nMem = 0;.  pPa
1810: 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20  rse->nSet = 0;. 
1820: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
1830: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f  0;.  pParse->coo
1840: 6b 69 65 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70  kieMask = 0;.  p
1850: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
1860: 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  o = 0;.}../*.** 
1870: 52 75 6e 20 74 68 65 20 70 61 72 73 65 72 20 61  Run the parser a
1880: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  nd code generato
1890: 72 20 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e  r recursively in
18a0: 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61   order to genera
18b0: 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74  te.** code for t
18c0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
18d0: 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20   given onto the 
18e0: 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72 73  end of the pPars
18f0: 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72  e context.** cur
1900: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
1910: 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e  struction.  When
1920: 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20 72   the parser is r
1930: 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a  un recursively.*
1940: 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20  * this way, the 
1950: 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73  final OP_Halt is
1960: 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e   not appended an
1970: 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69  d other initiali
1980: 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69  zation.** and fi
1990: 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73  nalization steps
19a0: 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63   are omitted bec
19b0: 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 68  ause those are h
19c0: 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a  andling by the.*
19d0: 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73  * outermost pars
19e0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76  er..**.** Not ev
19f0: 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74  erything is nest
1a00: 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69  able.  This faci
1a10: 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e 65 64  lity is designed
1a20: 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e   to permit.** IN
1a30: 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e  SERT, UPDATE, an
1a40: 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69  d DELETE operati
1a50: 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49  ons against SQLI
1a60: 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a  TE_MASTER.  Use.
1a70: 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20 64  ** care if you d
1a80: 65 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20  ecide to try to 
1a90: 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  use this routine
1aa0: 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
1ab0: 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69  purposes..*/.voi
1ac0: 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50  d sqlite3NestedP
1ad0: 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  arse(Parse *pPar
1ae0: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
1af0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
1b00: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
1b10: 68 61 72 20 2a 7a 53 71 6c 3b 0a 23 20 64 65 66  har *zSql;.# def
1b20: 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69  ine SAVE_SZ  (si
1b30: 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66  zeof(Parse) - of
1b40: 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61  fsetof(Parse,nVa
1b50: 72 29 29 0a 20 20 63 68 61 72 20 73 61 76 65 42  r)).  char saveB
1b60: 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20  uf[SAVE_SZ];..  
1b70: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1b80: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
1b90: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73  ert( pParse->nes
1ba0: 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65  ted<10 );  /* Ne
1bb0: 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c  sting should onl
1bc0: 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20  y be of limited 
1bd0: 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74  depth */.  va_st
1be0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
1bf0: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
1c00: 65 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72 6d  e3VMPrintf(zForm
1c10: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
1c20: 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71  d(ap);.  if( zSq
1c30: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  l==0 ){.    retu
1c40: 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f  rn;   /* A mallo
1c50: 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
1c60: 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72  ed */.  }.  pPar
1c70: 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20  se->nested++;.  
1c80: 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20  memcpy(saveBuf, 
1c90: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53  &pParse->nVar, S
1ca0: 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65  AVE_SZ);.  memse
1cb0: 74 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  t(&pParse->nVar,
1cc0: 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20   0, SAVE_SZ);.  
1cd0: 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72  sqlite3RunParser
1ce0: 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 30  (pParse, zSql, 0
1cf0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
1d00: 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28  zSql);.  memcpy(
1d10: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73  &pParse->nVar, s
1d20: 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29  aveBuf, SAVE_SZ)
1d30: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  ;.  pParse->nest
1d40: 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  ed--;.}../*.** L
1d50: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
1d60: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
1d70: 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70  at describes a p
1d80: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
1d90: 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65  se.** table give
1da0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
1db0: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
1dc0: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
1dd0: 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  me of the.** dat
1de0: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
1df0: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
1e00: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
1e10: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
1e20: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
1e30: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
1e40: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
1e50: 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  he table and the
1e60: 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69  .** first matchi
1e70: 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75  ng table is retu
1e80: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
1e90: 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ing for duplicat
1ea0: 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73  e table.** names
1eb0: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
1ec0: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20  search order is 
1ed0: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
1ee0: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a   MAIN, then any.
1ef0: 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ** auxiliary dat
1f00: 61 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69  abases added usi
1f10: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
1f20: 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  mmand..**.** See
1f30: 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63   also sqlite3Loc
1f40: 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54  ateTable()..*/.T
1f50: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e  able *sqlite3Fin
1f60: 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  dTable(sqlite3 *
1f70: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
1f80: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
1f90: 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20  r *zDatabase){. 
1fa0: 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20   Table *p = 0;. 
1fb0: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
1fc0: 28 20 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ( zName!=0 );.  
1fd0: 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44  for(i=OMIT_TEMPD
1fe0: 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  B; i<db->nDb; i+
1ff0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
2000: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
2010: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d     /* Search TEM
2020: 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f  P before MAIN */
2030: 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61  .    if( zDataba
2040: 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  se!=0 && sqlite3
2050: 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73  StrICmp(zDatabas
2060: 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e  e, db->aDb[j].zN
2070: 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ame) ) continue;
2080: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
2090: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
20a0: 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62  b[j].pSchema->tb
20b0: 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74  lHash, zName, st
20c0: 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a  rlen(zName)+1);.
20d0: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
20e0: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
20f0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
2100: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
2110: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2120: 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74  describes a part
2130: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a  icular database.
2140: 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  ** table given t
2150: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
2160: 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f  table and (optio
2170: 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20  nally) the name 
2180: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
2190: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
21a0: 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
21b0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
21c0: 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20  nd.  Also leave 
21d0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73  an.** error mess
21e0: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
21f0: 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
2200: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
2210: 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
2220: 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  e and sqlite3Fin
2230: 64 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74  dTable() is that
2240: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
2250: 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72   leaves an error
2260: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2270: 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72  se->zErrMsg wher
2280: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64  e.** sqlite3Find
2290: 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74  Table() does not
22a0: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
22b0: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 50  te3LocateTable(P
22c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
22d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
22e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
22f0: 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ase){.  Table *p
2300: 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
2310: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
2320: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
2330: 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
2340: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
2350: 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
2360: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
2370: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
2380: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
2390: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
23a0: 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
23b0: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20  n 0;.  }..  p = 
23c0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
23d0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
23e0: 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69  me, zDbase);.  i
23f0: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69  f( p==0 ){.    i
2400: 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20 20 20  f( zDbase ){.   
2410: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2420: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
2430: 75 63 68 20 74 61 62 6c 65 3a 20 25 73 2e 25 73  uch table: %s.%s
2440: 22 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65  ", zDbase, zName
2450: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2460: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2470: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
2480: 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c  such table: %s",
2490: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   zName);.    }. 
24a0: 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
24b0: 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a  Schema = 1;.  }.
24c0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
24d0: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
24e0: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
24f0: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
2500: 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75  es .** a particu
2510: 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20  lar index given 
2520: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
2530: 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68   index.** and th
2540: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
2550: 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74  tabase that cont
2560: 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a  ains the index..
2570: 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
2580: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
2590: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
25a0: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
25b0: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
25c0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c   for the.** tabl
25d0: 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  e and the first 
25e0: 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69  matching index i
25f0: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
2600: 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72   checking.** for
2610: 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78   duplicate index
2620: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
2630: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
2640: 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69  er is.** TEMP fi
2650: 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20  rst, then MAIN, 
2660: 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61  then any auxilia
2670: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
2680: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ed.** using the 
2690: 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a  ATTACH command..
26a0: 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65  */.Index *sqlite
26b0: 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74  3FindIndex(sqlit
26c0: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
26d0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
26e0: 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49   char *zDb){.  I
26f0: 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69  ndex *p = 0;.  i
2700: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d  nt i;.  for(i=OM
2710: 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d  IT_TEMPDB; i<db-
2720: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
2730: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
2740: 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61  i^1 : i;  /* Sea
2750: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
2760: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65  MAIN */.    Sche
2770: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62  ma *pSchema = db
2780: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
2790: 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26  ;.    if( zDb &&
27a0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
27b0: 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  zDb, db->aDb[j].
27c0: 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  zName) ) continu
27d0: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
27e0: 53 63 68 65 6d 61 20 7c 7c 20 28 6a 3d 3d 31 20  Schema || (j==1 
27f0: 26 26 20 21 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  && !db->aDb[1].p
2800: 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
2810: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
2820: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  p = sqlite3HashF
2830: 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  ind(&pSchema->id
2840: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74  xHash, zName, st
2850: 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a  rlen(zName)+1);.
2860: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 20      }.    if( p 
2870: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
2880: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
2890: 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65  * Reclaim the me
28a0: 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20  mory used by an 
28b0: 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20  index.*/.static 
28c0: 76 6f 69 64 20 66 72 65 65 49 6e 64 65 78 28 49  void freeIndex(I
28d0: 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73 71 6c 69  ndex *p){.  sqli
28e0: 74 65 46 72 65 65 28 70 2d 3e 7a 43 6f 6c 41 66  teFree(p->zColAf
28f0: 66 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  f);.  sqliteFree
2900: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (p);.}../*.** Re
2910: 6d 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20 69  move the given i
2920: 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e  ndex from the in
2930: 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c 20  dex hash table, 
2940: 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73 20  and free.** its 
2950: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
2960: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64  s..**.** The ind
2970: 65 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ex is removed fr
2980: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
2990: 68 61 73 68 20 74 61 62 6c 65 73 20 62 75 74 0a  hash tables but.
29a0: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c  ** it is not unl
29b0: 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 54  inked from the T
29c0: 61 62 6c 65 20 74 68 61 74 20 69 74 20 69 6e 64  able that it ind
29d0: 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69  exes..** Unlinki
29e0: 6e 67 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c  ng from the Tabl
29f0: 65 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 62  e must be done b
2a00: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
2a10: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
2a20: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c  c void sqliteDel
2a30: 65 74 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  eteIndex(Index *
2a40: 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6c  p){.  Index *pOl
2a50: 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d;.  const char 
2a60: 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d  *zName = p->zNam
2a70: 65 3b 0a 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c  e;..  pOld = sql
2a80: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
2a90: 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  p->pSchema->idxH
2aa0: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  ash, zName, strl
2ab0: 65 6e 28 20 7a 4e 61 6d 65 29 2b 31 2c 20 30 29  en( zName)+1, 0)
2ac0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64  ;.  assert( pOld
2ad0: 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29  ==0 || pOld==p )
2ae0: 3b 0a 20 20 66 72 65 65 49 6e 64 65 78 28 70 29  ;.  freeIndex(p)
2af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  ;.}../*.** For t
2b00: 68 65 20 69 6e 64 65 78 20 63 61 6c 6c 65 64 20  he index called 
2b10: 7a 49 64 78 4e 61 6d 65 20 77 68 69 63 68 20 69  zIdxName which i
2b20: 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64  s found in the d
2b30: 61 74 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20  atabase iDb,.** 
2b40: 75 6e 6c 69 6b 65 20 74 68 61 74 20 69 6e 64 65  unlike that inde
2b50: 78 20 66 72 6f 6d 20 69 74 73 20 54 61 62 6c 65  x from its Table
2b60: 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   then remove the
2b70: 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74   index from.** t
2b80: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
2b90: 62 6c 65 20 61 6e 64 20 66 72 65 65 20 61 6c 6c  ble and free all
2ba0: 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
2bb0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  es associated.**
2bc0: 20 77 69 74 68 20 74 68 65 20 69 6e 64 65 78 2e   with the index.
2bd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2be0: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49  UnlinkAndDeleteI
2bf0: 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62  ndex(sqlite3 *db
2c00: 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74  , int iDb, const
2c10: 20 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29   char *zIdxName)
2c20: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
2c30: 78 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  x;.  int len;.  
2c40: 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 26 64  Hash *pHash = &d
2c50: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
2c60: 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 0a 20  ema->idxHash;.. 
2c70: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 49   len = strlen(zI
2c80: 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65  dxName);.  pInde
2c90: 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  x = sqlite3HashI
2ca0: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64  nsert(pHash, zId
2cb0: 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31 2c 20 30 29  xName, len+1, 0)
2cc0: 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
2cd0: 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  {.    if( pIndex
2ce0: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
2cf0: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
2d00: 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
2d10: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
2d20: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  x->pNext;.    }e
2d30: 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
2d40: 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70   *p;.      for(p
2d50: 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d  =pIndex->pTable-
2d60: 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d  >pIndex; p && p-
2d70: 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b 20  >pNext!=pIndex; 
2d80: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  p=p->pNext){}.  
2d90: 20 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e      if( p && p->
2da0: 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b  pNext==pIndex ){
2db0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  .        p->pNex
2dc0: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
2dd0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
2de0: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70  .    freeIndex(p
2df0: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62  Index);.  }.  db
2e00: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
2e10: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
2e20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
2e30: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
2e40: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
2e50: 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
2e60: 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 61 20 73 69  ables of.** a si
2e70: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 2e 20 20  ngle database.  
2e80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2e90: 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61 69  called to reclai
2ea0: 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f  m memory.** befo
2eb0: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
2ec0: 63 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61  closes.  It is a
2ed0: 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e  lso called durin
2ee0: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  g a rollback.** 
2ef0: 69 66 20 74 68 65 72 65 20 77 65 72 65 20 73 63  if there were sc
2f00: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72  hema changes dur
2f10: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74  ing the transact
2f20: 69 6f 6e 20 6f 72 20 69 66 20 61 0a 2a 2a 20 73  ion or if a.** s
2f30: 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69 73  chema-cookie mis
2f40: 6d 61 74 63 68 20 6f 63 63 75 72 73 2e 0a 2a 2a  match occurs..**
2f50: 0a 2a 2a 20 49 66 20 69 44 62 3c 3d 30 20 74 68  .** If iDb<=0 th
2f60: 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74  en reset the int
2f70: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62  ernal schema tab
2f80: 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  les for all data
2f90: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20  base.** files.  
2fa0: 49 66 20 69 44 62 3e 3d 32 20 74 68 65 6e 20 72  If iDb>=2 then r
2fb0: 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61  eset the interna
2fc0: 6c 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c  l schema for onl
2fd0: 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20  y the.** single 
2fe0: 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64 2e 0a  file indicated..
2ff0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
3000: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
3010: 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ma(sqlite3 *db, 
3020: 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20  int iDb){.  int 
3030: 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65 72 74 28  i, j;..  assert(
3040: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
3050: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 66 6f 72 28  b->nDb );.  for(
3060: 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44 62  i=iDb; i<db->nDb
3070: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a  ; i++){.    Db *
3080: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
3090: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
30a0: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
30b0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 46 72   sqlite3SchemaFr
30c0: 65 65 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29  ee(pDb->pSchema)
30d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30e0: 69 44 62 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb>0 ) return;.
30f0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 44    }.  assert( iD
3100: 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c  b==0 );.  db->fl
3110: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
3120: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 20  nternChanges;.. 
3130: 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f   /* If one or mo
3140: 72 65 20 6f 66 20 74 68 65 20 61 75 78 69 6c 69  re of the auxili
3150: 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ary database fil
3160: 65 73 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73  es has been clos
3170: 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65  ed,.  ** then re
3180: 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74  move them from t
3190: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
31a0: 61 62 61 73 65 20 6c 69 73 74 2e 20 20 57 65 20  abase list.  We 
31b0: 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20 6f 70  take the.  ** op
31c0: 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 64 6f 20  portunity to do 
31d0: 74 68 69 73 20 68 65 72 65 20 73 69 6e 63 65 20  this here since 
31e0: 77 65 20 68 61 76 65 20 6a 75 73 74 20 64 65 6c  we have just del
31f0: 65 74 65 64 20 61 6c 6c 20 6f 66 20 74 68 65 0a  eted all of the.
3200: 20 20 2a 2a 20 73 63 68 65 6d 61 20 68 61 73 68    ** schema hash
3210: 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 72   tables and ther
3220: 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68 61 76  efore do not hav
3230: 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 63 68  e to make any ch
3240: 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 61 6e  anges.  ** to an
3250: 79 20 6f 66 20 74 68 6f 73 65 20 74 61 62 6c 65  y of those table
3260: 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
3270: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
3280: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
3290: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
32a0: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
32b0: 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  b->pBt==0 ){.   
32c0: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 41 75 78     if( pDb->pAux
32d0: 20 26 26 20 70 44 62 2d 3e 78 46 72 65 65 41 75   && pDb->xFreeAu
32e0: 78 20 29 20 70 44 62 2d 3e 78 46 72 65 65 41 75  x ) pDb->xFreeAu
32f0: 78 28 70 44 62 2d 3e 70 41 75 78 29 3b 0a 20 20  x(pDb->pAux);.  
3300: 20 20 20 20 70 44 62 2d 3e 70 41 75 78 20 3d 20      pDb->pAux = 
3310: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  0;.    }.  }.  f
3320: 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e  or(i=j=2; i<db->
3330: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nDb; i++){.    s
3340: 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20  truct Db *pDb = 
3350: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
3360: 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30   if( pDb->pBt==0
3370: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3380: 46 72 65 65 28 70 44 62 2d 3e 7a 4e 61 6d 65 29  Free(pDb->zName)
3390: 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61  ;.      pDb->zNa
33a0: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f  me = 0;.      co
33b0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
33c0: 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20    if( j<i ){.   
33d0: 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20     db->aDb[j] = 
33e0: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
33f0: 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  }.    j++;.  }. 
3400: 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44 62   memset(&db->aDb
3410: 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62  [j], 0, (db->nDb
3420: 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61  -j)*sizeof(db->a
3430: 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e  Db[j]));.  db->n
3440: 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62  Db = j;.  if( db
3450: 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e  ->nDb<=2 && db->
3460: 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 74  aDb!=db->aDbStat
3470: 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  ic ){.    memcpy
3480: 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c 20  (db->aDbStatic, 
3490: 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f  db->aDb, 2*sizeo
34a0: 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a  f(db->aDb[0]));.
34b0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 64      sqliteFree(d
34c0: 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d  b->aDb);.    db-
34d0: 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74  >aDb = db->aDbSt
34e0: 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  atic;.  }.}../*.
34f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3500: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76  is called whenev
3510: 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  er a rollback oc
3520: 63 75 72 73 2e 20 20 49 66 20 74 68 65 72 65 20  curs.  If there 
3530: 77 65 72 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63  were.** schema c
3540: 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68  hanges during th
3550: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  e transaction, t
3560: 68 65 6e 20 77 65 20 68 61 76 65 20 74 6f 20 72  hen we have to r
3570: 65 73 65 74 20 74 68 65 0a 2a 2a 20 69 6e 74 65  eset the.** inte
3580: 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73  rnal hash tables
3590: 20 61 6e 64 20 72 65 6c 6f 61 64 20 74 68 65 6d   and reload them
35a0: 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76   from disk..*/.v
35b0: 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  oid sqlite3Rollb
35c0: 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  ackInternalChang
35d0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
35e0: 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  .  if( db->flags
35f0: 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e   & SQLITE_Intern
3600: 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 73  Changes ){.    s
3610: 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
3620: 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29  nalSchema(db, 0)
3630: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3640: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
3650: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d  alled when a com
3660: 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76  mit occurs..*/.v
3670: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
3680: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
3690: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
36a0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
36b0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
36c0: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ges;.}../*.** Cl
36d0: 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
36e0: 61 6d 65 73 20 66 72 6f 6d 20 61 20 74 61 62 6c  ames from a tabl
36f0: 65 20 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a 73 74  e or view..*/.st
3700: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
3710: 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ResetColumnNames
3720: 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b  (Table *pTable){
3730: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75  .  int i;.  Colu
3740: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65  mn *pCol;.  asse
3750: 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b  rt( pTable!=0 );
3760: 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20 70  .  if( (pCol = p
3770: 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20  Table->aCol)!=0 
3780: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
3790: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
37a0: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
37b0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
37c0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
37d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
37e0: 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66 6c 74  lete(pCol->pDflt
37f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
3800: 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29  ree(pCol->zType)
3810: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
3820: 65 65 28 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b  ee(pCol->zColl);
3830: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
3840: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
3850: 6f 6c 29 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  ol);.  }.  pTabl
3860: 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  e->aCol = 0;.  p
3870: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
3880: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
3890: 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61   the memory data
38a0: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
38b0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
38c0: 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20  given.** Table. 
38d0: 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
38e0: 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20  made to disk by 
38f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
3900: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3910: 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68   just deletes th
3920: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
3930: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75  .  It does not u
3940: 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62  nlink.** the tab
3950: 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  le data structur
3960: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
3970: 74 61 62 6c 65 2e 20 20 4e 6f 72 20 64 6f 65 73  table.  Nor does
3980: 20 69 74 20 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f   it remove.** fo
3990: 72 65 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d 20  reign keys from 
39a0: 74 68 65 20 73 71 6c 69 74 65 2e 61 46 4b 65 79  the sqlite.aFKey
39b0: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75   hash table.  Bu
39c0: 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f  t it does destro
39d0: 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75  y.** memory stru
39e0: 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e  ctures of the in
39f0: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
3a00: 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65  n keys associate
3a10: 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74  d with .** the t
3a20: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69  able..**.** Indi
3a30: 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
3a40: 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 61 72  ith the table ar
3a50: 65 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  e unlinked from 
3a60: 74 68 65 20 22 64 62 22 0a 2a 2a 20 64 61 74 61  the "db".** data
3a70: 20 73 74 72 75 63 74 75 72 65 20 69 66 20 64 62   structure if db
3a80: 21 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d 3d  !=NULL.  If db==
3a90: 4e 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61 74  NULL, indices at
3aa0: 74 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68 65  tached to.** the
3ab0: 20 74 61 62 6c 65 20 61 72 65 20 64 65 6c 65 74   table are delet
3ac0: 65 64 2c 20 62 75 74 20 69 74 20 69 73 20 61 73  ed, but it is as
3ad0: 73 75 6d 65 64 20 74 68 65 79 20 68 61 76 65 20  sumed they have 
3ae0: 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20  already been.** 
3af0: 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69  unlinked..*/.voi
3b00: 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54  d sqlite3DeleteT
3b10: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
3b20: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
3b30: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
3b40: 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65  x, *pNext;.  FKe
3b50: 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74  y *pFKey, *pNext
3b60: 46 4b 65 79 3b 0a 0a 20 20 64 62 20 3d 20 30 3b  FKey;..  db = 0;
3b70: 0a 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ..  if( pTable==
3b80: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  0 ) return;..  /
3b90: 2a 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  * Do not delete 
3ba0: 74 68 65 20 74 61 62 6c 65 20 75 6e 74 69 6c 20  the table until 
3bb0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
3bc0: 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f  unt reaches zero
3bd0: 2e 20 2a 2f 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  . */.  pTable->n
3be0: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 54 61  Ref--;.  if( pTa
3bf0: 62 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20  ble->nRef>0 ){. 
3c00: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
3c10: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
3c20: 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >nRef==0 );..  /
3c30: 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64  * Delete all ind
3c40: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
3c50: 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 0a  with this table.
3c60: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65    */.  for(pInde
3c70: 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64  x = pTable->pInd
3c80: 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
3c90: 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ex=pNext){.    p
3ca0: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
3cb0: 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74  Next;.    assert
3cc0: 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  ( pIndex->pSchem
3cd0: 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  a==pTable->pSche
3ce0: 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ma );.    sqlite
3cf0: 44 65 6c 65 74 65 49 6e 64 65 78 28 70 49 6e 64  DeleteIndex(pInd
3d00: 65 78 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  ex);.  }..#ifnde
3d10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
3d20: 52 45 49 47 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44  REIGN_KEY.  /* D
3d30: 65 6c 65 74 65 20 61 6c 6c 20 66 6f 72 65 69 67  elete all foreig
3d40: 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65  n keys associate
3d50: 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c  d with this tabl
3d60: 65 2e 20 20 54 68 65 20 6b 65 79 73 0a 20 20 2a  e.  The keys.  *
3d70: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  * should have al
3d80: 72 65 61 64 79 20 62 65 65 6e 20 75 6e 6c 69 6e  ready been unlin
3d90: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ked from the db-
3da0: 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c  >aFKey hash tabl
3db0: 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46  e .  */.  for(pF
3dc0: 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65  Key=pTable->pFKe
3dd0: 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d  y; pFKey; pFKey=
3de0: 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20 20  pNextFKey){.    
3df0: 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b 65  pNextFKey = pFKe
3e00: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20  y->pNextFrom;.  
3e10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3e20: 33 48 61 73 68 46 69 6e 64 28 26 70 54 61 62 6c  3HashFind(&pTabl
3e30: 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65  e->pSchema->aFKe
3e40: 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
3e60: 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e  Key->zTo, strlen
3e70: 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21  (pFKey->zTo)+1)!
3e80: 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73 71  =pFKey );.    sq
3e90: 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b  liteFree(pFKey);
3ea0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
3eb0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62  * Delete the Tab
3ec0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73  le structure its
3ed0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  elf..  */.  sqli
3ee0: 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  teResetColumnNam
3ef0: 65 73 28 70 54 61 62 6c 65 29 3b 0a 20 20 73 71  es(pTable);.  sq
3f00: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
3f10: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  >zName);.  sqlit
3f20: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 43  eFree(pTable->zC
3f30: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
3f40: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54  3SelectDelete(pT
3f50: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  able->pSelect);.
3f60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3f70: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73 71 6c 69  MIT_CHECK.  sqli
3f80: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 54  te3ExprDelete(pT
3f90: 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23  able->pCheck);.#
3fa0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56  endif.  sqlite3V
3fb0: 74 61 62 43 6c 65 61 72 28 70 54 61 62 6c 65 29  tabClear(pTable)
3fc0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
3fd0: 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Table);.}../*.**
3fe0: 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65   Unlink the give
3ff0: 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  n table from the
4000: 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64   hash tables and
4010: 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a   the delete the.
4020: 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  ** table structu
4030: 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20  re with all its 
4040: 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65  indices and fore
4050: 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69  ign keys..*/.voi
4060: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
4070: 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  ndDeleteTable(sq
4080: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
4090: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
40a0: 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62  zTabName){.  Tab
40b0: 6c 65 20 2a 70 3b 0a 20 20 46 4b 65 79 20 2a 70  le *p;.  FKey *p
40c0: 46 31 2c 20 2a 70 46 32 3b 0a 20 20 44 62 20 2a  F1, *pF2;.  Db *
40d0: 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
40e0: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
40f0: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
4100: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
4110: 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 26  sert( zTabName &
4120: 26 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 20 29 3b  & zTabName[0] );
4130: 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
4140: 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71  b[iDb];.  p = sq
4150: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
4160: 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
4170: 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65  blHash, zTabName
4180: 2c 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61 6d  , strlen(zTabNam
4190: 65 29 2b 31 2c 30 29 3b 0a 20 20 69 66 28 20 70  e)+1,0);.  if( p
41a0: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
41b0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
41c0: 4b 45 59 0a 20 20 20 20 66 6f 72 28 70 46 31 3d  KEY.    for(pF1=
41d0: 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31 3b 20 70  p->pFKey; pF1; p
41e0: 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74 46 72 6f  F1=pF1->pNextFro
41f0: 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  m){.      int nT
4200: 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 31 2d 3e  o = strlen(pF1->
4210: 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  zTo) + 1;.      
4220: 70 46 32 20 3d 20 73 71 6c 69 74 65 33 48 61 73  pF2 = sqlite3Has
4230: 68 46 69 6e 64 28 26 70 44 62 2d 3e 70 53 63 68  hFind(&pDb->pSch
4240: 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d  ema->aFKey, pF1-
4250: 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20  >zTo, nTo);.    
4260: 20 20 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29    if( pF2==pF1 )
4270: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4280: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
4290: 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79  ->pSchema->aFKey
42a0: 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c  , pF1->zTo, nTo,
42b0: 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b 0a   pF1->pNextTo);.
42c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
42d0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32 20       while( pF2 
42e0: 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 21  && pF2->pNextTo!
42f0: 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32 2d  =pF1 ){ pF2=pF2-
4300: 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20 20  >pNextTo; }.    
4310: 20 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a 20      if( pF2 ){. 
4320: 20 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70 4e           pF2->pN
4330: 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65  extTo = pF1->pNe
4340: 78 74 54 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xtTo;.        }.
4350: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
4360: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
4370: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
4380: 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c  p);.  }.  db->fl
4390: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
43a0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
43b0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f  /*.** Given a to
43c0: 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74  ken, return a st
43d0: 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73  ring that consis
43e0: 74 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f  ts of the text o
43f0: 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20  f that.** token 
4400: 77 69 74 68 20 61 6e 79 20 71 75 6f 74 61 74 69  with any quotati
4410: 6f 6e 73 20 72 65 6d 6f 76 65 64 2e 20 20 53 70  ons removed.  Sp
4420: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
4430: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
4440: 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ** is obtained f
4450: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
4460: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
4470: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
4480: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  ing.** function.
4490: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
44a0: 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69  e often just poi
44b0: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
44c0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
44d0: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
44e0: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
44f0: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
4500: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
4510: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
4520: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
4530: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
4540: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
4550: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
4560: 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e  mToken(Token *pN
4570: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
4580: 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  ame;.  if( pName
4590: 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
45a0: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 28 63  sqliteStrNDup((c
45b0: 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70  har*)pName->z, p
45c0: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71  Name->n);.    sq
45d0: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
45e0: 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
45f0: 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d    zName = 0;.  }
4600: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
4610: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
4620: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
4630: 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e   table stored in
4640: 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   database number
4650: 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74   iDb for.** writ
4660: 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69  ing. The table i
4670: 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63  s opened using c
4680: 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ursor 0..*/.void
4690: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
46a0: 65 72 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  erTable(Parse *p
46b0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
46c0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
46d0: 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73 71 6c  etVdbe(p);.  sql
46e0: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ite3TableLock(p,
46f0: 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f   iDb, MASTER_ROO
4700: 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54 41 42  T, 1, SCHEMA_TAB
4710: 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71 6c 69  LE(iDb));.  sqli
4720: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4730: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c  OP_Integer, iDb,
4740: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
4750: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
4760: 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54  enWrite, 0, MAST
4770: 45 52 5f 52 4f 4f 54 29 3b 0a 20 20 73 71 6c 69  ER_ROOT);.  sqli
4780: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4790: 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
47a0: 2c 20 30 2c 20 35 29 3b 20 2f 2a 20 73 71 6c 69  , 0, 5); /* sqli
47b0: 74 65 5f 6d 61 73 74 65 72 20 68 61 73 20 35 20  te_master has 5 
47c0: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f 2a  columns */.}../*
47d0: 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70  .** The token *p
47e0: 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Name contains th
47f0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61  e name of a data
4800: 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d 61  base (either "ma
4810: 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22  in" or.** "temp"
4820: 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   or the name of 
4830: 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e  an attached db).
4840: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
4850: 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64  turns the.** ind
4860: 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  ex of the named 
4870: 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e  database in db->
4880: 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20  aDb[], or -1 if 
4890: 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a  the named db .**
48a0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
48b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
48c0: 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64  indDb(sqlite3 *d
48d0: 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  b, Token *pName)
48e0: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20  {.  int i = -1; 
48f0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
4900: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  umber */.  int n
4910: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
4920: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
4930: 73 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 2a 2f  s in the name */
4940: 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20  .  Db *pDb;     
4950: 20 20 2f 2a 20 41 20 64 61 74 61 62 61 73 65 20    /* A database 
4960: 77 68 6f 73 65 20 6e 61 6d 65 20 73 70 61 63 65  whose name space
4970: 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68   is being search
4980: 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ed */.  char *zN
4990: 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 77  ame;   /* Name w
49a0: 65 20 61 72 65 20 73 65 61 72 63 68 69 6e 67 20  e are searching 
49b0: 66 6f 72 20 2a 2f 0a 0a 20 20 7a 4e 61 6d 65 20  for */..  zName 
49c0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
49d0: 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
49e0: 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
49f0: 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61    n = strlen(zNa
4a00: 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28  me);.    for(i=(
4a10: 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d  db->nDb-1), pDb=
4a20: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d  &db->aDb[i]; i>=
4a30: 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a  0; i--, pDb--){.
4a40: 20 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49 54        if( (!OMIT
4a50: 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31 20  _TEMPDB || i!=1 
4a60: 29 20 26 26 20 6e 3d 3d 73 74 72 6c 65 6e 28 70  ) && n==strlen(p
4a70: 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20  Db->zName) && . 
4a80: 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69           0==sqli
4a90: 74 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e  te3StrICmp(pDb->
4aa0: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  zName, zName) ){
4ab0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4ac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4ad0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
4ae0: 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  me);.  }.  retur
4af0: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74  n i;.}../* The t
4b00: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20  able or view or 
4b10: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20  trigger name is 
4b20: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
4b30: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
4b40: 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20  s.** pName1 and 
4b50: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
4b60: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
4b70: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
4b80: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
4b90: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
4ba0: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a  xx.yyy (...);.**
4bb0: 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31   .** Then pName1
4bc0: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
4bd0: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
4be0: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
4bf0: 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74  hand if.** the t
4c00: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
4c10: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
4c20: 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52  , i.e.:.**.** CR
4c30: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
4c40: 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ..);.**.** Then 
4c50: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
4c60: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
4c70: 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54  2 is ""..**.** T
4c80: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
4c90: 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70   the *ppUnqual p
4ca0: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
4cb0: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
4cc0: 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65  ame1 or.** pName
4cd0: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
4ce0: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
4cf0: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
4d00: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
4d10: 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69  database "xxx" i
4d20: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
4d30: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
4d40: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
4d50: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
4d60: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
4d70: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
4d80: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
4d90: 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20  pName1,      /* 
4da0: 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65  The "xxx" in the
4db0: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
4dc0: 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f  or "xxx" */.  To
4dd0: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
4de0: 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69    /* The "yyy" i
4df0: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
4e00: 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  yyy" */.  Token 
4e10: 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a  **pUnqual     /*
4e20: 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61   Write the unqua
4e30: 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61  lified object na
4e40: 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  me here */.){.  
4e50: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
4e70: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
4e80: 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
4e90: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
4ea0: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
4eb0: 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65   pName2 && pName
4ec0: 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73  2->n>0 ){.    as
4ed0: 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
4ee0: 62 75 73 79 20 29 3b 0a 20 20 20 20 2a 70 55 6e  busy );.    *pUn
4ef0: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20  qual = pName2;. 
4f00: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
4f10: 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65  FindDb(db, pName
4f20: 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  1);.    if( iDb<
4f30: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
4f40: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4f50: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  e, "unknown data
4f60: 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31  base %T", pName1
4f70: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
4f80: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  >nErr++;.      r
4f90: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
4fa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
4fb0: 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44  ert( db->init.iD
4fc0: 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74  b==0 || db->init
4fd0: 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62  .busy );.    iDb
4fe0: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b   = db->init.iDb;
4ff0: 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20  .    *pUnqual = 
5000: 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65  pName1;.  }.  re
5010: 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a  turn iDb;.}../*.
5020: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5030: 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  is used to check
5040: 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74   if the UTF-8 st
5050: 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20  ring zName is a 
5060: 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69  legal.** unquali
5070: 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20  fied name for a 
5080: 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63  new schema objec
5090: 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c  t (table, index,
50a0: 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67   view or.** trig
50b0: 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20  ger). All names 
50c0: 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74  are legal except
50d0: 20 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69   those that begi
50e0: 6e 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e  n with the strin
50f0: 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28  g.** "sqlite_" (
5100: 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20  in upper, lower 
5110: 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20  or mixed case). 
5120: 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20  This portion of 
5130: 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a  the namespace.**
5140: 20 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72   is reserved for
5150: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a   internal use..*
5160: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
5170: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72  ckObjectName(Par
5180: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
5190: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
51a0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64    if( !pParse->d
51b0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
51c0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
51d0: 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  0 .          && 
51e0: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  (pParse->db->fla
51f0: 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74  gs & SQLITE_Writ
5200: 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20  eSchema)==0.    
5210: 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69        && 0==sqli
5220: 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d  te3StrNICmp(zNam
5230: 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
5240: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
5250: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5260: 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73  "object name res
5270: 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e  erved for intern
5280: 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61  al use: %s", zNa
5290: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
52a0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
52b0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
52c0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  E_OK;.}../*.** B
52d0: 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  egin constructin
52e0: 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65  g a new table re
52f0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20  presentation in 
5300: 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73  memory.  This is
5310: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66  .** the first of
5320: 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20   several action 
5330: 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65  routines that ge
5340: 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70  t called in resp
5350: 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45  onse.** to a CRE
5360: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
5370: 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75  ent.  In particu
5380: 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  lar, this routin
5390: 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61  e is called.** a
53a0: 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65  fter seeing toke
53b0: 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20  ns "CREATE" and 
53c0: 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20  "TABLE" and the 
53d0: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20  table name. The 
53e0: 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69  isTemp.** flag i
53f0: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61  s true if the ta
5400: 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74  ble should be st
5410: 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69  ored in the auxi
5420: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a  liary database.*
5430: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
5440: 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  f in the main da
5450: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
5460: 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74  is is normally t
5470: 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20  he case.** when 
5480: 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54  the "TEMP" or "T
5490: 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72  EMPORARY" keywor
54a0: 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  d occurs in betw
54b0: 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e  een.** CREATE an
54c0: 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54  d TABLE..**.** T
54d0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
54e0: 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ord is initializ
54f0: 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50  ed and put in pP
5500: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e  arse->pNewTable.
5510: 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74  .** As more of t
5520: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
5530: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
5540: 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  sed, additional 
5550: 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e  action.** routin
5560: 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  es will be calle
5570: 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e  d to add more in
5580: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69  formation to thi
5590: 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20  s record..** At 
55a0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
55b0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
55c0: 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74  ement, the sqlit
55d0: 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75  e3EndTable() rou
55e0: 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
55f0: 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  d to complete th
5600: 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f  e construction o
5610: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
5620: 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20  record..*/.void 
5630: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
5640: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
5650: 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20  se,   /* Parser 
5660: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
5670: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a  en *pName1,   /*
5680: 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74   First part of t
5690: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
56a0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a  able or view */.
56b0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
56c0: 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72     /* Second par
56d0: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
56e0: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
56f0: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
5700: 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  mp,      /* True
5710: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45   if this is a TE
5720: 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  MP table */.  in
5730: 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f  t isView,      /
5740: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
5750: 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e  s a VIEW */.  in
5760: 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f  t isVirtual,   /
5770: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
5780: 73 20 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c  s a VIRTUAL tabl
5790: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72  e */.  int noErr
57a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
57b0: 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61  thing if table a
57c0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
57d0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
57e0: 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  ble;.  char *zNa
57f0: 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e  me = 0; /* The n
5800: 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ame of the new t
5810: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
5820: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
5830: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
5840: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
5850: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
5860: 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74  mber to create t
5870: 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20  he table in */. 
5880: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20   Token *pName;  
5890: 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
58a0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
58b0: 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  le to create */.
58c0: 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  .  /* The table 
58d0: 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20  or view name to 
58e0: 63 72 65 61 74 65 20 69 73 20 70 61 73 73 65 64  create is passed
58f0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
5900: 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a   via tokens.  **
5910: 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d   pName1 and pNam
5920: 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  e2. If the table
5930: 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20   name was fully 
5940: 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65  qualified, for e
5950: 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
5960: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
5970: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20  xx.yyy (...);.  
5980: 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e  ** .  ** Then pN
5990: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
59a0: 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  xxx" and pName2 
59b0: 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74  "yyy". On the ot
59c0: 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a  her hand if.  **
59d0: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
59e0: 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61  is not fully qua
59f0: 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20  lified, i.e.:.  
5a00: 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54  **.  ** CREATE T
5a10: 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20  ABLE yyy(...);. 
5a20: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e   **.  ** Then pN
5a30: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
5a40: 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  yyy" and pName2 
5a50: 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  is ""..  **.  **
5a60: 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20   The call below 
5a70: 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70  sets the pName p
5a80: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
5a90: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
5aa0: 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61  ame1 or.  ** pNa
5ab0: 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73  me2) that stores
5ac0: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
5ad0: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65   table name. The
5ae0: 20 76 61 72 69 61 62 6c 65 20 69 44 62 20 69 73   variable iDb is
5af0: 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65  .  ** set to the
5b00: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   index of the da
5b10: 74 61 62 61 73 65 20 74 68 61 74 20 74 68 65 20  tabase that the 
5b20: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73  table or view is
5b30: 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61   to be.  ** crea
5b40: 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69  ted in..  */.  i
5b50: 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
5b60: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
5b70: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
5b80: 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  &pName);.  if( i
5b90: 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
5ba0: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
5bb0: 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 69  B && isTemp && i
5bc0: 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Db>1 ){.    /* I
5bd0: 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d  f creating a tem
5be0: 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d  p table, the nam
5bf0: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61  e may not be qua
5c00: 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73 71  lified */.    sq
5c10: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5c20: 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79  arse, "temporary
5c30: 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74   table name must
5c40: 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22   be unqualified"
5c50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
5c60: 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54   }.  if( !OMIT_T
5c70: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
5c80: 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50  ) iDb = 1;..  pP
5c90: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
5ca0: 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61   = *pName;.  zNa
5cb0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
5cc0: 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
5cd0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
5ce0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
5cf0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
5d00: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
5d10: 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
5d20: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65  ) ){.    goto be
5d30: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
5d40: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69  .  }.  if( db->i
5d50: 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54  nit.iDb==1 ) isT
5d60: 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  emp = 1;.#ifndef
5d70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
5d80: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73  HORIZATION.  ass
5d90: 65 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31  ert( (isTemp & 1
5da0: 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b  )==isTemp );.  {
5db0: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
5dc0: 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64     char *zDb = d
5dd0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
5de0: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
5df0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
5e00: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
5e10: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
5e20: 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29  isTemp), 0, zDb)
5e30: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
5e40: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
5e50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5e60: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
5e70: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
5e80: 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20   && isTemp ){.  
5e90: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
5ea0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
5eb0: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  VIEW;.      }els
5ec0: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
5ed0: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
5ee0: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20  VIEW;.      }.  
5ef0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
5f00: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
5f10: 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  && isTemp ){.   
5f20: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
5f30: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
5f40: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
5f50: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
5f60: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
5f70: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20  TABLE;.      }. 
5f80: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73     }.    if( !is
5f90: 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74  Virtual && sqlit
5fa0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
5fb0: 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c  se, code, zName,
5fc0: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
5fd0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
5fe0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
5ff0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
6000: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
6010: 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f  ew table name do
6020: 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77  es not collide w
6030: 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  ith an existing.
6040: 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
6050: 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  ble name in the 
6060: 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20  same database.  
6070: 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d  Issue an error m
6080: 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69  essage if.  ** i
6090: 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65  t does. The exce
60a0: 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20  ption is if the 
60b0: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
60c0: 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65  parsed was passe
60d0: 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c  d.  ** to an sql
60e0: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
60f0: 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61  b() call. In tha
6100: 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20  t case only the 
6110: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a  column names.  *
6120: 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c  * and types will
6130: 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65   be used, so the
6140: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
6150: 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70   test for namesp
6160: 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69  ace.  ** collisi
6170: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
6180: 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42  !IN_DECLARE_VTAB
6190: 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   ){.    if( SQLI
61a0: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
61b0: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
61c0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
61d0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
61e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
61f0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  le = sqlite3Find
6200: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
6210: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
6220: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54  ame);.    if( pT
6230: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  able ){.      if
6240: 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20  ( !noErr ){.    
6250: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6260: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
6270: 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78  le %T already ex
6280: 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ists", pName);. 
6290: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
62a0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
62b0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ror;.    }.    i
62c0: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
62d0: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  dex(db, zName, 0
62e0: 29 21 3d 30 20 26 26 20 28 69 44 62 3d 3d 30 20  )!=0 && (iDb==0 
62f0: 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  || !db->init.bus
6300: 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  y) ){.      sqli
6310: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
6320: 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  se, "there is al
6330: 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e  ready an index n
6340: 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29  amed %s", zName)
6350: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  ;.      goto beg
6360: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
6370: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61      }.  }..  pTa
6380: 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ble = sqliteMall
6390: 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  oc( sizeof(Table
63a0: 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  ) );.  if( pTabl
63b0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72  e==0 ){.    pPar
63c0: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
63d0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73  NOMEM;.    pPars
63e0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
63f0: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
6400: 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61  error;.  }.  pTa
6410: 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  ble->zName = zNa
6420: 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50  me;.  pTable->iP
6430: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62  Key = -1;.  pTab
6440: 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62  le->pSchema = db
6450: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
6460: 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52  ma;.  pTable->nR
6470: 65 66 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50  ef = 1;.  if( pP
6480: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
6490: 29 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54  ) sqlite3DeleteT
64a0: 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d  able(db, pParse-
64b0: 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70  >pNewTable);.  p
64c0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
64d0: 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a   = pTable;..  /*
64e0: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
64f0: 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71  magic sqlite_seq
6500: 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64  uence table used
6510: 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   by autoincremen
6520: 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63  t,.  ** then rec
6530: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
6540: 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74   this table in t
6550: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
6560: 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
6570: 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63  so that INSERT c
6580: 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c  an find the tabl
6590: 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23  e easily..  */.#
65a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
65b0: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
65c0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
65d0: 6e 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70  nested && strcmp
65e0: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
65f0: 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b  sequence")==0 ){
6600: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63  .    pTable->pSc
6610: 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20  hema->pSeqTab = 
6620: 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  pTable;.  }.#end
6630: 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67  if..  /* Begin g
6640: 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f  enerating the co
6650: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73  de that will ins
6660: 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65  ert the table re
6670: 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74  cord into.  ** t
6680: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
6690: 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e   table.  Note in
66a0: 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74   particular that
66b0: 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61   we must go ahea
66c0: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63  d.  ** and alloc
66d0: 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ate the record n
66e0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
66f0: 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20  ble entry now.  
6700: 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20  Before any.  ** 
6710: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
6720: 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61  NIQUE keywords a
6730: 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73  re parsed.  Thos
6740: 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20  e keywords will 
6750: 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63  cause.  ** indic
6760: 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  es to be created
6770: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72   and the table r
6780: 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20  ecord must come 
6790: 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a  before the .  **
67a0: 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65   indices.  Hence
67b0: 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  , the record num
67c0: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
67d0: 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  e must be alloca
67e0: 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20  ted.  ** now..  
67f0: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
6800: 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20  it.busy && (v = 
6810: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
6820: 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20  Parse))!=0 ){.  
6830: 20 20 69 6e 74 20 6c 62 6c 3b 0a 20 20 20 20 69    int lbl;.    i
6840: 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20  nt fileFormat;. 
6850: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
6860: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
6870: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a  arse, 0, iDb);..
6880: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
6890: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e  le format and en
68a0: 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61  coding in the da
68b0: 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20  tabase have not 
68c0: 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a  been set, .    *
68d0: 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a  * set them now..
68e0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
68f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6900: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44  P_ReadCookie, iD
6910: 62 2c 20 31 29 3b 20 20 20 2f 2a 20 66 69 6c 65  b, 1);   /* file
6920: 5f 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20 6c  _format */.    l
6930: 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  bl = sqlite3Vdbe
6940: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
6950: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6960: 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20  Op(v, OP_If, 0, 
6970: 6c 62 6c 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f  lbl);.    fileFo
6980: 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67  rmat = (db->flag
6990: 73 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63  s & SQLITE_Legac
69a0: 79 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20  yFileFmt)!=0 ?. 
69b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69c0: 20 31 20 3a 20 53 51 4c 49 54 45 5f 44 45 46 41   1 : SQLITE_DEFA
69d0: 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b  ULT_FILE_FORMAT;
69e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
69f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
6a00: 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74 2c  ger, fileFormat,
6a10: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
6a20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6a30: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
6a40: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
6a50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
6a60: 6e 74 65 67 65 72 2c 20 45 4e 43 28 64 62 29 2c  nteger, ENC(db),
6a70: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
6a80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6a90: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
6aa0: 34 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  4);.    sqlite3V
6ab0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
6ac0: 76 2c 20 6c 62 6c 29 3b 0a 0a 20 20 20 20 2f 2a  v, lbl);..    /*
6ad0: 20 54 68 69 73 20 6a 75 73 74 20 63 72 65 61 74   This just creat
6ae0: 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65  es a place-holde
6af0: 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  r record in the 
6b00: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
6b10: 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ble..    ** The 
6b20: 72 65 63 6f 72 64 20 63 72 65 61 74 65 64 20 64  record created d
6b30: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
6b40: 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20 49  anything yet.  I
6b50: 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63  t will be replac
6b60: 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  ed.    ** by the
6b70: 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20 63   real entry in c
6b80: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 61 74  ode generated at
6b90: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
6ba0: 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
6bb0: 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20  * The rowid for 
6bc0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73  the new entry is
6bd0: 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 74 6f 70   left on the top
6be0: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   of the stack.. 
6bf0: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
6c00: 76 61 6c 75 65 20 69 73 20 6e 65 65 64 65 64 20  value is needed 
6c10: 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  by the code that
6c20: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
6c30: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e   will.    ** gen
6c40: 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69  erate..    */.#i
6c50: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
6c60: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
6c70: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6c80: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
6c90: 45 29 0a 20 20 20 20 69 66 28 20 69 73 56 69 65  E).    if( isVie
6ca0: 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29  w || isVirtual )
6cb0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6cc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
6cd0: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
6ce0: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
6cf0: 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69      {.      sqli
6d00: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6d10: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20  OP_CreateTable, 
6d20: 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  iDb, 0);.    }. 
6d30: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
6d40: 73 74 65 72 54 61 62 6c 65 28 70 50 61 72 73 65  sterTable(pParse
6d50: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
6d60: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6d70: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20  OP_NewRowid, 0, 
6d80: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
6d90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
6da0: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  up, 0, 0);.    s
6db0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6dc0: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30  v, OP_Null, 0, 0
6dd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6de0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
6df0: 73 65 72 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  sert, 0, 0);.   
6e00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6e10: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  p(v, OP_Close, 0
6e20: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6e30: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
6e40: 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20  _Pull, 1, 0);.  
6e50: 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28  }..  /* Normal (
6e60: 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72  non-error) retur
6e70: 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a  n. */.  return;.
6e80: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
6e90: 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d  r occurs, we jum
6ea0: 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f  p here */.begin_
6eb0: 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73  table_error:.  s
6ec0: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
6ed0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
6ee0: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
6ef0: 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61  is used to compa
6f00: 72 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 69  re two strings i
6f10: 6e 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69  n a case-insensi
6f20: 74 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20  tive manner..** 
6f30: 49 74 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66  It is slightly f
6f40: 61 73 74 65 72 20 74 68 61 6e 20 63 61 6c 6c 69  aster than calli
6f50: 6e 67 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  ng sqlite3StrICm
6f60: 70 28 29 20 64 69 72 65 63 74 6c 79 2c 20 62 75  p() directly, bu
6f70: 74 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c 61  t.** produces la
6f80: 72 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rger code..**.**
6f90: 20 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 6d   WARNING: This m
6fa0: 61 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d 70  acro is not comp
6fb0: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 65 20  atible with the 
6fc0: 73 74 72 63 6d 70 28 29 20 66 61 6d 69 6c 79 2e  strcmp() family.
6fd0: 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74   It.** returns t
6fe0: 72 75 65 20 69 66 20 74 68 65 20 74 77 6f 20 73  rue if the two s
6ff0: 74 72 69 6e 67 73 20 61 72 65 20 65 71 75 61 6c  trings are equal
7000: 2c 20 6f 74 68 65 72 77 69 73 65 20 66 61 6c 73  , otherwise fals
7010: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54  e..*/.#define ST
7020: 52 49 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a 73  RICMP(x, y) (\.s
7030: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
7040: 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68  er[*(unsigned ch
7050: 61 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c 0a  ar *)(x)]==   \.
7060: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
7070: 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63  wer[*(unsigned c
7080: 68 61 72 20 2a 29 28 79 29 5d 20 20 20 20 20 5c  har *)(y)]     \
7090: 0a 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43  .&& sqlite3StrIC
70a0: 6d 70 28 28 78 29 2b 31 2c 28 79 29 2b 31 29 3d  mp((x)+1,(y)+1)=
70b0: 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  =0 )../*.** Add 
70c0: 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20  a new column to 
70d0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
70e0: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
70f0: 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ucted..**.** The
7100: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
7110: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  is routine once 
7120: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
7130: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69  declaration.** i
7140: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
7150: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c   statement.  sql
7160: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29  ite3StartTable()
7170: 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20   gets called.** 
7180: 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69  first to get thi
7190: 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e  ngs going.  Then
71a0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
71b0: 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68   called for each
71c0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76  .** column..*/.v
71d0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
71e0: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
71f0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
7200: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
7210: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
7220: 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  z;.  Column *pCo
7230: 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  l;.  if( (p = pP
7240: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
7250: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7260: 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  z = sqlite3NameF
7270: 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b  romToken(pName);
7280: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
7290: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
72a0: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
72b0: 7b 0a 20 20 20 20 69 66 28 20 53 54 52 49 43 4d  {.    if( STRICM
72c0: 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  P(z, p->aCol[i].
72d0: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
72e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
72f0: 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61  pParse, "duplica
7300: 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  te column name: 
7310: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73  %s", z);.      s
7320: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
7330: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
7340: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  }.  }.  if( (p->
7350: 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29  nCol & 0x7)==0 )
7360: 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e  {.    Column *aN
7370: 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73  ew;.    aNew = s
7380: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d  qliteRealloc( p-
7390: 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b  >aCol, (p->nCol+
73a0: 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  8)*sizeof(p->aCo
73b0: 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  l[0]));.    if( 
73c0: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
73d0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a   sqliteFree(z);.
73e0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
73f0: 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20    }.    p->aCol 
7400: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43  = aNew;.  }.  pC
7410: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
7420: 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCol];.  memset
7430: 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCol, 0, sizeof
7440: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
7450: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
7460: 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  ;. .  /* If ther
7470: 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65  e is no type spe
7480: 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20  cified, columns 
7490: 68 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74  have the default
74a0: 20 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27   affinity.  ** '
74b0: 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20  NONE'. If there 
74c0: 69 73 20 61 20 74 79 70 65 20 73 70 65 63 69 66  is a type specif
74d0: 69 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65  ied, then sqlite
74e0: 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29  3AddColumnType()
74f0: 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61   will.  ** be ca
7500: 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74  lled next to set
7510: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
7520: 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a  correctly..  */.
7530: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
7540: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
7550: 4e 45 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b  NE;.  p->nCol++;
7560: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
7570: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
7580: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
7590: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
75a0: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
75b0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
75c0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e  statement.  A "N
75d0: 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
75e0: 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  int has.** been 
75f0: 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  seen on a column
7600: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
7610: 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c  sets the notNull
7620: 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20   flag on.** the 
7630: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
7640: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
7650: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
7660: 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50  ite3AddNotNull(P
7670: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
7680: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
7690: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
76a0: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
76b0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
76c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
76d0: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
76e0: 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f  f( i>=0 ) p->aCo
76f0: 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f  l[i].notNull = o
7700: 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nError;.}../*.**
7710: 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e   Scan the column
7720: 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65   type name zType
7730: 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20   (length nType) 
7740: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a  and return the.*
7750: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66  * associated aff
7760: 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a  inity type..**.*
7770: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
7780: 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70  oes a case-indep
7790: 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66  endent search of
77a0: 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a   zType for the .
77b0: 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e  ** substrings in
77c0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
77d0: 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20  able. If one of 
77e0: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
77f0: 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20  s.** found, the 
7800: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66  corresponding af
7810: 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e  finity is return
7820: 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e  ed. If zType con
7830: 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68  tains.** more th
7840: 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  an one of the su
7850: 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65  bstrings, entrie
7860: 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70  s toward the top
7870: 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c   of .** the tabl
7880: 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e  e take priority.
7890: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
78a0: 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49   zType is 'BLOBI
78b0: 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  NT', .** SQLITE_
78c0: 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72  AFF_INTEGER is r
78d0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  eturned..**.** S
78e0: 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41  ubstring     | A
78f0: 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d  ffinity.** -----
7900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27  -----------.** '
7920: 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20 53  INT'         | S
7930: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
7940: 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20  R.** 'CHAR'     
7950: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7960: 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20  TEXT.** 'CLOB'  
7970: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7980: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54  FF_TEXT.** 'TEXT
7990: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
79a0: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42  E_AFF_TEXT.** 'B
79b0: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
79c0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a  LITE_AFF_NONE.**
79d0: 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20 7c   'REAL'        |
79e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
79f0: 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20 20  .** 'FLOA'      
7a00: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
7a10: 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20  EAL.** 'DOUB'   
7a20: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7a30: 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20  F_REAL.**.** If 
7a40: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73  none of the subs
7a50: 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61 62  trings in the ab
7a60: 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66 6f  ove table are fo
7a70: 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  und,.** SQLITE_A
7a80: 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72 65  FF_NUMERIC is re
7a90: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20  turned..*/.char 
7aa0: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
7ab0: 79 70 65 28 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  ype(const Token 
7ac0: 2a 70 54 79 70 65 29 7b 0a 20 20 75 33 32 20 68  *pType){.  u32 h
7ad0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66   = 0;.  char aff
7ae0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55   = SQLITE_AFF_NU
7af0: 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 75  MERIC;.  const u
7b00: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
7b10: 6e 20 3d 20 70 54 79 70 65 2d 3e 7a 3b 0a 20 20  n = pType->z;.  
7b20: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
7b30: 68 61 72 20 2a 7a 45 6e 64 20 3d 20 26 70 54 79  har *zEnd = &pTy
7b40: 70 65 2d 3e 7a 5b 70 54 79 70 65 2d 3e 6e 5d 3b  pe->z[pType->n];
7b50: 0a 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 21 3d  ..  while( zIn!=
7b60: 7a 45 6e 64 20 29 7b 0a 20 20 20 20 68 20 3d 20  zEnd ){.    h = 
7b70: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
7b80: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 49  UpperToLower[*zI
7b90: 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20  n];.    zIn++;. 
7ba0: 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c     if( h==(('c'<
7bb0: 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28  <24)+('h'<<16)+(
7bc0: 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20  'a'<<8)+'r') ){ 
7bd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7be0: 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  HAR */.      aff
7bf0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
7c00: 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65 20 69  XT; .    }else i
7c10: 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29  f( h==(('c'<<24)
7c20: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
7c30: 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20  <8)+'b') ){     
7c40: 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20    /* CLOB */.   
7c50: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
7c60: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
7c70: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27  lse if( h==(('t'
7c80: 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b  <<24)+('e'<<16)+
7c90: 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('x'<<8)+'t') ){
7ca0: 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a         /* TEXT *
7cb0: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
7cc0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
7cd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
7ce0: 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('b'<<24)+('l'<
7cf0: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62  <16)+('o'<<8)+'b
7d00: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ')          /* B
7d10: 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  LOB */.        &
7d20: 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  & (aff==SQLITE_A
7d30: 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66  FF_NUMERIC || af
7d40: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f==SQLITE_AFF_RE
7d50: 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66  AL) ){.      aff
7d60: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
7d70: 4e 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  NE;.#ifndef SQLI
7d80: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
7d90: 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65  _POINT.    }else
7da0: 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32   if( h==(('r'<<2
7db0: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61  4)+('e'<<16)+('a
7dc0: 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20  '<<8)+'l')      
7dd0: 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20      /* REAL */. 
7de0: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
7df0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
7e00: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
7e10: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
7e20: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7e30: 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27  h==(('f'<<24)+('
7e40: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
7e50: 2b 27 61 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'a')          /
7e60: 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20  * FLOA */.      
7e70: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
7e80: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
7e90: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
7ea0: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
7eb0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
7ec0: 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31  'd'<<24)+('o'<<1
7ed0: 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29  6)+('u'<<8)+'b')
7ee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55            /* DOU
7ef0: 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  B */.        && 
7f00: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
7f10: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
7f20: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
7f30: 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20  F_REAL;.#endif. 
7f40: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26     }else if( (h&
7f50: 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27  0x00FFFFFF)==(('
7f60: 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29  i'<<16)+('n'<<8)
7f70: 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49  +'t') ){    /* I
7f80: 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  NT */.      aff 
7f90: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
7fa0: 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61  EGER;.      brea
7fb0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
7fc0: 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f  return aff;.}../
7fd0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7fe0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
7ff0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
8000: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
8010: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
8020: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
8030: 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73  ment.  The pFirs
8040: 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66  t token is the f
8050: 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e  irst.** token in
8060: 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66   the sequence of
8070: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73   tokens that des
8080: 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f  cribe the type o
8090: 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  f the.** column 
80a0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
80b0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20  construction.   
80c0: 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73  pLast is the las
80d0: 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68  t token.** in th
80e0: 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65  e sequence.  Use
80f0: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
8100: 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61  n to construct a
8110: 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20   string.** that 
8120: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70  contains the typ
8130: 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c  ename of the col
8140: 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  umn and store th
8150: 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20  at string.** in 
8160: 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20  zType..*/ .void 
8170: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
8180: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
8190: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65  se, Token *pType
81a0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
81b0: 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e   int i;.  Column
81c0: 20 2a 70 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 28   *pCol;..  if( (
81d0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
81e0: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
81f0: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
8200: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29  l-1;.  if( i<0 )
8210: 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20   return;.  pCol 
8220: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20  = &p->aCol[i];. 
8230: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c   sqliteFree(pCol
8240: 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c  ->zType);.  pCol
8250: 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65  ->zType = sqlite
8260: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
8270: 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61  Type);.  pCol->a
8280: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
8290: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 54  3AffinityType(pT
82a0: 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ype);.}../*.** T
82b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
82c0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
82d0: 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  ue for the most 
82e0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63  recently added c
82f0: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  olumn.** of the 
8300: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
8310: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
8320: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c  on..**.** Defaul
8330: 74 20 76 61 6c 75 65 20 65 78 70 72 65 73 73 69  t value expressi
8340: 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73  ons must be cons
8350: 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20  tant.  Raise an 
8360: 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69  exception if thi
8370: 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20  s.** is not the 
8380: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  case..**.** This
8390: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
83a0: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
83b0: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
83c0: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
83d0: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
83e0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  E statement..*/.
83f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 44  void sqlite3AddD
8400: 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73  efaultValue(Pars
8410: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
8420: 2a 70 45 78 70 72 29 7b 0a 20 20 54 61 62 6c 65  *pExpr){.  Table
8430: 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *p;.  Column *p
8440: 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  Col;.  if( (p = 
8450: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
8460: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f  e)!=0 ){.    pCo
8470: 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d  l = &(p->aCol[p-
8480: 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69  >nCol-1]);.    i
8490: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
84a0: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
84b0: 69 6f 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ion(pExpr) ){.  
84c0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
84d0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66  Msg(pParse, "def
84e0: 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f  ault value of co
84f0: 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74  lumn [%s] is not
8500: 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20   constant",.    
8510: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d        pCol->zNam
8520: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
8530: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8540: 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66  Delete(pCol->pDf
8550: 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  lt);.      pCol-
8560: 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33  >pDflt = sqlite3
8570: 45 78 70 72 44 75 70 28 70 45 78 70 72 29 3b 0a  ExprDup(pExpr);.
8580: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
8590: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45  te3ExprDelete(pE
85a0: 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  xpr);.}../*.** D
85b0: 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49  esignate the PRI
85c0: 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65  MARY KEY for the
85d0: 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69   table.  pList i
85e0: 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65  s a list of name
85f0: 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73  s .** of columns
8600: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70   that form the p
8610: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
8620: 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74  pList is NULL, t
8630: 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20  hen the.** most 
8640: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63  recently added c
8650: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
8660: 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72  le is the primar
8670: 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  y key..**.** A t
8680: 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74  able can have at
8690: 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72   most one primar
86a0: 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74  y key.  If the t
86b0: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
86c0: 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65  .** a primary ke
86d0: 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74  y (and this is t
86e0: 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72  he second primar
86f0: 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61  y key) then crea
8700: 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a  te an.** error..
8710: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49  **.** If the PRI
8720: 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61  MARY KEY is on a
8730: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77   single column w
8740: 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73  hose datatype is
8750: 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65   INTEGER,.** the
8760: 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f  n we will try to
8770: 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e   use that column
8780: 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20   as the rowid.  
8790: 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50  Set the Table.iP
87a0: 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  Key.** field of 
87b0: 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
87c0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20  construction to 
87d0: 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  be the index of 
87e0: 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50  the.** INTEGER P
87f0: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
8800: 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20  n.  Table.iPKey 
8810: 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20  is set to -1 if 
8820: 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49  there is.** no I
8830: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
8840: 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  EY..**.** If the
8850: 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49   key is not an I
8860: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
8870: 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  EY, then create 
8880: 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65  a unique.** inde
8890: 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20  x for the key.  
88a0: 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61  No index is crea
88b0: 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20  ted for INTEGER 
88c0: 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f  PRIMARY KEYs..*/
88d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
88e0: 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61  PrimaryKey(.  Pa
88f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
8900: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
8910: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
8920: 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73   *pList,  /* Lis
8930: 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73  t of field names
8940: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
8950: 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
8960: 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
8970: 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75   do with a uniqu
8980: 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a  eness conflict *
8990: 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c  /.  int autoInc,
89a0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
89b0: 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45   the AUTOINCREME
89c0: 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  NT keyword is pr
89d0: 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73  esent */.  int s
89e0: 6f 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20  ortOrder     /* 
89f0: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72  SQLITE_SO_ASC or
8a00: 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20   SQLITE_SO_DESC 
8a10: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
8a20: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
8a30: 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20  ewTable;.  char 
8a40: 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e  *zType = 0;.  in
8a50: 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a  t iCol = -1, i;.
8a60: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c    if( pTab==0 ||
8a70: 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42   IN_DECLARE_VTAB
8a80: 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f   ) goto primary_
8a90: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20  key_exit;.  if( 
8aa0: 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79  pTab->hasPrimKey
8ab0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
8ac0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8ad0: 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22  .      "table \"
8ae0: 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68  %s\" has more th
8af0: 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b  an one primary k
8b00: 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ey", pTab->zName
8b10: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d  );.    goto prim
8b20: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20  ary_key_exit;.  
8b30: 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73 50 72 69  }.  pTab->hasPri
8b40: 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66 28 20  mKey = 1;.  if( 
8b50: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
8b60: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  iCol = pTab->nCo
8b70: 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d  l - 1;.    pTab-
8b80: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72  >aCol[iCol].isPr
8b90: 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c  imKey = 1;.  }el
8ba0: 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  se{.    for(i=0;
8bb0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
8bc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   i++){.      for
8bd0: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
8be0: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
8bf0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
8c00: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c  qlite3StrICmp(pL
8c10: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
8c20: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
8c30: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
8c40: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
8c50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8c60: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  }.      if( iCol
8c70: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  <pTab->nCol ){. 
8c80: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f         pTab->aCo
8c90: 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65  l[iCol].isPrimKe
8ca0: 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 1;.      }. 
8cb0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69     }.    if( pLi
8cc0: 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 20 69 43  st->nExpr>1 ) iC
8cd0: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69  ol = -1;.  }.  i
8ce0: 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  f( iCol>=0 && iC
8cf0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  ol<pTab->nCol ){
8d00: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61  .    zType = pTa
8d10: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
8d20: 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ype;.  }.  if( z
8d30: 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 33 53  Type && sqlite3S
8d40: 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49  trICmp(zType, "I
8d50: 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20  NTEGER")==0.    
8d60: 20 20 20 20 26 26 20 73 6f 72 74 4f 72 64 65 72      && sortOrder
8d70: 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20  ==SQLITE_SO_ASC 
8d80: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  ){.    pTab->iPK
8d90: 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70  ey = iCol;.    p
8da0: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f  Tab->keyConf = o
8db0: 6e 45 72 72 6f 72 3b 0a 20 20 20 20 70 54 61 62  nError;.    pTab
8dc0: 2d 3e 61 75 74 6f 49 6e 63 20 3d 20 61 75 74 6f  ->autoInc = auto
8dd0: 49 6e 63 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Inc;.  }else if(
8de0: 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e   autoInc ){.#ifn
8df0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8e00: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
8e10: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8e20: 67 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49  g(pParse, "AUTOI
8e30: 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79  NCREMENT is only
8e40: 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22   allowed on an "
8e50: 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52  .       "INTEGER
8e60: 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a   PRIMARY KEY");.
8e70: 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
8e80: 20 20 20 20 73 71 6c 69 74 65 33 43 72 65 61 74      sqlite3Creat
8e90: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30  eIndex(pParse, 0
8ea0: 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f  , 0, 0, pList, o
8eb0: 6e 45 72 72 6f 72 2c 20 30 2c 20 30 2c 20 73 6f  nError, 0, 0, so
8ec0: 72 74 4f 72 64 65 72 2c 20 30 29 3b 0a 20 20 20  rtOrder, 0);.   
8ed0: 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a   pList = 0;.  }.
8ee0: 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69  .primary_key_exi
8ef0: 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  t:.  sqlite3Expr
8f00: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
8f10: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
8f20: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
8f30: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
8f40: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
8f50: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
8f60: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
8f70: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68  oid sqlite3AddCh
8f80: 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  eckConstraint(. 
8f90: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8fa0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
8fb0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
8fc0: 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20  *pCheckExpr  /* 
8fd0: 54 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73  The check expres
8fe0: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  sion */.){.#ifnd
8ff0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
9000: 48 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54  HECK.  Table *pT
9010: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
9020: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 54  wTable;.  if( pT
9030: 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52  ab && !IN_DECLAR
9040: 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 2f 2a  E_VTAB ){.    /*
9050: 20 54 68 65 20 43 48 45 43 4b 20 65 78 70 72 65   The CHECK expre
9060: 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 64 75  ssion must be du
9070: 70 6c 69 63 61 74 65 64 20 73 6f 20 74 68 61 74  plicated so that
9080: 20 74 6f 6b 65 6e 73 20 72 65 66 65 72 0a 20 20   tokens refer.  
9090: 20 20 2a 2a 20 74 6f 20 6d 61 6c 6c 6f 63 65 64    ** to malloced
90a0: 20 73 70 61 63 65 20 61 6e 64 20 6e 6f 74 20 74   space and not t
90b0: 68 65 20 28 65 70 68 65 6d 65 72 61 6c 29 20 74  he (ephemeral) t
90c0: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
90d0: 45 20 54 41 42 4c 45 0a 20 20 20 20 2a 2a 20 73  E TABLE.    ** s
90e0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
90f0: 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73  pTab->pCheck = s
9100: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 54  qlite3ExprAnd(pT
9110: 61 62 2d 3e 70 43 68 65 63 6b 2c 20 73 71 6c 69  ab->pCheck, sqli
9120: 74 65 33 45 78 70 72 44 75 70 28 70 43 68 65 63  te3ExprDup(pChec
9130: 6b 45 78 70 72 29 29 3b 0a 20 20 7d 0a 23 65 6e  kExpr));.  }.#en
9140: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78 70  dif.  sqlite3Exp
9150: 72 44 65 6c 65 74 65 28 70 43 68 65 63 6b 45 78  rDelete(pCheckEx
9160: 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  pr);.}../*.** Se
9170: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  t the collation 
9180: 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  function of the 
9190: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
91a0: 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d  rsed table colum
91b0: 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c  n.** to the Coll
91c0: 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  Seq given..*/.vo
91d0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
91e0: 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a  lateType(Parse *
91f0: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
9200: 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e  ar *zType, int n
9210: 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Type){.  Table *
9220: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  p;.  int i;..  i
9230: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
9240: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c  pNewTable)==0 ||
9250: 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42   IN_DECLARE_VTAB
9260: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
9270: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20 69   p->nCol-1;..  i
9280: 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  f( sqlite3Locate
9290: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
92a0: 7a 54 79 70 65 2c 20 6e 54 79 70 65 29 20 29 7b  zType, nType) ){
92b0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
92c0: 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d  ;.    p->aCol[i]
92d0: 2e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 53  .zColl = sqliteS
92e0: 74 72 4e 44 75 70 28 7a 54 79 70 65 2c 20 6e 54  trNDup(zType, nT
92f0: 79 70 65 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ype);.  .    /* 
9300: 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  If the column is
9310: 20 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e   declared as "<n
9320: 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59  ame> PRIMARY KEY
9330: 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22   COLLATE <type>"
9340: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e  ,.    ** then an
9350: 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20   index may have 
9360: 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20  been created on 
9370: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f  this column befo
9380: 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  re the.    ** co
9390: 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73  llation type was
93a0: 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20   added. Correct 
93b0: 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74 68  this if it is th
93c0: 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  e case..    */. 
93d0: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70     for(pIdx=p->p
93e0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
93f0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
9400: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
9410: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  dx->nColumn==1 )
9420: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
9430: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69  ->aiColumn[0]==i
9440: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78   ){.        pIdx
9450: 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d  ->azColl[0] = p-
9460: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a  >aCol[i].zColl;.
9470: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9480: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
9490: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
94a0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
94b0: 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61  equence for data
94c0: 62 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74  base native text
94d0: 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65  .** encoding ide
94e0: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73  ntified by the s
94f0: 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e  tring zName, len
9500: 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  gth nName..**.**
9510: 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
9520: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
9530: 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69  ence is not avai
9540: 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76  lable, or not av
9550: 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68  ailable.** in th
9560: 65 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  e database nativ
9570: 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20  e encoding, the 
9580: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
9590: 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a  y is invoked to.
95a0: 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49  ** request it. I
95b0: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  f the collation 
95c0: 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74  factory does not
95d0: 20 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73   supply such a s
95e0: 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20  equence,.** and 
95f0: 74 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20  the sequence is 
9600: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f  available in ano
9610: 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69  ther text encodi
9620: 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73  ng, then that is
9630: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73  .** returned ins
9640: 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  tead..**.** If n
9650: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
9660: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
9670: 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20  ations sequence 
9680: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  are available, o
9690: 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72  r.** another err
96a0: 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
96b0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
96c0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
96d0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
96e0: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 43 6f 6c 6c   pParse..*/.Coll
96f0: 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  Seq *sqlite3Loca
9700: 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  teCollSeq(Parse 
9710: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
9720: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
9730: 6e 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65  nName){.  sqlite
9740: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9750: 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45  db;.  u8 enc = E
9760: 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69  NC(db);.  u8 ini
9770: 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74  tbusy = db->init
9780: 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71  .busy;.  CollSeq
9790: 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c   *pColl;..  pCol
97a0: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
97b0: 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20  ollSeq(db, enc, 
97c0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 69 6e  zName, nName, in
97d0: 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21  itbusy);.  if( !
97e0: 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70 43  initbusy && (!pC
97f0: 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78  oll || !pColl->x
9800: 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c  Cmp) ){.    pCol
9810: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f  l = sqlite3GetCo
9820: 6c 6c 53 65 71 28 64 62 2c 20 70 43 6f 6c 6c 2c  llSeq(db, pColl,
9830: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
9840: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
9850: 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d  {.      if( nNam
9860: 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  e<0 ){.        n
9870: 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e  Name = strlen(zN
9880: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
9890: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
98a0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
98b0: 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  such collation s
98c0: 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22 2c 20  equence: %.*s", 
98d0: 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  nName, zName);. 
98e0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a       pColl = 0;.
98f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
9900: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f  urn pColl;.}.../
9910: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
9920: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63  de that will inc
9930: 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d  rement the schem
9940: 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20  a cookie..**.** 
9950: 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  The schema cooki
9960: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
9970: 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20  ermine when the 
9980: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a  schema for the.*
9990: 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  * database chang
99a0: 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  es.  After each 
99b0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74  schema change, t
99c0: 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a  he cookie value.
99d0: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65  ** changes.  Whe
99e0: 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72 73  n a process firs
99f0: 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68 65  t reads the sche
9a00: 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74 68  ma it records th
9a10: 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68  e.** cookie.  Th
9a20: 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76  ereafter, whenev
9a30: 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63  er it goes to ac
9a40: 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
9a50: 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20  e,.** it checks 
9a60: 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61  the cookie to ma
9a70: 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68 65  ke sure the sche
9a80: 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  ma has not chang
9a90: 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77  ed.** since it w
9aa0: 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a  as last read..**
9ab0: 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73  .** This plan is
9ac0: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
9ad0: 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49  bullet-proof.  I
9ae0: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
9af0: 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20  r.** the schema 
9b00: 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70  to change multip
9b10: 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72  le times and for
9b20: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62   the cookie to b
9b30: 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f  e.** set back to
9b40: 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42   prior value.  B
9b50: 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ut schema change
9b60: 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74  s are infrequent
9b70: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62  .** and the prob
9b80: 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69  ability of hitti
9b90: 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b  ng the same cook
9ba0: 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79  ie value is only
9bb0: 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20  .** 1 chance in 
9bc0: 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20  2^32.  So we're 
9bd0: 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a  safe enough..*/.
9be0: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e  void sqlite3Chan
9bf0: 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 33  geCookie(sqlite3
9c00: 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 2c 20 69   *db, Vdbe *v, i
9c10: 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74  nt iDb){.  sqlit
9c20: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9c30: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61  P_Integer, db->a
9c40: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
9c50: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31  >schema_cookie+1
9c60: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
9c70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
9c80: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30  etCookie, iDb, 0
9c90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73  );.}../*.** Meas
9ca0: 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ure the number o
9cb0: 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65  f characters nee
9cc0: 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68  ded to output th
9cd0: 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74  e given.** ident
9ce0: 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62  ifier.  The numb
9cf0: 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  er returned incl
9d00: 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20  udes any quotes 
9d10: 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73  used.** but does
9d20: 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65   not include the
9d30: 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72   null terminator
9d40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69  ..**.** The esti
9d50: 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61  mate is conserva
9d60: 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20  tive.  It might 
9d70: 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77  be larger that w
9d80: 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79  hat is.** really
9d90: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
9da0: 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67  ic int identLeng
9db0: 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  th(const char *z
9dc0: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f  ){.  int n;.  fo
9dd0: 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20  r(n=0; *z; n++, 
9de0: 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a  z++){.    if( *z
9df0: 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a  =='"' ){ n++; }.
9e00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b    }.  return n +
9e10: 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69   2;.}../*.** Wri
9e20: 74 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72  te an identifier
9e30: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
9e40: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
9e50: 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65  g.  Add.** quote
9e60: 20 63 68 61 72 61 63 74 65 72 73 20 61 73 20 6e   characters as n
9e70: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
9e80: 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63   void identPut(c
9e90: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64  har *z, int *pId
9ea0: 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64  x, char *zSigned
9eb0: 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e  Ident){.  unsign
9ec0: 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20  ed char *zIdent 
9ed0: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
9ee0: 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a  *)zSignedIdent;.
9ef0: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64    int i, j, need
9f00: 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49  Quote;.  i = *pI
9f10: 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  dx;.  for(j=0; z
9f20: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
9f30: 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d      if( !isalnum
9f40: 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a  (zIdent[j]) && z
9f50: 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20  Ident[j]!='_' ) 
9f60: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65  break;.  }.  nee
9f70: 64 51 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74  dQuote =  zIdent
9f80: 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69  [j]!=0 || isdigi
9f90: 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20  t(zIdent[0]).   
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
9fb0: 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64  | sqlite3Keyword
9fc0: 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21  Code(zIdent, j)!
9fd0: 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65  =TK_ID;.  if( ne
9fe0: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
9ff0: 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d   = '"';.  for(j=
a000: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
a010: 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d  +){.    z[i++] =
a020: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20   zIdent[j];.    
a030: 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27  if( zIdent[j]=='
a040: 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  "' ) z[i++] = '"
a050: 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65  ';.  }.  if( nee
a060: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
a070: 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20  = '"';.  z[i] = 
a080: 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a  0;.  *pIdx = i;.
a090: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
a0a0: 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  e a CREATE TABLE
a0b0: 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f   statement appro
a0c0: 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67  priate for the g
a0d0: 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20  iven.** table.  
a0e0: 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74  Memory to hold t
a0f0: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73  he text of the s
a100: 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61  tatement is obta
a110: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c  ined.** from sql
a120: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
a130: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
a140: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
a150: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
a160: 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62   char *createTab
a170: 6c 65 53 74 6d 74 28 54 61 62 6c 65 20 2a 70 2c  leStmt(Table *p,
a180: 20 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20 20   int isTemp){.  
a190: 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63  int i, k, n;.  c
a1a0: 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68  har *zStmt;.  ch
a1b0: 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32  ar *zSep, *zSep2
a1c0: 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43  , *zEnd, *z;.  C
a1d0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e  olumn *pCol;.  n
a1e0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   = 0;.  for(pCol
a1f0: 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b   = p->aCol, i=0;
a200: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c   i<p->nCol; i++,
a210: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20   pCol++){.    n 
a220: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
a230: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
a240: 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65   z = pCol->zType
a250: 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20  ;.    if( z ){. 
a260: 20 20 20 20 20 6e 20 2b 3d 20 28 73 74 72 6c 65       n += (strle
a270: 6e 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d  n(z) + 1);.    }
a280: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e  .  }.  n += iden
a290: 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65  tLength(p->zName
a2a0: 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b  );.  if( n<50 ){
a2b0: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a  .    zSep = "";.
a2c0: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b      zSep2 = ",";
a2d0: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b  .    zEnd = ")";
a2e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53  .  }else{.    zS
a2f0: 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20  ep = "\n  ";.   
a300: 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22   zSep2 = ",\n  "
a310: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e  ;.    zEnd = "\n
a320: 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33  )";.  }.  n += 3
a330: 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20  5 + 6*p->nCol;. 
a340: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d   zStmt = sqliteM
a350: 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a 20  allocRaw( n );. 
a360: 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20   if( zStmt==0 ) 
a370: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74 72 63  return 0;.  strc
a380: 70 79 28 7a 53 74 6d 74 2c 20 21 4f 4d 49 54 5f  py(zStmt, !OMIT_
a390: 54 45 4d 50 44 42 26 26 69 73 54 65 6d 70 20 3f  TEMPDB&&isTemp ?
a3a0: 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41   "CREATE TEMP TA
a3b0: 42 4c 45 20 22 3a 22 43 52 45 41 54 45 20 54 41  BLE ":"CREATE TA
a3c0: 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74  BLE ");.  k = st
a3d0: 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69  rlen(zStmt);.  i
a3e0: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
a3f0: 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  k, p->zName);.  
a400: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27  zStmt[k++] = '('
a410: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e  ;.  for(pCol=p->
a420: 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e  aCol, i=0; i<p->
a430: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
a440: 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26  +){.    strcpy(&
a450: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b  zStmt[k], zSep);
a460: 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e  .    k += strlen
a470: 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20  (&zStmt[k]);.   
a480: 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20   zSep = zSep2;. 
a490: 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d     identPut(zStm
a4a0: 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  t, &k, pCol->zNa
a4b0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 20  me);.    if( (z 
a4c0: 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d  = pCol->zType)!=
a4d0: 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74  0 ){.      zStmt
a4e0: 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [k++] = ' ';.   
a4f0: 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74     strcpy(&zStmt
a500: 5b 6b 5d 2c 20 7a 29 3b 0a 20 20 20 20 20 20 6b  [k], z);.      k
a510: 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20   += strlen(z);. 
a520: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 72 63 70     }.  }.  strcp
a530: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e  y(&zStmt[k], zEn
a540: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74  d);.  return zSt
a550: 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  mt;.}../*.** Thi
a560: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
a570: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
a580: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
a590: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
a5a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
a5b0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
a5c0: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
a5d0: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
a5e0: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
a5f0: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
a600: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
a610: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
a620: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
a630: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
a640: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
a650: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
a660: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
a670: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
a680: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
a690: 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20   unless.** this 
a6a0: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
a6b0: 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74  able or db->init
a6c0: 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20  .busy==1.  When 
a6d0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
a6e0: 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20  .** it means we 
a6f0: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
a700: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
a710: 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a  ble because we j
a720: 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  ust.** connected
a730: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
a740: 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
a750: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
a760: 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e  ble has.** recen
a770: 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20  tly changed, so 
a780: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
a790: 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  is table already
a7a0: 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68   exists in.** th
a7b0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
a7c0: 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f  table.  We do no
a7d0: 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65  t want to create
a7e0: 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a   it again..**.**
a7f0: 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20   If the pSelect 
a800: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
a810: 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74  NULL, it means t
a820: 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
a830: 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74  .** was called t
a840: 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65  o create a table
a850: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
a860: 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41  a .** "CREATE TA
a870: 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  BLE ... AS SELEC
a880: 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74  T ..." statement
a890: 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  .  The column na
a8a0: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  mes of.** the ne
a8b0: 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74  w table will mat
a8c0: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ch the result se
a8d0: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  t of the SELECT.
a8e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a8f0: 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73  EndTable(.  Pars
a900: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
a910: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
a920: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
a930: 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20  *pCons,         
a940: 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b    /* The ',' tok
a950: 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  en after the las
a960: 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a  t column defn. *
a970: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  /.  Token *pEnd,
a980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a990: 68 65 20 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b  he final ')' tok
a9a0: 65 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  en in the CREATE
a9b0: 20 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65   TABLE */.  Sele
a9c0: 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
a9d0: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72      /* Select fr
a9e0: 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e  om a "CREATE ...
a9f0: 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29   AS SELECT" */.)
aa00: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
aa10: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
aa20: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
aa30: 69 44 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e  iDb;..  if( (pEn
aa40: 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d  d==0 && pSelect=
aa50: 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  =0) || pParse->n
aa60: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61  Err || sqlite3Ma
aa70: 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20 7b  llocFailed() ) {
aa80: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
aa90: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
aaa0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
aab0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  p==0 ) return;..
aac0: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
aad0: 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65  nit.busy || !pSe
aae0: 6c 65 63 74 20 29 3b 0a 0a 20 20 69 44 62 20 3d  lect );..  iDb =
aaf0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
ab00: 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63  Index(db, p->pSc
ab10: 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20  hema);..#ifndef 
ab20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
ab30: 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e  K.  /* Resolve n
ab40: 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43  ames in all CHEC
ab50: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70  K constraint exp
ab60: 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
ab70: 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29   if( p->pCheck )
ab80: 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 73 53  {.    SrcList sS
ab90: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
aba0: 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 53 72        /* Fake Sr
abb0: 63 4c 69 73 74 20 66 6f 72 20 70 50 61 72 73 65  cList for pParse
abc0: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 20  ->pNewTable */. 
abd0: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
abe0: 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  NC;             
abf0: 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
ac00: 78 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70  xt for pParse->p
ac10: 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  NewTable */..   
ac20: 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
ac30: 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
ac40: 20 20 20 6d 65 6d 73 65 74 28 26 73 53 72 63 2c     memset(&sSrc,
ac50: 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 72 63 29   0, sizeof(sSrc)
ac60: 29 3b 0a 20 20 20 20 73 53 72 63 2e 6e 53 72 63  );.    sSrc.nSrc
ac70: 20 3d 20 31 3b 0a 20 20 20 20 73 53 72 63 2e 61   = 1;.    sSrc.a
ac80: 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a  [0].zName = p->z
ac90: 4e 61 6d 65 3b 0a 20 20 20 20 73 53 72 63 2e 61  Name;.    sSrc.a
aca0: 5b 30 5d 2e 70 54 61 62 20 3d 20 70 3b 0a 20 20  [0].pTab = p;.  
acb0: 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69 43 75 72    sSrc.a[0].iCur
acc0: 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 4e  sor = -1;.    sN
acd0: 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
ace0: 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
acf0: 69 73 74 20 3d 20 26 73 53 72 63 3b 0a 20 20 20  ist = &sSrc;.   
ad00: 20 73 4e 43 2e 69 73 43 68 65 63 6b 20 3d 20 31   sNC.isCheck = 1
ad10: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
ad20: 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
ad30: 73 28 26 73 4e 43 2c 20 70 2d 3e 70 43 68 65 63  s(&sNC, p->pChec
ad40: 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  k) ){.      retu
ad50: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  rn;.    }.  }.#e
ad60: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
ad70: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45  (SQLITE_OMIT_CHE
ad80: 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  CK) */..  /* If 
ad90: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  the db->init.bus
ada0: 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20  y is 1 it means 
adb0: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
adc0: 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20  he SQL off the. 
add0: 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74   ** "sqlite_mast
ade0: 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74  er" or "sqlite_t
adf0: 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  emp_master" tabl
ae00: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20  e on the disk.. 
ae10: 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72   ** So do not wr
ae20: 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ite to the disk 
ae30: 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20  again.  Extract 
ae40: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
ae50: 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  mber.  ** for th
ae60: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
ae70: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
ae80: 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70  m field.  (The p
ae90: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
aea0: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
aeb0: 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68   put there by th
aec0: 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72  e sqliteOpenCb r
aed0: 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20  outine.).  */.  
aee0: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
aef0: 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d  y ){.    p->tnum
af00: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
af10: 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  num;.  }..  /* I
af20: 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69  f not initializi
af30: 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ng, then create 
af40: 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65  a record for the
af50: 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20   new table.  ** 
af60: 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
af70: 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68  STER table of th
af80: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
af90: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20   record number. 
afa0: 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20   ** for the new 
afb0: 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75  table entry shou
afc0: 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e  ld already be on
afd0: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a   the stack..  **
afe0: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73  .  ** If this is
aff0: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62   a TEMPORARY tab
b000: 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e  le, write the en
b010: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78  try into the aux
b020: 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65  iliary.  ** file
b030: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f   instead of into
b040: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
b050: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
b060: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
b070: 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  sy ){.    int n;
b080: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
b090: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20    char *zType;  
b0a0: 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22    /* "view" or "
b0b0: 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68  table" */.    ch
b0c0: 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a  ar *zType2;   /*
b0d0: 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c   "VIEW" or "TABL
b0e0: 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  E" */.    char *
b0f0: 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78  zStmt;    /* Tex
b100: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
b110: 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20  TABLE or CREATE 
b120: 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a  VIEW statement *
b130: 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  /..    v = sqlit
b140: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
b150: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
b160: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73  ) return;..    s
b170: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b180: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20  v, OP_Close, 0, 
b190: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  0);..    /* Crea
b1a0: 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20  te the rootpage 
b1b0: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
b1c0: 65 20 61 6e 64 20 70 75 73 68 20 69 74 20 6f 6e  e and push it on
b1d0: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  to the stack..  
b1e0: 20 20 2a 2a 20 41 20 76 69 65 77 20 68 61 73 20    ** A view has 
b1f0: 6e 6f 20 72 6f 6f 74 70 61 67 65 2c 20 73 6f 20  no rootpage, so 
b200: 6a 75 73 74 20 70 75 73 68 20 61 20 7a 65 72 6f  just push a zero
b210: 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20   onto the stack 
b220: 66 6f 72 0a 20 20 20 20 2a 2a 20 76 69 65 77 73  for.    ** views
b230: 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54  .  Initialize zT
b240: 79 70 65 20 61 74 20 74 68 65 20 73 61 6d 65 20  ype at the same 
b250: 74 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  time..    */.   
b260: 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d   if( p->pSelect=
b270: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
b280: 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a   regular table *
b290: 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  /.      zType = 
b2a0: 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a  "table";.      z
b2b0: 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b  Type2 = "TABLE";
b2c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b2d0: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65  OMIT_VIEW.    }e
b2e0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
b2f0: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54  view */.      zT
b300: 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20  ype = "view";.  
b310: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49      zType2 = "VI
b320: 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EW";.#endif.    
b330: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
b340: 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41  s is a CREATE TA
b350: 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54  BLE xx AS SELECT
b360: 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68   ..., execute th
b370: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  e SELECT.    ** 
b380: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70  statement to pop
b390: 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61  ulate the new ta
b3a0: 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61  ble. The root-pa
b3b0: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
b3c0: 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62  e.    ** new tab
b3d0: 6c 65 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70  le is on the top
b3e0: 20 6f 66 20 74 68 65 20 76 64 62 65 20 73 74 61   of the vdbe sta
b3f0: 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ck..    **.    *
b400: 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43  * Once the SELEC
b410: 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64  T has been coded
b420: 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63   by sqlite3Selec
b430: 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a  t(), it is in a.
b440: 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20      ** suitable 
b450: 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66  state to query f
b460: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
b470: 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f  mes and types to
b480: 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20   be used.    ** 
b490: 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  by the new table
b4a0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
b4b0: 41 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 77  A shared-cache w
b4c0: 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74  rite-lock is not
b4d0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69   required to wri
b4e0: 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61  te to the new ta
b4f0: 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61  ble,.    ** as a
b500: 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73   schema-lock mus
b510: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
b520: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20  een obtained to 
b530: 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65  create it. Since
b540: 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61  .    ** a schema
b550: 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61  -lock excludes a
b560: 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ll other databas
b570: 65 20 75 73 65 72 73 2c 20 74 68 65 20 77 72 69  e users, the wri
b580: 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20  te-lock would.  
b590: 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e    ** be redundan
b5a0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
b5b0: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
b5c0: 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61     Table *pSelTa
b5d0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
b5e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b5f0: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
b600: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b610: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
b620: 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20  , iDb, 0);.     
b630: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b640: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
b650: 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
b660: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32  pParse->nTab = 2
b670: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
b680: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
b690: 65 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65  elect, SRT_Table
b6a0: 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  , 1, 0, 0, 0, 0)
b6b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b6c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
b6d0: 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  lose, 1, 0);.   
b6e0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
b6f0: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Err==0 ){.      
b700: 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
b710: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
b720: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20  lect(pParse, 0, 
b730: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
b740: 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30    if( pSelTab==0
b750: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
b760: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43     assert( p->aC
b770: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ol==0 );.       
b780: 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54   p->nCol = pSelT
b790: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
b7a0: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c    p->aCol = pSel
b7b0: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
b7c0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
b7d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53   = 0;.        pS
b7e0: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
b7f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b800: 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
b810: 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 7d  SelTab);.      }
b820: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
b830: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c  ompute the compl
b840: 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
b850: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
b860: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c   */.    if( pSel
b870: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74  ect ){.      zSt
b880: 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65  mt = createTable
b890: 53 74 6d 74 28 70 2c 20 70 2d 3e 70 53 63 68 65  Stmt(p, p->pSche
b8a0: 6d 61 3d 3d 70 50 61 72 73 65 2d 3e 64 62 2d 3e  ma==pParse->db->
b8b0: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b  aDb[1].pSchema);
b8c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b8d0: 20 20 6e 20 3d 20 70 45 6e 64 2d 3e 7a 20 2d 20    n = pEnd->z - 
b8e0: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
b8f0: 65 6e 2e 7a 20 2b 20 31 3b 0a 20 20 20 20 20 20  en.z + 1;.      
b900: 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
b910: 50 72 69 6e 74 66 28 22 43 52 45 41 54 45 20 25  Printf("CREATE %
b920: 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c  s %.*s", zType2,
b930: 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d   n, pParse->sNam
b940: 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 7d  eToken.z);.    }
b950: 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20  ..    /* A slot 
b960: 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68  for the record h
b970: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
b980: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  allocated in the
b990: 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f   .    ** SQLITE_
b9a0: 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57  MASTER table.  W
b9b0: 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75  e just need to u
b9c0: 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20  pdate that slot 
b9d0: 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  with all.    ** 
b9e0: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
b9f0: 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e  we've collected.
ba00: 20 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20    The rowid for 
ba10: 74 68 65 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  the preallocated
ba20: 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20  .    ** slot is 
ba30: 74 68 65 20 32 6e 64 20 69 74 65 6d 20 6f 6e 20  the 2nd item on 
ba40: 74 68 65 20 73 74 61 63 6b 2e 20 20 54 68 65 20  the stack.  The 
ba50: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
ba60: 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   is the.    ** r
ba70: 6f 6f 74 20 70 61 67 65 20 66 6f 72 20 74 68 65  oot page for the
ba80: 20 6e 65 77 20 74 61 62 6c 65 20 28 6f 72 20 61   new table (or a
ba90: 20 30 20 69 66 20 74 68 69 73 20 69 73 20 61 20   0 if this is a 
baa0: 76 69 65 77 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  view)..    */.  
bab0: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
bac0: 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
bad0: 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
bae0: 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45 54   ".         "SET
baf0: 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65   type='%s', name
bb00: 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  =%Q, tbl_name=%Q
bb10: 2c 20 72 6f 6f 74 70 61 67 65 3d 23 30 2c 20 73  , rootpage=#0, s
bb20: 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22  ql=%Q ".       "
bb30: 57 48 45 52 45 20 72 6f 77 69 64 3d 23 31 22 2c  WHERE rowid=#1",
bb40: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
bb50: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
bb60: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20  A_TABLE(iDb),.  
bb70: 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20      zType,.     
bb80: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
bb90: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
bba0: 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20   zStmt.    );.  
bbb0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 53 74    sqliteFree(zSt
bbc0: 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mt);.    sqlite3
bbd0: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
bbe0: 20 76 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64   v, iDb);..#ifnd
bbf0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
bc00: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
bc10: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
bc20: 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63   if we need to c
bc30: 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f  reate an sqlite_
bc40: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66  sequence table f
bc50: 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e  or.    ** keepin
bc60: 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69  g track of autoi
bc70: 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20  ncrement keys.. 
bc80: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
bc90: 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20  >autoInc ){.    
bca0: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
bcb0: 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20  >aDb[iDb];.     
bcc0: 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
bcd0: 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b  a->pSeqTab==0 ){
bce0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bcf0: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
bd00: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43  se,.          "C
bd10: 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73  REATE TABLE %Q.s
bd20: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e  qlite_sequence(n
bd30: 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20  ame,seq)",.     
bd40: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a       pDb->zName.
bd50: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
bd60: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
bd70: 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20  .    /* Reparse 
bd80: 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70  everything to up
bd90: 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
bda0: 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  l data structure
bdb0: 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
bdc0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61  VdbeOp3(v, OP_Pa
bdd0: 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
bde0: 30 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0,.        sqlit
bdf0: 65 33 4d 50 72 69 6e 74 66 28 22 74 62 6c 5f 6e  e3MPrintf("tbl_n
be00: 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61  ame='%q'",p->zNa
be10: 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29  me), P3_DYNAMIC)
be20: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64  ;.  }...  /* Add
be30: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68   the table to th
be40: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
be50: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
be60: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  e database..  */
be70: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
be80: 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e  busy && pParse->
be90: 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54  nErr==0 ){.    T
bea0: 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
beb0: 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20 0a 20 20  FKey *pFKey; .  
bec0: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
bed0: 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a  a = p->pSchema;.
bee0: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
bef0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53  e3HashInsert(&pS
bf00: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
bf10: 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  p->zName, strlen
bf20: 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 70 29 3b  (p->zName)+1,p);
bf30: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b  .    if( pOld ){
bf40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
bf50: 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61  ==pOld );  /* Ma
bf60: 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
bf70: 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73  ailed inside Has
bf80: 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20  hInsert() */.   
bf90: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
bfa0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
bfb0: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
bfc0: 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70  .    for(pFKey=p
bfd0: 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20  ->pFKey; pFKey; 
bfe0: 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65  pFKey=pFKey->pNe
bff0: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69  xtFrom){.      i
c000: 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28  nt nTo = strlen(
c010: 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b  pFKey->zTo) + 1;
c020: 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e  .      pFKey->pN
c030: 65 78 74 54 6f 20 3d 20 73 71 6c 69 74 65 33 48  extTo = sqlite3H
c040: 61 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61  ashFind(&pSchema
c050: 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e  ->aFKey, pFKey->
c060: 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20  zTo, nTo);.     
c070: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
c080: 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 61 46 4b  rt(&pSchema->aFK
c090: 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20  ey, pFKey->zTo, 
c0a0: 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20  nTo, pFKey);.   
c0b0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50   }.#endif.    pP
c0c0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
c0d0: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61  = 0;.    db->nTa
c0e0: 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66  ble++;.    db->f
c0f0: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
c100: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23  nternChanges;..#
c110: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c120: 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20  IT_ALTERTABLE.  
c130: 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63    if( !p->pSelec
c140: 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t ){.      const
c150: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28   char *zName = (
c160: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61  const char *)pPa
c170: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
c180: 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61  z;.      int nNa
c190: 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  me;.      assert
c1a0: 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70 43  ( !pSelect && pC
c1b0: 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20  ons && pEnd );. 
c1c0: 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e       if( pCons->
c1d0: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  z==0 ){.        
c1e0: 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20  pCons = pEnd;.  
c1f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d      }.      nNam
c200: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
c210: 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61  *)pCons->z - zNa
c220: 6d 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64  me;.      p->add
c230: 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b  ColOffset = 13 +
c240: 20 73 71 6c 69 74 65 33 75 74 66 38 43 68 61 72   sqlite3utf8Char
c250: 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  Len(zName, nName
c260: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
c270: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
c280: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
c290: 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  /*.** The parser
c2a0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
c2b0: 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ine in order to 
c2c0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45  create a new VIE
c2d0: 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  W.*/.void sqlite
c2e0: 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50  3CreateView(.  P
c2f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
c300: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
c310: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
c320: 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20  ken *pBegin,    
c330: 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
c340: 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
c350: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
c360: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
c370: 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f  1,     /* The to
c380: 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ken that holds t
c390: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
c3a0: 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
c3b0: 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54  pName2,     /* T
c3c0: 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
c3d0: 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
c3e0: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65  the view */.  Se
c3f0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
c400: 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61   /* A SELECT sta
c410: 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c  tement that will
c420: 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
c430: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
c440: 54 65 6d 70 20 20 20 20 20 20 20 20 20 2f 2a 20  Temp         /* 
c450: 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f  TRUE for a TEMPO
c460: 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 29 7b 0a  RARY view */.){.
c470: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
c480: 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  t n;.  const uns
c490: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20  igned char *z;. 
c4a0: 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44   Token sEnd;.  D
c4b0: 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54  bFixer sFix;.  T
c4c0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20 69  oken *pName;.  i
c4d0: 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70  nt iDb;..  if( p
c4e0: 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b  Parse->nVar>0 ){
c4f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
c500: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61  rMsg(pParse, "pa
c510: 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74  rameters are not
c520: 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77   allowed in view
c530: 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s");.    sqlite3
c540: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
c550: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
c560: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
c570: 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73  StartTable(pPars
c580: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
c590: 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c  2, isTemp, 1, 0,
c5a0: 20 30 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73   0);.  p = pPars
c5b0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
c5c0: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
c5d0: 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
c5e0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
c5f0: 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ete(pSelect);.  
c600: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
c610: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
c620: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
c630: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
c640: 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  e);.  iDb = sqli
c650: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
c660: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
c670: 70 53 63 68 65 6d 61 29 3b 0a 20 20 69 66 28 20  pSchema);.  if( 
c680: 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
c690: 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
c6a0: 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65  b, "view", pName
c6b0: 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  ).    && sqlite3
c6c0: 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c  FixSelect(&sFix,
c6d0: 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20   pSelect).  ){. 
c6e0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
c6f0: 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b  Delete(pSelect);
c700: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
c710: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f  ..  /* Make a co
c720: 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  py of the entire
c730: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c740: 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
c750: 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68  he view..  ** Th
c760: 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c  is will force al
c770: 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e  l the Expr.token
c780: 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  .z values to be 
c790: 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a  dynamically.  **
c7a0: 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65   allocated rathe
c7b0: 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20  r than point to 
c7c0: 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67  the input string
c7d0: 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74   - which means t
c7e0: 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69  hat.  ** they wi
c7f0: 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65 72  ll persist after
c800: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c   the current sql
c810: 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c  ite3_exec() call
c820: 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20   returns..  */. 
c830: 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71   p->pSelect = sq
c840: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
c850: 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74  Select);.  sqlit
c860: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
c870: 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 73  Select);.  if( s
c880: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
c890: 65 64 28 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ed() ){.    retu
c8a0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  rn;.  }.  if( !p
c8b0: 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e  Parse->db->init.
c8c0: 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  busy ){.    sqli
c8d0: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
c8e0: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
c8f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
c900: 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
c910: 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
c920: 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73  atement.  Make s
c930: 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a  End point to.  *
c940: 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a  * the end..  */.
c950: 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d    sEnd = pParse-
c960: 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69  >sLastToken;.  i
c970: 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20  f( sEnd.z[0]!=0 
c980: 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b  && sEnd.z[0]!=';
c990: 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20  ' ){.    sEnd.z 
c9a0: 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20  += sEnd.n;.  }. 
c9b0: 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e   sEnd.n = 0;.  n
c9c0: 20 3d 20 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67   = sEnd.z - pBeg
c9d0: 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 28 63 6f  in->z;.  z = (co
c9e0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
c9f0: 72 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20  r*)pBegin->z;.  
ca00: 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a  while( n>0 && (z
ca10: 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73  [n-1]==';' || is
ca20: 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29  space(z[n-1])) )
ca30: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e  { n--; }.  sEnd.
ca40: 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73  z = &z[n-1];.  s
ca50: 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a  End.n = 1;..  /*
ca60: 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54   Use sqlite3EndT
ca70: 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68  able() to add th
ca80: 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51  e view to the SQ
ca90: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
caa0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e  e */.  sqlite3En
cab0: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30  dTable(pParse, 0
cac0: 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72  , &sEnd, 0);.  r
cad0: 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  eturn;.}.#endif 
cae0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
caf0: 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  IEW */..#if !def
cb00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
cb10: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
cb20: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
cb30: 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a  IRTUALTABLE)./*.
cb40: 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
cb50: 75 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73  ucture pTable is
cb60: 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20   really a VIEW. 
cb70: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d   Fill in the nam
cb80: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  es of.** the col
cb90: 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77  umns of the view
cba0: 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73   in the pTable s
cbb0: 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72  tructure.  Retur
cbc0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  n the number.** 
cbd0: 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61  of errors.  If a
cbe0: 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20  n error is seen 
cbf0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
cc00: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
cc10: 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  ->zErrMsg..*/.in
cc20: 74 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  t sqlite3ViewGet
cc30: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73  ColumnNames(Pars
cc40: 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
cc50: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62   *pTable){.  Tab
cc60: 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f  le *pSelTab;   /
cc70: 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66  * A fake table f
cc80: 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65 74  rom which we get
cc90: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
cca0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
ccb0: 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f  l;     /* Copy o
ccc0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61  f the SELECT tha
ccd0: 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
cce0: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e   view */.  int n
ccf0: 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Err = 0;     /* 
cd00: 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  Number of errors
cd10: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a   encountered */.
cd20: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
cd30: 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69      /* Temporari
cd40: 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d  ly holds the num
cd50: 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61  ber of cursors a
cd60: 73 73 69 67 6e 65 64 20 2a 2f 0a 0a 20 20 61 73  ssigned */..  as
cd70: 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a  sert( pTable );.
cd80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
cd90: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
cda0: 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56  E.  if( sqlite3V
cdb0: 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70  tabCallConnect(p
cdc0: 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29  Parse, pTable) )
cdd0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
cde0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
cdf0: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
ce00: 54 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20  Table) ) return 
ce10: 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  0;.#endif..#ifnd
ce20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
ce30: 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74  IEW.  /* A posit
ce40: 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74  ive nCol means t
ce50: 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73  he columns names
ce60: 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61   for this view a
ce70: 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  re.  ** already 
ce80: 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  known..  */.  if
ce90: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30  ( pTable->nCol>0
cea0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
ceb0: 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43  /* A negative nC
cec0: 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  ol is a special 
ced0: 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74  marker meaning t
cee0: 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65  hat we are curre
cef0: 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67  ntly.  ** trying
cf00: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
cf10: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
cf20: 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20  f we enter this 
cf30: 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a  routine with.  *
cf40: 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * a negative nCo
cf50: 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20  l, it means two 
cf60: 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f  or more views fo
cf70: 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20  rm a loop, like 
cf80: 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
cf90: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
cfa0: 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20  one AS SELECT * 
cfb0: 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20  FROM two;.  **  
cfc0: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74     CREATE VIEW t
cfd0: 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  wo AS SELECT * F
cfe0: 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20  ROM one;.  **.  
cff0: 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69  ** Actually, thi
d000: 73 20 65 72 72 6f 72 20 69 73 20 63 61 75 67 68  s error is caugh
d010: 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64  t previously and
d020: 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
d030: 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75  g test.  ** shou
d040: 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20  ld always fail. 
d050: 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61   But we will lea
d060: 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a  ve it in place j
d070: 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a  ust to be safe..
d080: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
d090: 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  e->nCol<0 ){.   
d0a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
d0b0: 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25  (pParse, "view %
d0c0: 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20  s is circularly 
d0d0: 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65  defined", pTable
d0e0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
d0f0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73  turn 1;.  }.  as
d100: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43  sert( pTable->nC
d110: 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ol>=0 );..  /* I
d120: 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
d130: 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e  r, it means we n
d140: 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
d150: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a  he table names..
d160: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
d170: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
d180: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
d190: 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e  ect() will expan
d1a0: 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65  d any.  ** "*" e
d1b0: 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72  lements in the r
d1c0: 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68  esults set of th
d1d0: 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20  e view and will 
d1e0: 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20  assign cursors. 
d1f0: 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65   ** to the eleme
d200: 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  nts of the FROM 
d210: 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20  clause.  But we 
d220: 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73  do not want thes
d230: 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74  e changes.  ** t
d240: 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20  o be permanent. 
d250: 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74   So the computat
d260: 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61  ion is done on a
d270: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
d280: 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  ECT.  ** stateme
d290: 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
d2a0: 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20  the view..  */. 
d2b0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
d2c0: 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53  >pSelect );.  pS
d2d0: 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  el = sqlite3Sele
d2e0: 63 74 44 75 70 28 70 54 61 62 6c 65 2d 3e 70 53  ctDup(pTable->pS
d2f0: 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 70 53  elect);.  if( pS
d300: 65 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50  el ){.    n = pP
d310: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20  arse->nTab;.    
d320: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
d330: 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
d340: 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b  se, pSel->pSrc);
d350: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  .    pTable->nCo
d360: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 70 53 65 6c  l = -1;.    pSel
d370: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
d380: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
d390: 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b  Parse, 0, pSel);
d3a0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  .    pParse->nTa
d3b0: 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70  b = n;.    if( p
d3c0: 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20  SelTab ){.      
d3d0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
d3e0: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
d3f0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
d400: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
d410: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
d420: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
d430: 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
d440: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
d450: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
d460: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
d470: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  e3DeleteTable(0,
d480: 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20   pSelTab);.     
d490: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
d4a0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e  ->flags |= DB_Un
d4b0: 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20 20 20  resetViews;.    
d4c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61  }else{.      pTa
d4d0: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  ble->nCol = 0;. 
d4e0: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
d4f0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65   }.    sqlite3Se
d500: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 29  lectDelete(pSel)
d510: 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
d520: 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72   nErr++;.  }.  r
d530: 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 23 65  eturn nErr;  .#e
d540: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
d550: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 7d 0a 23 65  MIT_VIEW */.}.#e
d560: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
d570: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
d580: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
d590: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
d5a0: 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66  ALTABLE) */..#if
d5b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d5c0: 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  _VIEW./*.** Clea
d5d0: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
d5e0: 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49  es from every VI
d5f0: 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  EW in database i
d600: 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  dx..*/.static vo
d610: 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  id sqliteViewRes
d620: 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64  etAll(sqlite3 *d
d630: 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48  b, int idx){.  H
d640: 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66  ashElem *i;.  if
d650: 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79  ( !DbHasProperty
d660: 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
d670: 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74  esetViews) ) ret
d680: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  urn;.  for(i=sql
d690: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
d6a0: 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65  ->aDb[idx].pSche
d6b0: 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b  ma->tblHash); i;
d6c0: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
d6d0: 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  (i)){.    Table 
d6e0: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
d6f0: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69  shData(i);.    i
d700: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
d710: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d720: 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ResetColumnNames
d730: 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTab);.    }.  
d740: 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65  }.  DbClearPrope
d750: 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
d760: 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d  UnresetViews);.}
d770: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
d780: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
d790: 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f  ll(A,B).#endif /
d7a0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
d7b0: 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  EW */../*.** Thi
d7c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
d7d0: 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45  lled by the VDBE
d7e0: 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69   to adjust the i
d7f0: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
d800: 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65  * used by SQLite
d810: 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20   when the btree 
d820: 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61  layer moves a ta
d830: 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54  ble root page. T
d840: 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20  he.** root-page 
d850: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
d860: 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20  dex in database 
d870: 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20  iDb has changed 
d880: 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f  from iFrom.** to
d890: 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b   iTo..**.** Tick
d8a0: 65 74 20 23 31 37 32 38 3a 20 20 54 68 65 20 73  et #1728:  The s
d8b0: 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68  ymbol table migh
d8c0: 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  t still contain 
d8d0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f  information.** o
d8e0: 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20  n tables and/or 
d8f0: 69 6e 64 69 63 65 73 20 74 68 61 74 20 61 72 65  indices that are
d900: 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20   the process of 
d910: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a  being deleted..*
d920: 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c  * If you are unl
d930: 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f  ucky, one of tho
d940: 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  se deleted indic
d950: 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67  es or tables mig
d960: 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73  ht.** have the s
d970: 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d  ame rootpage num
d980: 62 65 72 20 61 73 20 74 68 65 20 72 65 61 6c 20  ber as the real 
d990: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
d9a0: 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20  hat is.** being 
d9b0: 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61  moved.  So we ca
d9c0: 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68  nnot stop search
d9d0: 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 66 69  ing after the fi
d9e0: 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65  rst match .** be
d9f0: 63 61 75 73 65 20 74 68 65 20 66 69 72 73 74 20  cause the first 
da00: 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65 20 66  match might be f
da10: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65  or one of the de
da20: 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a  leted indices.**
da30: 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e   or tables and n
da40: 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64  ot the table/ind
da50: 65 78 20 74 68 61 74 20 69 73 20 61 63 74 75 61  ex that is actua
da60: 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e  lly being moved.
da70: 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74  .** We must cont
da80: 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74  inue looping unt
da90: 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e  il all tables an
daa0: 64 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a  d indices with.*
dab0: 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f  * rootpage==iFro
dac0: 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76  m have been conv
dad0: 65 72 74 65 64 20 74 6f 20 68 61 76 65 20 61 20  erted to have a 
dae0: 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a  rootpage of iTo.
daf0: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ** in order to b
db00: 65 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 77  e certain that w
db10: 65 20 67 6f 74 20 74 68 65 20 72 69 67 68 74 20  e got the right 
db20: 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  one..*/.#ifndef 
db30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
db40: 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69  VACUUM.void sqli
db50: 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64  te3RootPageMoved
db60: 28 44 62 20 2a 70 44 62 2c 20 69 6e 74 20 69 46  (Db *pDb, int iF
db70: 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20  rom, int iTo){. 
db80: 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d   HashElem *pElem
db90: 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b  ;.  Hash *pHash;
dba0: 0a 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62  ..  pHash = &pDb
dbb0: 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
dbc0: 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  sh;.  for(pElem=
dbd0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
dbe0: 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
dbf0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
dc00: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
dc10: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
dc20: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
dc30: 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54  lem);.    if( pT
dc40: 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  ab->tnum==iFrom 
dc50: 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  ){.      pTab->t
dc60: 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d  num = iTo;.    }
dc70: 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26  .  }.  pHash = &
dc80: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  pDb->pSchema->id
dc90: 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c  xHash;.  for(pEl
dca0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
dcb0: 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
dcc0: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
dcd0: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
dce0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
dcf0: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
dd00: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
dd10: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pIdx->tnum==iFr
dd20: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  om ){.      pIdx
dd30: 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
dd40: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
dd50: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f  ../*.** Write co
dd60: 64 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20  de to erase the 
dd70: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
dd80: 70 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d  page iTable from
dd90: 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a   database iDb..*
dda0: 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64  * Also write cod
ddb0: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
ddc0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
ddd0: 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  ble and internal
dde0: 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20   schema.** if a 
ddf0: 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f  root-page of ano
de00: 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
de10: 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
de20: 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a  -layer whilst.**
de30: 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20   erasing iTable 
de40: 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e  (this can happen
de50: 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61   with an auto-va
de60: 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a  cuum database)..
de70: 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
de80: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
de90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
dea0: 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69  nt iTable, int i
deb0: 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
dec0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
ded0: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
dee0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
def0: 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c  P_Destroy, iTabl
df00: 65 2c 20 69 44 62 29 3b 0a 23 69 66 6e 64 65 66  e, iDb);.#ifndef
df10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
df20: 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f  OVACUUM.  /* OP_
df30: 44 65 73 74 72 6f 79 20 70 75 73 68 65 73 20 61  Destroy pushes a
df40: 6e 20 69 6e 74 65 67 65 72 20 6f 6e 74 6f 20 74  n integer onto t
df50: 68 65 20 73 74 61 63 6b 2e 20 49 66 20 74 68 69  he stack. If thi
df60: 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69  s integer.  ** i
df70: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
df80: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
df90: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
dfa0: 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a   table moved to.
dfb0: 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54    ** location iT
dfc0: 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  able. The follow
dfd0: 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65  ing code modifie
dfe0: 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  s the sqlite_mas
dff0: 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a  ter table to.  *
e000: 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a  * reflect this..
e010: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23    **.  ** The "#
e020: 30 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73  0" in the SQL is
e030: 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74   a special const
e040: 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ant that means w
e050: 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20  hatever value.  
e060: 2a 2a 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70  ** is on the top
e070: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 20   of the stack.  
e080: 53 65 65 20 73 71 6c 69 74 65 33 52 65 67 69 73  See sqlite3Regis
e090: 74 65 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a  terExpr()..  */.
e0a0: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
e0b0: 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
e0c0: 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
e0d0: 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64   SET rootpage=%d
e0e0: 20 57 48 45 52 45 20 23 30 20 41 4e 44 20 72 6f   WHERE #0 AND ro
e0f0: 6f 74 70 61 67 65 3d 23 30 22 2c 0a 20 20 20 20  otpage=#0",.    
e100: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
e110: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
e120: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
e130: 69 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  iTable);.#endif.
e140: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56  }../*.** Write V
e150: 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73  DBE code to eras
e160: 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  e table pTab and
e170: 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20   all associated 
e180: 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e  indices on disk.
e190: 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61  .** Code to upda
e1a0: 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  te the sqlite_ma
e1b0: 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20  ster tables and 
e1c0: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
e1d0: 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69  definitions.** i
e1e0: 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61  n case a root-pa
e1f0: 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
e200: 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
e210: 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
e220: 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20  ree layer.** is 
e230: 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73  also added (this
e240: 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
e250: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
e260: 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74  database)..*/.st
e270: 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
e280: 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  yTable(Parse *pP
e290: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
e2a0: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
e2b0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
e2c0: 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  M.  Index *pIdx;
e2d0: 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
e2e0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
e2f0: 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
e300: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
e310: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
e320: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e  pParse, pTab->tn
e330: 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28  um, iDb);.  for(
e340: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
e350: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
e360: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
e370: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
e380: 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e  pParse, pIdx->tn
e390: 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65  um, iDb);.  }.#e
e3a0: 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  lse.  /* If the 
e3b0: 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20  database may be 
e3c0: 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
e3d0: 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f  ble (if SQLITE_O
e3e0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
e3f0: 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e   ** is not defin
e400: 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ed), then it is 
e410: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c  important to cal
e420: 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20  l OP_Destroy on 
e430: 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61  the.  ** table a
e440: 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61  nd index root-pa
e450: 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74  ges in order, st
e460: 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20  arting with the 
e470: 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a  numerically .  *
e480: 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  * largest root-p
e490: 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73  age number. This
e4a0: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
e4b0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f   none of the roo
e4c0: 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20  t-pages.  ** to 
e4d0: 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20  be destroyed is 
e4e0: 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20  relocated by an 
e4f0: 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72  earlier OP_Destr
e500: 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a  oy. i.e. if the.
e510: 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
e520: 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a  ere coded:.  **.
e530: 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
e540: 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a  4 0.  ** ....  *
e550: 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30  * OP_Destroy 5 0
e560: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72  .  **.  ** and r
e570: 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65  oot page 5 happe
e580: 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  ned to be the la
e590: 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
e5a0: 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20  number in the.  
e5b0: 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
e5c0: 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f  n root page 5 wo
e5d0: 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20  uld be moved to 
e5e0: 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20  page 4 by the . 
e5f0: 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20   ** "OP_Destroy 
e600: 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65  4 0" opcode. The
e610: 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f   subsequent "OP_
e620: 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75  Destroy 5 0" wou
e630: 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72  ld hit.  ** a fr
e640: 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20  ee-list page..  
e650: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
e660: 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e  pTab->tnum;.  in
e670: 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30  t iDestroyed = 0
e680: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ;..  while( 1 ){
e690: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
e6a0: 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65  ;.    int iLarge
e6b0: 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  st = 0;..    if(
e6c0: 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c   iDestroyed==0 |
e6d0: 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65  | iTab<iDestroye
e6e0: 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67  d ){.      iLarg
e6f0: 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  est = iTab;.    
e700: 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  }.    for(pIdx=p
e710: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
e720: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
e730: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
e740: 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75  iIdx = pIdx->tnu
e750: 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
e760: 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d   pIdx->pSchema==
e770: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
e780: 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73  .      if( (iDes
e790: 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49  troyed==0 || (iI
e7a0: 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20  dx<iDestroyed)) 
e7b0: 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74  && iIdx>iLargest
e7c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72   ){.        iLar
e7d0: 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20  gest = iIdx;.   
e7e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
e7f0: 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29  f( iLargest==0 )
e800: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  {.      return;.
e810: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e820: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
e830: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
e840: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
e850: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
e860: 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
e870: 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65  e(pParse, iLarge
e880: 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  st, iDb);.      
e890: 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61  iDestroyed = iLa
e8a0: 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  rgest;.    }.  }
e8b0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
e8c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
e8d0: 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68   called to do th
e8e0: 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50  e work of a DROP
e8f0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
e900: 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68  ..** pName is th
e910: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
e920: 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65  ble to be droppe
e930: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
e940: 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  e3DropTable(Pars
e950: 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
e960: 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
e970: 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72  sView, int noErr
e980: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
e990: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
e9a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e9b0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
e9c0: 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Db;..  if( pPars
e9d0: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
e9e0: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
e9f0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
ea00: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
ea10: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  }.  assert( pNam
ea20: 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
ea30: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
ea40: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
ea50: 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
ea60: 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
ea70: 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20  .zDatabase);..  
ea80: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
ea90: 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29 7b 0a     if( noErr ){.
eaa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
eab0: 6f 72 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  orClear(pParse);
eac0: 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20  .    }.    goto 
ead0: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
eae0: 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
eaf0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
eb00: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
eb10: 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ema);.  assert( 
eb20: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
eb30: 2d 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65 66  ->nDb );.#ifndef
eb40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
eb50: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
eb60: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
eb70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
eb80: 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
eb90: 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74  (iDb);.    const
eba0: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
ebb0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
ebc0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
ebd0: 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20  *zArg2 = 0;.    
ebe0: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
ebf0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
ec00: 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
ec10: 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20  , 0, zDb)){.    
ec20: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
ec30: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
ec40: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
ec50: 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
ec60: 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
ec70: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
ec80: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
ec90: 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
eca0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
ecb0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
ecc0: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a  P_VIEW;.      }.
ecd0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
ece0: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
ecf0: 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51  .      code = SQ
ed00: 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45  LITE_DROP_VTABLE
ed10: 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20  ;.      zArg2 = 
ed20: 70 54 61 62 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d  pTab->pMod->zNam
ed30: 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
ed40: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
ed50: 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
ed60: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
ed70: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
ed80: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
ed90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
eda0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
edb0: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a  _TABLE;.      }.
edc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
edd0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
ede0: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61  Parse, code, pTa
edf0: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c  b->zName, zArg2,
ee00: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
ee10: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
ee20: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ble;.    }.    i
ee30: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
ee40: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
ee50: 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d  TE_DELETE, pTab-
ee60: 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20  >zName, 0, zDb) 
ee70: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
ee80: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
ee90: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
eea0: 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64    if( pTab->read
eeb0: 4f 6e 6c 79 20 7c 7c 20 70 54 61 62 3d 3d 64 62  Only || pTab==db
eec0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
eed0: 6d 61 2d 3e 70 53 65 71 54 61 62 20 29 7b 0a 20  ma->pSeqTab ){. 
eee0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
eef0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
ef00: 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
ef10: 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e  dropped", pTab->
ef20: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
ef30: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
ef40: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
ef50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
ef60: 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50    /* Ensure DROP
ef70: 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73   TABLE is not us
ef80: 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e  ed on a view, an
ef90: 64 20 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e  d DROP VIEW is n
efa0: 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20  ot used.  ** on 
efb0: 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  a table..  */.  
efc0: 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54  if( isView && pT
efd0: 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
efe0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
eff0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
f000: 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f  se DROP TABLE to
f010: 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73   delete table %s
f020: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
f030: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
f040: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
f050: 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
f060: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
f070: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
f080: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
f090: 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64  e DROP VIEW to d
f0a0: 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20  elete view %s", 
f0b0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
f0c0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
f0d0: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  _table;.  }.#end
f0e0: 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
f0f0: 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
f100: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
f110: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
f120: 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20  .  ** on disk.. 
f130: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
f140: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
f150: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
f160: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
f170: 65 72 3b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  er;.    Db *pDb 
f180: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
f190: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
f1a0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
f1b0: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
f1c0: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c  ..    /* Drop al
f1d0: 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63  l triggers assoc
f1e0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
f1f0: 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
f200: 65 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20  ed. Code.    ** 
f210: 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  is generated to 
f220: 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  remove entries f
f230: 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  rom sqlite_maste
f240: 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20  r and/or.    ** 
f250: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
f260: 65 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  er if required..
f270: 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67      */.    pTrig
f280: 67 65 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69  ger = pTab->pTri
f290: 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28  gger;.    while(
f2a0: 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
f2b0: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
f2c0: 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  ger->pSchema==pT
f2d0: 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a  ab->pSchema || .
f2e0: 20 20 20 20 20 20 20 20 20 20 70 54 72 69 67 67            pTrigg
f2f0: 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  er->pSchema==db-
f300: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
f310: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f320: 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70  DropTriggerPtr(p
f330: 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29  Parse, pTrigger)
f340: 3b 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72  ;.      pTrigger
f350: 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
f360: 78 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  xt;.    }..#ifnd
f370: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
f380: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
f390: 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65   /* Remove any e
f3a0: 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71  ntries of the sq
f3b0: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
f3c0: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
f3d0: 69 74 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  ith.    ** the t
f3e0: 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
f3f0: 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  ed. This is done
f400: 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c   before the tabl
f410: 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 20  e is dropped.   
f420: 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65   ** at the btree
f430: 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20   level, in case 
f440: 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
f450: 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20  nce table needs 
f460: 74 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61  to.    ** move a
f470: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
f480: 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70  e drop (can happ
f490: 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  en in auto-vacuu
f4a0: 6d 20 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a  m mode)..    */.
f4b0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 75      if( pTab->au
f4c0: 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 73  toInc ){.      s
f4d0: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
f4e0: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
f4f0: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
f500: 73 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  s.sqlite_sequenc
f510: 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  e WHERE name=%Q"
f520: 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  ,.        pDb->z
f530: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
f540: 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
f550: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
f560: 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f  Drop all SQLITE_
f570: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64  MASTER table and
f580: 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74   index entries t
f590: 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
f5a0: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54  .    ** table. T
f5b0: 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20  he program name 
f5c0: 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68  loops through th
f5d0: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e master table a
f5e0: 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a  nd deletes.    *
f5f0: 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74  * every row that
f600: 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
f610: 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  le of the same n
f620: 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62  ame as the one b
f630: 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70  eing.    ** drop
f640: 70 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72  ped. Triggers ar
f650: 65 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61  e handled sepera
f660: 74 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74  tely because a t
f670: 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20  rigger can be.  
f680: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20    ** created in 
f690: 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
f6a0: 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  e that refers to
f6b0: 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74   a table in anot
f6c0: 68 65 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  her.    ** datab
f6d0: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
f6e0: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
f6f0: 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
f700: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
f710: 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c   %Q.%s WHERE tbl
f720: 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70  _name=%Q and typ
f730: 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20  e!='trigger'",. 
f740: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d         pDb->zNam
f750: 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
f760: 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  iDb), pTab->zNam
f770: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56  e);.    if( !isV
f780: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 64 65 73  iew ){.      des
f790: 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65  troyTable(pParse
f7a0: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 0a  , pTab);.    }..
f7b0: 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
f7c0: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72  e table entry fr
f7d0: 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65  om SQLite's inte
f7e0: 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20  rnal schema and 
f7f0: 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a 20 74 68  modify.    ** th
f800: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
f810: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
f820: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
f830: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f840: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 56 44  VdbeOp3(v, OP_VD
f850: 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20  estroy, iDb, 0, 
f860: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
f870: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
f880: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
f890: 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20  DropTable, iDb, 
f8a0: 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  0, pTab->zName, 
f8b0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  0);.    sqlite3C
f8c0: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20  hangeCookie(db, 
f8d0: 76 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73  v, iDb);.  }.  s
f8e0: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
f8f0: 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69  l(db, iDb);..exi
f900: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20  t_drop_table:.  
f910: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
f920: 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  lete(pName);.}..
f930: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
f940: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
f950: 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72  create a new for
f960: 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  eign key on the 
f970: 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74  table.** current
f980: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
f990: 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c  ction.  pFromCol
f9a0: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
f9b0: 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  h columns.** in 
f9c0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
f9d0: 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  e point to the f
f9e0: 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20  oreign key.  If 
f9f0: 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e  pFromCol==0 then
fa00: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20  .** connect the 
fa10: 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20  key to the last 
fa20: 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e  column inserted.
fa30: 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d    pTo is the nam
fa40: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  e of.** the tabl
fa50: 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20  e referred to.  
fa60: 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74  pToCol is a list
fa70: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
fa80: 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74  e other.** pTo t
fa90: 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f  able that the fo
faa0: 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73  reign key points
fab0: 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74   to.  flags cont
fac0: 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f  ains all.** info
fad0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
fae0: 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  e conflict resol
faf0: 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
fb00: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e   specified.** in
fb10: 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20   the ON DELETE, 
fb20: 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e  ON UPDATE and ON
fb30: 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e   INSERT clauses.
fb40: 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73  .**.** An FKey s
fb50: 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
fb60: 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f  ted and added to
fb70: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
fb80: 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f  ntly.** under co
fb90: 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
fba0: 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
fbb0: 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65 20  ble field.  The 
fbc0: 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e  new FKey.** is n
fbd0: 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64  ot linked into d
fbe0: 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69 73  b->aFKey at this
fbf0: 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64 6f   point - that do
fc00: 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a  es not happen.**
fc10: 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 45 6e   until sqlite3En
fc20: 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  dTable()..**.** 
fc30: 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  The foreign key 
fc40: 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44  is set for IMMED
fc50: 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e  IATE processing.
fc60: 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63    A subsequent c
fc70: 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  all.** to sqlite
fc80: 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
fc90: 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  () might change 
fca0: 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44  this to DEFERRED
fcb0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
fcc0: 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65  3CreateForeignKe
fcd0: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
fce0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
fcf0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
fd00: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f    ExprList *pFro
fd10: 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e  mCol,  /* Column
fd20: 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20  s in this table 
fd30: 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74  that point to ot
fd40: 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54  her table */.  T
fd50: 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20  oken *pTo,      
fd60: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
fd70: 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
fd80: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54  /.  ExprList *pT
fd90: 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75  oCol,    /* Colu
fda0: 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  mns in the other
fdb0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
fdc0: 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
fdd0: 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73   /* Conflict res
fde0: 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
fdf0: 6d 73 2e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  ms. */.){.#ifnde
fe00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
fe10: 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79  REIGN_KEY.  FKey
fe20: 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54   *pFKey = 0;.  T
fe30: 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65  able *p = pParse
fe40: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
fe50: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
fe60: 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20  i;.  int nCol;. 
fe70: 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73   char *z;..  ass
fe80: 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20  ert( pTo!=0 );. 
fe90: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
fea0: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 49 4e 5f  rse->nErr || IN_
feb0: 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67  DECLARE_VTAB ) g
fec0: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66  oto fk_end;.  if
fed0: 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
fee0: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  .    int iCol = 
fef0: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69  p->nCol-1;.    i
ff00: 66 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f  f( iCol<0 ) goto
ff10: 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28   fk_end;.    if(
ff20: 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
ff30: 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  l->nExpr!=1 ){. 
ff40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
ff50: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f  rMsg(pParse, "fo
ff60: 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22  reign key on %s"
ff70: 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75  .         " shou
ff80: 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  ld reference onl
ff90: 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  y one column of 
ffa0: 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20  table %T",.     
ffb0: 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c      p->aCol[iCol
ffc0: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20  ].zName, pTo);. 
ffd0: 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
ffe0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c  ;.    }.    nCol
fff0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
10000 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
10010 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d  ol->nExpr!=pFrom
10020 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  Col->nExpr ){.  
10030 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10040 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
10050 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c    "number of col
10060 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20  umns in foreign 
10070 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
10080 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
10090 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75   ".        "colu
100a0 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72  mns in the refer
100b0 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20  enced table");. 
100c0 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
100d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
100e0 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  l = pFromCol->nE
100f0 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  xpr;.  }.  nByte
10100 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79   = sizeof(*pFKey
10110 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28  ) + nCol*sizeof(
10120 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20  pFKey->aCol[0]) 
10130 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20  + pTo->n + 1;.  
10140 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
10150 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f    for(i=0; i<pTo
10160 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  Col->nExpr; i++)
10170 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
10180 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e   strlen(pToCol->
10190 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b  a[i].zName) + 1;
101a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
101b0 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ey = sqliteMallo
101c0 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  c( nByte );.  if
101d0 28 20 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74  ( pFKey==0 ) got
101e0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65  o fk_end;.  pFKe
101f0 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20  y->pFrom = p;.  
10200 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
10210 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a   = p->pFKey;.  z
10220 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79   = (char*)&pFKey
10230 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43  [1];.  pFKey->aC
10240 6f 6c 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f  ol = (struct sCo
10250 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20  lMap*)z;.  z += 
10260 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43  sizeof(struct sC
10270 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70  olMap)*nCol;.  p
10280 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20  FKey->zTo = z;. 
10290 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e   memcpy(z, pTo->
102a0 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b  z, pTo->n);.  z[
102b0 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a  pTo->n] = 0;.  z
102c0 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20   += pTo->n+1;.  
102d0 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d  pFKey->pNextTo =
102e0 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f   0;.  pFKey->nCo
102f0 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20  l = nCol;.  if( 
10300 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
10310 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30     pFKey->aCol[0
10320 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f  ].iFrom = p->nCo
10330 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l-1;.  }else{.  
10340 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
10350 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
10360 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
10370 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20  j=0; j<p->nCol; 
10380 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
10390 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
103a0 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  (p->aCol[j].zNam
103b0 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69  e, pFromCol->a[i
103c0 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
103d0 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e           pFKey->
103e0 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[i].iFrom = 
103f0 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  j;.          bre
10400 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
10410 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
10420 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  j>=p->nCol ){.  
10430 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
10440 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
10450 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77           "unknow
10460 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20  n column \"%s\" 
10470 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
10480 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20  efinition", .   
10490 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d         pFromCol-
104a0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
104b0 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
104c0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
104d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f  .  }.  if( pToCo
104e0 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
104f0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
10500 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
10510 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  rlen(pToCol->a[i
10520 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
10530 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  pFKey->aCol[i].z
10540 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d  Col = z;.      m
10550 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d  emcpy(z, pToCol-
10560 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b  >a[i].zName, n);
10570 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b  .      z[n] = 0;
10580 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b  .      z += n+1;
10590 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
105a0 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
105b0 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c   0;.  pFKey->del
105c0 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20  eteConf = flags 
105d0 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d  & 0xff;.  pFKey-
105e0 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66  >updateConf = (f
105f0 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78  lags >> 8 ) & 0x
10600 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73  ff;.  pFKey->ins
10610 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73  ertConf = (flags
10620 20 3e 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b   >> 16 ) & 0xff;
10630 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
10640 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74  foreign key to t
10650 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20  he table as the 
10660 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a  last step..  */.
10670 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b    p->pFKey = pFK
10680 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b  ey;.  pFKey = 0;
10690 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69  ..fk_end:.  sqli
106a0 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 23  teFree(pFKey);.#
106b0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
106c0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  d(SQLITE_OMIT_FO
106d0 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20  REIGN_KEY) */.  
106e0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
106f0 65 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b  elete(pFromCol);
10700 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
10710 73 74 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29  stDelete(pToCol)
10720 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
10730 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
10740 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41  d when an INITIA
10750 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72  LLY IMMEDIATE or
10760 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
10770 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73  RED.** clause is
10780 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66   seen as part of
10790 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64   a foreign key d
107a0 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20  efinition.  The 
107b0 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61  isDeferred.** pa
107c0 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72  rameter is 1 for
107d0 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
107e0 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e  RED and 0 for IN
107f0 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
10800 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69  E..** The behavi
10810 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  or of the most r
10820 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
10830 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61  foreign key is a
10840 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72  djusted.** accor
10850 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  dingly..*/.void 
10860 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
10870 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50  ignKey(Parse *pP
10880 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65  arse, int isDefe
10890 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53  rred){.#ifndef S
108a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
108b0 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a  GN_KEY.  Table *
108c0 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46  pTab;.  FKey *pF
108d0 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62  Key;.  if( (pTab
108e0 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
108f0 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b  able)==0 || (pFK
10900 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79  ey = pTab->pFKey
10910 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
10920 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
10930 65 64 20 3d 20 69 73 44 65 66 65 72 72 65 64 3b  ed = isDeferred;
10940 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
10950 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
10960 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61  hat will erase a
10970 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20  nd refill index 
10980 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a  *pIdx.  This is.
10990 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69  ** used to initi
109a0 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72  alize a newly cr
109b0 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74  eated index or t
109c0 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a  o recompute the.
109d0 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  ** content of an
109e0 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e   index in respon
109f0 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20  se to a REINDEX 
10a00 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69  command..**.** i
10a10 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73  f memRootPage is
10a20 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69   not negative, i
10a30 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
10a40 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a   index is newly.
10a50 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  ** created.  The
10a60 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 73 70 65   memory cell spe
10a70 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f  cified by memRoo
10a80 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74  tPage contains t
10a90 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
10aa0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
10ab0 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74  dex.  If memRoot
10ac0 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65  Page is negative
10ad0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e  , then.** the in
10ae0 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
10af0 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63  ts and must be c
10b00 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 62 65  leared before be
10b10 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64  ing refilled and
10b20 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67  .** the root pag
10b30 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
10b40 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66  index is taken f
10b50 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  rom pIndex->tnum
10b60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10b70 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
10b80 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
10b90 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  e, Index *pIndex
10ba0 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67  , int memRootPag
10bb0 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  e){.  Table *pTa
10bc0 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  b = pIndex->pTab
10bd0 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  le;  /* The tabl
10be0 65 20 74 68 61 74 20 69 73 20 69 6e 64 65 78 65  e that is indexe
10bf0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20  d */.  int iTab 
10c00 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 20  = pParse->nTab; 
10c10 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63        /* Btree c
10c20 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
10c30 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  Tab */.  int iId
10c40 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
10c50 2b 31 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65  +1;     /* Btree
10c60 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
10c70 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74   pIndex */.  int
10c80 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20   addr1;         
10c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
10ca0 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66  ddress of top of
10cb0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 74   loop */.  int t
10cc0 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
10cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
10ce0 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20  t page of index 
10cf0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
10d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d10 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
10d20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76  code into this v
10d30 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a  irtual machine *
10d40 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
10d50 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
10d60 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f     /* KeyInfo fo
10d70 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  r index */.  int
10d80 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
10d90 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
10da0 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 2d 3e  se->db, pIndex->
10db0 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64  pSchema);..#ifnd
10dc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
10dd0 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69  UTHORIZATION.  i
10de0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
10df0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
10e00 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64  TE_REINDEX, pInd
10e10 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20  ex->zName, 0,.  
10e20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
10e30 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29  aDb[iDb].zName )
10e40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
10e50 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
10e60 20 52 65 71 75 69 72 65 20 61 20 77 72 69 74 65   Require a write
10e70 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62  -lock on the tab
10e80 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  le to perform th
10e90 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  is operation */.
10ea0 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
10eb0 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
10ec0 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70  pTab->tnum, 1, p
10ed0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
10ee0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
10ef0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
10f00 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
10f10 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61  .  if( memRootPa
10f20 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ge>=0 ){.    sql
10f30 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10f40 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d   OP_MemLoad, mem
10f50 52 6f 6f 74 50 61 67 65 2c 20 30 29 3b 0a 20 20  RootPage, 0);.  
10f60 20 20 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d 65    tnum = 0;.  }e
10f70 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  lse{.    tnum = 
10f80 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20  pIndex->tnum;.  
10f90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10fa0 4f 70 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20  Op(v, OP_Clear, 
10fb0 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a  tnum, iDb);.  }.
10fc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10fd0 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
10fe0 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 70 4b 65  , iDb, 0);.  pKe
10ff0 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  y = sqlite3Index
11000 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20  Keyinfo(pParse, 
11010 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74  pIndex);.  sqlit
11020 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
11030 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c  OpenWrite, iIdx,
11040 20 74 6e 75 6d 2c 20 28 63 68 61 72 20 2a 29 70   tnum, (char *)p
11050 4b 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  Key, P3_KEYINFO_
11060 48 41 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69  HANDOFF);.  sqli
11070 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
11080 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
11090 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
110a0 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  d);.  addr1 = sq
110b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
110c0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  , OP_Rewind, iTa
110d0 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  b, 0);.  sqlite3
110e0 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
110f0 28 76 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62  (v, pIndex, iTab
11100 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d  );.  if( pIndex-
11110 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
11120 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 75 72  e ){.    int cur
11130 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
11140 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
11150 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 32 20  ;.    int addr2 
11160 3d 20 63 75 72 61 64 64 72 2b 34 3b 0a 20 20 20  = curaddr+4;.   
11170 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
11180 67 65 50 32 28 76 2c 20 63 75 72 61 64 64 72 2d  geP2(v, curaddr-
11190 31 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 73  1, addr2);.    s
111a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
111b0 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61  v, OP_Rowid, iTa
111c0 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
111d0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
111e0 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 30 29 3b  P_AddImm, 1, 0);
111f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11200 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 55 6e  AddOp(v, OP_IsUn
11210 69 71 75 65 2c 20 69 49 64 78 2c 20 61 64 64 72  ique, iIdx, addr
11220 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  2);.    sqlite3V
11230 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c  dbeOp3(v, OP_Hal
11240 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  t, SQLITE_CONSTR
11250 41 49 4e 54 2c 20 4f 45 5f 41 62 6f 72 74 2c 0a  AINT, OE_Abort,.
11260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11270 20 20 20 20 22 69 6e 64 65 78 65 64 20 63 6f 6c      "indexed col
11280 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69  umns are not uni
11290 71 75 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29  que", P3_STATIC)
112a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 64  ;.    assert( ad
112b0 64 72 32 3d 3d 73 71 6c 69 74 65 33 56 64 62 65  dr2==sqlite3Vdbe
112c0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 29  CurrentAddr(v) )
112d0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
112e0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
112f0 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20  dxInsert, iIdx, 
11300 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
11310 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
11320 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31  t, iTab, addr1+1
11330 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
11340 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
11350 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
11360 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
11370 73 65 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  se, iTab, 0);.  
11380 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11390 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
113a0 64 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx, 0);.}../*.**
113b0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
113c0 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74  dex for an SQL t
113d0 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e  able.  pName1.pN
113e0 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65  ame2 is the name
113f0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
11400 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69  * and pTblList i
11410 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
11420 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
11430 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
11440 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
11450 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
11460 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e  ary key or an in
11470 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61  dex that is crea
11480 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61  ted to satisfy a
11490 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .** UNIQUE const
114a0 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c  raint.  If pTabl
114b0 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65  e and pIndex are
114c0 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73   NULL, use pPars
114d0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20  e->pNewTable.** 
114e0 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  as the table to 
114f0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61  be indexed.  pPa
11500 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
11510 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  s a table that i
11520 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62  s.** currently b
11530 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
11540 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42   by a CREATE TAB
11550 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
11560 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
11570 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
11580 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
11590 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
115a0 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  L if this.** is 
115b0 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
115c0 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69   unique-constrai
115d0 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
115e0 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64  ecent column add
115f0 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62  ed.** to the tab
11600 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
11610 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
11620 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74    .*/.void sqlit
11630 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20  e3CreateIndex(. 
11640 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
11650 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72      /* All infor
11660 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69  mation about thi
11670 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b  s parse */.  Tok
11680 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
11690 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
116a0 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
116b0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   be NULL */.  To
116c0 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
116d0 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
116e0 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d  of index name. M
116f0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
11700 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d  SrcList *pTblNam
11710 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69  e, /* Table to i
11720 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65  ndex. Use pParse
11730 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30  ->pNewTable if 0
11740 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
11750 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69  pList,   /* A li
11760 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
11770 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
11780 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
11790 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c      /* OE_Abort,
117a0 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52   OE_Ignore, OE_R
117b0 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f  eplace, or OE_No
117c0 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ne */.  Token *p
117d0 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68  Start,     /* Th
117e0 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
117f0 68 61 74 20 62 65 67 69 6e 73 20 61 20 43 52 45  hat begins a CRE
11800 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
11810 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
11820 70 45 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20 54  pEnd,       /* T
11830 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73  he ")" that clos
11840 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49 4e  es the CREATE IN
11850 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  DEX statement */
11860 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
11870 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72  ,     /* Sort or
11880 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b  der of primary k
11890 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e  ey when pList==N
118a0 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e  ULL */.  int ifN
118b0 6f 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20 4f  otExist     /* O
118c0 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64  mit error if ind
118d0 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
118e0 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  s */.){.  Table 
118f0 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f  *pTab = 0;     /
11900 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  * Table to be in
11910 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  dexed */.  Index
11920 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20   *pIndex = 0;   
11930 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
11940 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  be created */.  
11950 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
11960 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
11970 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  the index */.  i
11980 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
11990 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
119a0 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a   characters in z
119b0 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  Name */.  int i,
119c0 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c   j;.  Token null
119d0 49 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 61  Id;        /* Fa
119e0 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20  ke token for an 
119f0 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f  empty ID list */
11a00 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
11a10 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61          /* For a
11a20 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73  ssigning databas
11a30 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c  e names to pTabl
11a40 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  e */.  int sortO
11a50 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31  rderMask;   /* 1
11a60 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69   to honor DESC i
11a70 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69  n index.  0 to i
11a80 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69  gnore. */.  sqli
11a90 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
11aa0 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b  ->db;.  Db *pDb;
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ac0 54 68 65 20 73 70 65 63 69 66 69 63 20 74 61 62  The specific tab
11ad0 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
11ae0 65 20 69 6e 64 65 78 65 64 20 64 61 74 61 62 61  e indexed databa
11af0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11b10 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  Index of the dat
11b20 61 62 61 73 65 20 74 68 61 74 20 69 73 20 62 65  abase that is be
11b30 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  ing written */. 
11b40 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20   Token *pName = 
11b50 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69  0;    /* Unquali
11b60 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65  fied name of the
11b70 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65   index to create
11b80 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70   */.  struct Exp
11b90 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73  rList_item *pLis
11ba0 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f  tItem; /* For lo
11bb0 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74  oping over pList
11bc0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a   */.  int nCol;.
11bd0 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30    int nExtra = 0
11be0 3b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61  ;.  char *zExtra
11bf0 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
11c00 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
11c10 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 7c  MallocFailed() |
11c20 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41  | IN_DECLARE_VTA
11c30 42 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  B ){.    goto ex
11c40 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
11c50 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
11c60 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74  Find the table t
11c70 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64  hat is to be ind
11c80 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61  exed.  Return ea
11c90 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  rly if not found
11ca0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62  ..  */.  if( pTb
11cb0 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20  lName!=0 ){..   
11cc0 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d   /* Use the two-
11cd0 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20  part index name 
11ce0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
11cf0 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
11d00 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20  * to search for 
11d10 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27  the table. 'Fix'
11d20 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
11d30 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a  to this db.    *
11d40 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67  * before looking
11d50 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   up the table.. 
11d60 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
11d70 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d  ( pName1 && pNam
11d80 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20  e2 );.    iDb = 
11d90 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
11da0 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
11db0 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
11dc0 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  e);.    if( iDb<
11dd0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
11de0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 23 69 66  eate_index;..#if
11df0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11e00 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49  _TEMPDB.    /* I
11e10 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
11e20 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64   was unqualified
11e30 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74  , check if the t
11e40 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  he table.    ** 
11e50 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e  is a temp table.
11e60 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20   If so, set the 
11e70 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 0a 20  database to 1.. 
11e80 20 20 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d     */.    pTab =
11e90 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
11ea0 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54  ookup(pParse, pT
11eb0 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  blName);.    if(
11ec0 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65   pName2 && pName
11ed0 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20  2->n==0 && pTab 
11ee0 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  && pTab->pSchema
11ef0 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ==db->aDb[1].pSc
11f00 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 69 44  hema ){.      iD
11f10 62 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  b = 1;.    }.#en
11f20 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73 71 6c  dif..    if( sql
11f30 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
11f40 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20  x, pParse, iDb, 
11f50 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20  "index", pName) 
11f60 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  &&.        sqlit
11f70 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46  e3FixSrcList(&sF
11f80 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20  ix, pTblName).  
11f90 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65    ){.      /* Be
11fa0 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72  cause the parser
11fb0 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c   constructs pTbl
11fc0 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67  Name from a sing
11fd0 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20  le identifier,. 
11fe0 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46       ** sqlite3F
11ff0 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65  ixSrcList can ne
12000 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20  ver fail. */.   
12010 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
12020 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73    }.    pTab = s
12030 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
12040 65 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61  e(pParse, pTblNa
12050 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
12060 0a 20 20 20 20 20 20 20 20 70 54 62 6c 4e 61 6d  .        pTblNam
12070 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
12080 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61  e);.    if( !pTa
12090 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  b ) goto exit_cr
120a0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
120b0 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
120c0 69 44 62 5d 2e 70 53 63 68 65 6d 61 3d 3d 70 54  iDb].pSchema==pT
120d0 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
120e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
120f0 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a  rt( pName==0 );.
12100 20 20 20 20 70 54 61 62 20 3d 20 70 50 61 72 73      pTab = pPars
12110 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
12120 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67 6f    if( !pTab ) go
12130 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
12140 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20  ndex;.    iDb = 
12150 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
12160 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
12170 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70  Schema);.  }.  p
12180 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
12190 62 5d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  b];..  if( pTab=
121a0 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
121b0 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  rr ) goto exit_c
121c0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69  reate_index;.  i
121d0 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c  f( pTab->readOnl
121e0 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
121f0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
12200 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
12210 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20  ot be indexed", 
12220 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
12230 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
12240 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69  te_index;.  }.#i
12250 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12260 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54 61  T_VIEW.  if( pTa
12270 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
12280 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12290 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 73  g(pParse, "views
122a0 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
122b0 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  xed");.    goto 
122c0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
122d0 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  x;.  }.#endif.. 
122e0 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
122f0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
12300 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  dex.  Make sure 
12310 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72  there is not alr
12320 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a  eady another.  *
12330 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
12340 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
12350 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ame.  .  **.  **
12360 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20   Exception:  If 
12370 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
12380 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d  he names of perm
12390 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72  anent indices fr
123a0 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  om the.  ** sqli
123b0 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
123c0 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74  (because some ot
123d0 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e  her process chan
123e0 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20  ged the schema) 
123f0 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20  and.  ** one of 
12400 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  the index names 
12410 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68  collides with th
12420 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70  e name of a temp
12430 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20  orary table or. 
12440 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20   ** index, then 
12450 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
12460 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73   to process this
12470 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
12480 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74  * If pName==0 it
12490 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61   means that we a
124a0 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20  re.  ** dealing 
124b0 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b  with a primary k
124c0 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ey or UNIQUE con
124d0 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76  straint.  We hav
124e0 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a  e to invent our.
124f0 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20    ** own name.. 
12500 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
12510 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
12520 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
12530 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20  ken(pName);.    
12540 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
12550 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
12560 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20  (pParse) ) goto 
12570 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12580 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  x;.    if( zName
12590 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
125a0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
125b0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
125c0 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
125d0 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
125e0 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
125f0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12600 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
12610 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
12620 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66  busy ){.      if
12630 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
12640 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
12650 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78  Parse) ) goto ex
12660 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
12670 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
12680 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
12690 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d  zName, pDb->zNam
126a0 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
126b0 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74   if( !ifNotExist
126c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
126d0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
126e0 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20  arse, "index %s 
126f0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
12700 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
12710 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20   }.        goto 
12720 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12730 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
12740 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
12750 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
12760 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)!=0 ){.      
12770 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12780 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
12790 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61   is already a ta
127a0 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  ble named %s", z
127b0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
127c0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
127d0 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
127e0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
127f0 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
12800 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
12810 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20  Index *pLoop;.  
12820 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62    for(pLoop=pTab
12830 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70  ->pIndex, n=1; p
12840 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
12850 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d  p->pNext, n++){}
12860 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
12870 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20 20 20 20  f,"_%d",n);.    
12880 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73  zName = 0;.    s
12890 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
128a0 26 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  &zName, "sqlite_
128b0 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 70 54 61  autoindex_", pTa
128c0 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66 2c 20  b->zName, zBuf, 
128d0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 69  (char*)0);.    i
128e0 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
128f0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
12900 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ndex;.  }..  /* 
12910 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72  Check for author
12920 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74  ization to creat
12930 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f  e an index..  */
12940 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12950 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
12960 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ON.  {.    const
12970 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62   char *zDb = pDb
12980 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ->zName;.    if(
12990 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
129a0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
129b0 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f  _INSERT, SCHEMA_
129c0 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a  TABLE(iDb), 0, z
129d0 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
129e0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
129f0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
12a00 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
12a10 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
12a20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
12a30 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c  iDb==1 ) i = SQL
12a40 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
12a50 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
12a60 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
12a70 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65  pParse, i, zName
12a80 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
12a90 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
12aa0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
12ab0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
12ac0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70  endif..  /* If p
12ad0 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e  List==0, it mean
12ae0 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
12af0 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b  as called to mak
12b00 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a  e a primary.  **
12b10 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20   key out of the 
12b20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  last column adde
12b30 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75  d to the table u
12b40 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
12b50 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74  n..  ** So creat
12b60 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f  e a fake list to
12b70 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a   simulate this..
12b80 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74    */.  if( pList
12b90 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49  ==0 ){.    nullI
12ba0 64 2e 7a 20 3d 20 28 75 38 2a 29 70 54 61 62 2d  d.z = (u8*)pTab-
12bb0 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c  >aCol[pTab->nCol
12bc0 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e  -1].zName;.    n
12bd0 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e  ullId.n = strlen
12be0 28 28 63 68 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a  ((char*)nullId.z
12bf0 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  );.    pList = s
12c00 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
12c10 70 65 6e 64 28 30 2c 20 30 2c 20 26 6e 75 6c 6c  pend(0, 0, &null
12c20 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  Id);.    if( pLi
12c30 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  st==0 ) goto exi
12c40 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12c50 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e      pList->a[0].
12c60 73 6f 72 74 4f 72 64 65 72 20 3d 20 73 6f 72 74  sortOrder = sort
12c70 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Order;.  }..  /*
12c80 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
12c90 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70  many bytes of sp
12ca0 61 63 65 20 61 72 65 20 72 65 71 75 69 72 65 64  ace are required
12cb0 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63   to store explic
12cc0 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66  itly.  ** specif
12cd0 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ied collation se
12ce0 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20  quence names..  
12cf0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
12d00 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
12d10 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
12d20 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  xpr = pList->a[i
12d30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
12d40 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20   pExpr ){.      
12d50 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20 73  nExtra += (1 + s
12d60 74 72 6c 65 6e 28 70 45 78 70 72 2d 3e 70 43 6f  trlen(pExpr->pCo
12d70 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ll->zName));.   
12d80 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20   }.  }..  /* .  
12d90 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  ** Allocate the 
12da0 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  index structure.
12db0 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d   .  */.  nName =
12dc0 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a   strlen(zName);.
12dd0 20 20 6e 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e    nCol = pList->
12de0 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 20  nExpr;.  pIndex 
12df0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
12e00 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 49 6e  .      sizeof(In
12e10 64 65 78 29 20 2b 20 20 20 20 20 20 20 20 20 20  dex) +          
12e20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72      /* Index str
12e30 75 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20  ucture  */.     
12e40 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 6f   sizeof(int)*nCo
12e50 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l +           /*
12e60 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20   Index.aiColumn 
12e70 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f    */.      sizeo
12e80 66 28 69 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 20  f(int)*(nCol+1) 
12e90 2b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  +       /* Index
12ea0 2e 61 69 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20  .aiRowEst   */. 
12eb0 20 20 20 20 20 73 69 7a 65 6f 66 28 63 68 61 72       sizeof(char
12ec0 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20   *)*nCol +      
12ed0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c    /* Index.azCol
12ee0 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73  l     */.      s
12ef0 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 20 2b  izeof(u8)*nCol +
12f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
12f10 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20  ndex.aSortOrder 
12f20 2a 2f 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b  */.      nName +
12f30 20 31 20 2b 20 20 20 20 20 20 20 20 20 20 20 20   1 +            
12f40 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 7a        /* Index.z
12f50 4e 61 6d 65 20 20 20 20 20 20 2a 2f 0a 20 20 20  Name      */.   
12f60 20 20 20 6e 45 78 74 72 61 20 20 20 20 20 20 20     nExtra       
12f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f80 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  /* Collation seq
12f90 75 65 6e 63 65 20 6e 61 6d 65 73 20 2a 2f 0a 20  uence names */. 
12fa0 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
12fb0 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
12fc0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
12fd0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49 6e 64  te_index;.  pInd
12fe0 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68  ex->azColl = (ch
12ff0 61 72 2a 2a 29 28 26 70 49 6e 64 65 78 5b 31 5d  ar**)(&pIndex[1]
13000 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  );.  pIndex->aiC
13010 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 20 2a 29 28  olumn = (int *)(
13020 26 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b  &pIndex->azColl[
13030 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78  nCol]);.  pIndex
13040 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20 28 75 6e  ->aiRowEst = (un
13050 73 69 67 6e 65 64 20 2a 29 28 26 70 49 6e 64 65  signed *)(&pInde
13060 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c  x->aiColumn[nCol
13070 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 53  ]);.  pIndex->aS
13080 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a  ortOrder = (u8 *
13090 29 28 26 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77  )(&pIndex->aiRow
130a0 45 73 74 5b 6e 43 6f 6c 2b 31 5d 29 3b 0a 20 20  Est[nCol+1]);.  
130b0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20  pIndex->zName = 
130c0 28 63 68 61 72 20 2a 29 28 26 70 49 6e 64 65 78  (char *)(&pIndex
130d0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f  ->aSortOrder[nCo
130e0 6c 5d 29 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20  l]);.  zExtra = 
130f0 28 63 68 61 72 20 2a 29 28 26 70 49 6e 64 65 78  (char *)(&pIndex
13100 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2b 31 5d  ->zName[nName+1]
13110 29 3b 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64  );.  strcpy(pInd
13120 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  ex->zName, zName
13130 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61  );.  pIndex->pTa
13140 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49  ble = pTab;.  pI
13150 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20  ndex->nColumn = 
13160 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
13170 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
13180 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e  = onError;.  pIn
13190 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d  dex->autoIndex =
131a0 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e   pName==0;.  pIn
131b0 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64  dex->pSchema = d
131c0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
131d0 65 6d 61 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ema;..  /* Check
131e0 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 73 68   to see if we sh
131f0 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20  ould honor DESC 
13200 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65  requests on inde
13210 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20  x columns.  */. 
13220 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
13230 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  a->file_format>=
13240 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64  4 ){.    sortOrd
13250 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f  erMask = -1;   /
13260 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a  * Honor DESC */.
13270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72    }else{.    sor
13280 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20  tOrderMask = 0; 
13290 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53     /* Ignore DES
132a0 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  C */.  }..  /* S
132b0 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  can the names of
132c0 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
132d0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
132e0 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a  indexed and.  **
132f0 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e   load the column
13300 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68   indices into th
13310 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  e Index structur
13320 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72  e.  Report an er
13330 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  ror.  ** if any 
13340 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f  column is not fo
13350 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  und..  */.  for(
13360 69 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70  i=0, pListItem=p
13370 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
13380 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c  ->nExpr; i++, pL
13390 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  istItem++){.    
133a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
133b0 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49 74 65 6d  Name = pListItem
133c0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c  ->zName;.    Col
133d0 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20  umn *pTabCol;.  
133e0 20 20 69 6e 74 20 72 65 71 75 65 73 74 65 64 53    int requestedS
133f0 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 63 68  ortOrder;.    ch
13400 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20  ar *zColl;      
13410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13420 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  Collation sequen
13430 63 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a  ce */..    for(j
13440 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62  =0, pTabCol=pTab
13450 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e  ->aCol; j<pTab->
13460 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43  nCol; j++, pTabC
13470 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ol++){.      if(
13480 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
13490 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f  zColName, pTabCo
134a0 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  l->zName)==0 ) b
134b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
134c0 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f  if( j>=pTab->nCo
134d0 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
134e0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
134f0 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73  e, "table %s has
13500 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64   no column named
13510 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54   %s",.        pT
13520 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e  ab->zName, zColN
13530 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
13540 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13550 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
13560 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
13570 5d 20 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20 70  ] = j;.    if( p
13580 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 20  ListItem->pExpr 
13590 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
135a0 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
135b0 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  r->pColl );.    
135c0 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61    zColl = zExtra
135d0 3b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 7a  ;.      strcpy(z
135e0 45 78 74 72 61 2c 20 70 4c 69 73 74 49 74 65 6d  Extra, pListItem
135f0 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d 3e  ->pExpr->pColl->
13600 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 45  zName);.      zE
13610 78 74 72 61 20 2b 3d 20 28 73 74 72 6c 65 6e 28  xtra += (strlen(
13620 7a 43 6f 6c 6c 29 20 2b 20 31 29 3b 0a 20 20 20  zColl) + 1);.   
13630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43   }else{.      zC
13640 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  oll = pTab->aCol
13650 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
13660 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 7b 0a 20   if( !zColl ){. 
13670 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 64         zColl = d
13680 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e  b->pDfltColl->zN
13690 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
136a0 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e   }.    if( !db->
136b0 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73 71  init.busy && !sq
136c0 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
136d0 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  eq(pParse, zColl
136e0 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 67  , -1) ){.      g
136f0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
13700 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
13710 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
13720 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20  i] = zColl;.    
13730 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
13740 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e  er = pListItem->
13750 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74  sortOrder & sort
13760 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70  OrderMask;.    p
13770 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
13780 72 5b 69 5d 20 3d 20 72 65 71 75 65 73 74 65 64  r[i] = requested
13790 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20  SortOrder;.  }. 
137a0 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
137b0 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 0a  owEst(pIndex);..
137c0 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72    if( pTab==pPar
137d0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b  se->pNewTable ){
137e0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  .    /* This rou
137f0 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61  tine has been ca
13800 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
13810 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
13820 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65  x as a.    ** re
13830 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52  sult of a PRIMAR
13840 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
13850 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75  clause on a colu
13860 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f  mn definition, o
13870 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41  r.    ** a PRIMA
13880 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
13890 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e   clause followin
138a0 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66  g the column def
138b0 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  initions..    **
138c0 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20   i.e. one of:.  
138d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41    **.    ** CREA
138e0 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49  TE TABLE t(x PRI
138f0 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20  MARY KEY, y);.  
13900 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
13910 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45  E t(x, y, UNIQUE
13920 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a  (x, y));.    **.
13930 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61      ** Either wa
13940 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  y, check to see 
13950 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  if the table alr
13960 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e  eady has such an
13970 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a   index. If.    *
13980 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68  * so, don't both
13990 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73  er creating this
139a0 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20   one. This only 
139b0 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a  applies to.    *
139c0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
139d0 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e  created indices.
139e0 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73   Users can do as
139f0 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a   they wish with.
13a00 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20      ** explicit 
13a10 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a  indices..    */.
13a20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
13a30 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
13a40 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
13a50 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
13a60 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  xt){.      int k
13a70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13a80 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
13a90 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20  E_None );.      
13aa0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 75  assert( pIdx->au
13ab0 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20 20 20  toIndex );.     
13ac0 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
13ad0 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
13ae0 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  e );..      if( 
13af0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70  pIdx->nColumn!=p
13b00 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
13b10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
13b20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78   for(k=0; k<pIdx
13b30 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b  ->nColumn; k++){
13b40 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
13b50 68 61 72 20 2a 7a 31 20 3d 20 70 49 64 78 2d 3e  har *z1 = pIdx->
13b60 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20  azColl[k];.     
13b70 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
13b80 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  2 = pIndex->azCo
13b90 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[k];.        i
13ba0 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
13bb0 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69  n[k]!=pIndex->ai
13bc0 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61  Column[k] ) brea
13bd0 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  k;.        if( p
13be0 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
13bf0 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 53 6f 72  k]!=pIndex->aSor
13c00 74 4f 72 64 65 72 5b 6b 5d 20 29 20 62 72 65 61  tOrder[k] ) brea
13c10 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  k;.        if( z
13c20 31 21 3d 7a 32 20 26 26 20 73 71 6c 69 74 65 33  1!=z2 && sqlite3
13c30 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20  StrICmp(z1, z2) 
13c40 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
13c50 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49  .      if( k==pI
13c60 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  dx->nColumn ){. 
13c70 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
13c80 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78  >onError!=pIndex
13c90 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20  ->onError ){.   
13ca0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
13cb0 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65  onstraint create
13cc0 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78  s the same index
13cd0 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20   as a previous. 
13ce0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
13cf0 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64  traint specified
13d00 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68   somewhere in th
13d10 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
13d20 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
13d30 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74      ** However t
13d40 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  he ON CONFLICT c
13d50 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65  lauses are diffe
13d60 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68  rent. If both th
13d70 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is .          **
13d80 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
13d90 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75  the previous equ
13da0 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69  ivalent constrai
13db0 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74  nt have explicit
13dc0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e  .          ** ON
13dd0 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
13de0 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  s this is an err
13df0 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  or. Otherwise, u
13e00 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  se the.         
13e10 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73   ** explicitly s
13e20 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f  pecified behavio
13e30 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ur for the index
13e40 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
13e50 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
13e60 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
13e70 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64  _Default || pInd
13e80 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
13e90 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20  Default) ){.    
13ea0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
13eb0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
13ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13ed0 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e   "conflicting ON
13ee0 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
13ef0 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29  s specified", 0)
13f00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
13f10 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
13f20 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
13f30 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
13f40 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72       pIdx->onErr
13f50 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  or = pIndex->onE
13f60 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
13f70 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
13f80 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
13f90 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
13fa0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
13fb0 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77   /* Link the new
13fc0 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
13fd0 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e   to its table an
13fe0 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20  d to the other. 
13ff0 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   ** in-memory da
14000 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
14010 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  s. .  */.  if( d
14020 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
14030 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
14040 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
14050 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d  hInsert(&pIndex-
14060 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
14070 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  h, .            
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
14090 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  dex->zName, strl
140a0 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  en(pIndex->zName
140b0 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  )+1, pIndex);.  
140c0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
140d0 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64   assert( p==pInd
140e0 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ex );  /* Malloc
140f0 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
14100 64 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20  d */.      goto 
14110 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
14120 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  x;.    }.    db-
14130 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
14140 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
14150 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
14160 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  !=0 ){.      pIn
14170 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e  dex->tnum = db->
14180 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20  init.newTnum;.  
14190 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
141a0 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
141b0 73 79 20 69 73 20 30 20 74 68 65 6e 20 63 72 65  sy is 0 then cre
141c0 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  ate the index on
141d0 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a   disk.  This.  *
141e0 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69  * involves writi
141f0 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  ng the index int
14200 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  o the master tab
14210 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69  le and filling i
14220 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  n the.  ** index
14230 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
14240 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73  t table contents
14250 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
14260 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
14270 20 30 20 77 68 65 6e 20 74 68 65 20 75 73 65 72   0 when the user
14280 20 66 69 72 73 74 20 65 6e 74 65 72 73 20 61 20   first enters a 
14290 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20  CREATE INDEX .  
142a0 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d  ** command.  db-
142b0 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20  >init.busy is 1 
142c0 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  when a database 
142d0 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20  is opened and . 
142e0 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45 58   ** CREATE INDEX
142f0 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
14300 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65 20  read out of the 
14310 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 49  master table.  I
14320 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74 65  n.  ** the latte
14330 72 20 63 61 73 65 20 74 68 65 20 69 6e 64 65 78  r case the index
14340 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
14350 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20 69  on disk, which i
14360 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f  s why.  ** we do
14370 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63 72  n't want to recr
14380 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20  eate it..  **.  
14390 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d  ** If pTblName==
143a0 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
143b0 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74  index is generat
143c0 65 64 20 61 73 20 61 20 70 72 69 6d 61 72 79 20  ed as a primary 
143d0 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51  key.  ** or UNIQ
143e0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66  UE constraint of
143f0 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
14400 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63  statement.  Sinc
14410 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a  e the table.  **
14420 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63   has just been c
14430 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61  reated, it conta
14440 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20  ins no data and 
14450 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61  the index initia
14460 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74  lization.  ** st
14470 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65  ep can be skippe
14480 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  d..  */.  else i
14490 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
144a0 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ==0 ){.    Vdbe 
144b0 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  *v;.    char *zS
144c0 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65  tmt;.    int iMe
144d0 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
144e0 2b 2b 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c  ++;..    v = sql
144f0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
14500 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
14510 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
14520 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20  eate_index;...  
14530 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
14540 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65  rootpage for the
14550 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20   index.    */.  
14560 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
14570 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
14580 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20  rse, 1, iDb);.  
14590 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
145a0 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49  Op(v, OP_CreateI
145b0 6e 64 65 78 2c 20 69 44 62 2c 20 30 29 3b 0a 20  ndex, iDb, 0);. 
145c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
145d0 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
145e0 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 0a 20  re, iMem, 0);.. 
145f0 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65     /* Gather the
14600 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
14610 66 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44  f the CREATE IND
14620 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74  EX statement int
14630 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74  o.    ** the zSt
14640 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  mt variable.    
14650 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61 72  */.    if( pStar
14660 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20  t && pEnd ){.   
14670 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e     /* A named in
14680 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c  dex with an expl
14690 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44 45  icit CREATE INDE
146a0 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  X statement */. 
146b0 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c       zStmt = sql
146c0 69 74 65 33 4d 50 72 69 6e 74 66 28 22 43 52 45  ite3MPrintf("CRE
146d0 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73  ATE%s INDEX %.*s
146e0 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72  ",.        onErr
146f0 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22  or==OE_None ? ""
14700 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a 20 20   : " UNIQUE",.  
14710 20 20 20 20 20 20 70 45 6e 64 2d 3e 7a 20 2d 20        pEnd->z - 
14720 70 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c 0a 20 20  pName->z + 1,.  
14730 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b        pName->z);
14740 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14750 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69    /* An automati
14760 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20  c index created 
14770 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  by a PRIMARY KEY
14780 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
14790 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f  raint */.      /
147a0 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  * zStmt = sqlite
147b0 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f  3MPrintf(""); */
147c0 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30  .      zStmt = 0
147d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
147e0 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  Add an entry in 
147f0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f  sqlite_master fo
14800 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20  r this index.   
14810 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
14820 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
14830 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53  e, .        "INS
14840 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56  ERT INTO %Q.%s V
14850 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51  ALUES('index',%Q
14860 2c 25 51 2c 23 30 2c 25 51 29 3b 22 2c 0a 20 20  ,%Q,#0,%Q);",.  
14870 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
14880 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
14890 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
148a0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
148b0 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  me,.        pTab
148c0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
148d0 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20   zStmt.    );.  
148e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
148f0 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
14900 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46   0);.    sqliteF
14910 72 65 65 28 7a 53 74 6d 74 29 3b 0a 0a 20 20 20  ree(zStmt);..   
14920 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64   /* Fill the ind
14930 65 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64  ex with data and
14940 20 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68   reparse the sch
14950 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f  ema. Code an OP_
14960 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f  Expire.    ** to
14970 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
14980 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61  pre-compiled sta
14990 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a  tements..    */.
149a0 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
149b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
149c0 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
149d0 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65  rse, pIndex, iMe
149e0 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
149f0 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  3ChangeCookie(db
14a00 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  , v, iDb);.     
14a10 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
14a20 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  v, OP_ParseSchem
14a30 61 2c 20 69 44 62 2c 20 30 2c 0a 20 20 20 20 20  a, iDb, 0,.     
14a40 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
14a50 74 66 28 22 6e 61 6d 65 3d 27 25 71 27 22 2c 20  tf("name='%q'", 
14a60 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20  pIndex->zName), 
14a70 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P3_DYNAMIC);.   
14a80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14a90 64 4f 70 28 76 2c 20 4f 50 5f 45 78 70 69 72 65  dOp(v, OP_Expire
14aa0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
14ab0 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64   }..  /* When ad
14ac0 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f  ding an index to
14ad0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64   the list of ind
14ae0 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ices for a table
14af0 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  , make.  ** sure
14b00 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62   all indices lab
14b10 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20  eled OE_Replace 
14b20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74  come after all t
14b30 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a  hose labeled.  *
14b40 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68  * OE_Ignore.  Th
14b50 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
14b60 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20  for the correct 
14b70 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44  operation of UPD
14b80 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53  ATE.  ** and INS
14b90 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ERT..  */.  if( 
14ba0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
14bb0 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a   pTblName==0 ){.
14bc0 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21      if( onError!
14bd0 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70  =OE_Replace || p
14be0 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20  Tab->pIndex==0. 
14bf0 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d          || pTab-
14c00 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  >pIndex->onError
14c10 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20  ==OE_Replace){. 
14c20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
14c30 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  xt = pTab->pInde
14c40 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70  x;.      pTab->p
14c50 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
14c60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14c70 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d   Index *pOther =
14c80 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
14c90 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68       while( pOth
14ca0 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74  er->pNext && pOt
14cb0 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72  her->pNext->onEr
14cc0 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
14cd0 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65  ){.        pOthe
14ce0 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  r = pOther->pNex
14cf0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
14d00 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
14d10 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
14d20 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e        pOther->pN
14d30 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  ext = pIndex;.  
14d40 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20 3d    }.    pIndex =
14d50 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c   0;.  }..  /* Cl
14d60 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78  ean up before ex
14d70 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72  iting */.exit_cr
14d80 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66  eate_index:.  if
14d90 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
14da0 66 72 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78  freeIndex(pIndex
14db0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
14dc0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
14dd0 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
14de0 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54  SrcListDelete(pT
14df0 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  blName);.  sqlit
14e00 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
14e10 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
14e20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
14e30 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
14e40 66 69 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62  file format numb
14e50 65 72 20 69 73 20 61 74 20 6c 65 61 73 74 20 6d  er is at least m
14e60 69 6e 46 6f 72 6d 61 74 2e 0a 2a 2a 20 54 68 65  inFormat..** The
14e70 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20   generated code 
14e80 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74 68  will increase th
14e90 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 6e 75  e file format nu
14ea0 6d 62 65 72 20 69 66 20 6e 65 63 65 73 73 61 72  mber if necessar
14eb0 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
14ec0 65 33 4d 69 6e 69 6d 75 6d 46 69 6c 65 46 6f 72  e3MinimumFileFor
14ed0 6d 61 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  mat(Parse *pPars
14ee0 65 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  e, int iDb, int 
14ef0 6d 69 6e 46 6f 72 6d 61 74 29 7b 0a 20 20 56 64  minFormat){.  Vd
14f00 62 65 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c  be *v;.  v = sql
14f10 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
14f20 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
14f30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14f40 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64 43  ddOp(v, OP_ReadC
14f50 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a  ookie, iDb, 1);.
14f60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14f70 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
14f80 65 72 2c 20 6d 69 6e 46 6f 72 6d 61 74 2c 20 30  er, minFormat, 0
14f90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14fa0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 65  beAddOp(v, OP_Ge
14fb0 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65  , 0, sqlite3Vdbe
14fc0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
14fd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14fe0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
14ff0 74 65 67 65 72 2c 20 6d 69 6e 46 6f 72 6d 61 74  teger, minFormat
15000 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
15010 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15020 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
15030 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   1);.  }.}../*.*
15040 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78  * Fill the Index
15050 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61  .aiRowEst[] arra
15060 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69  y with default i
15070 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66  nformation - inf
15080 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  ormation.** to b
15090 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68  e used when we h
150a0 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20  ave not run the 
150b0 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e  ANALYZE command.
150c0 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b  .**.** aiRowEst[
150d0 30 5d 20 69 73 20 73 75 70 70 6f 73 65 20 74 6f  0] is suppose to
150e0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
150f0 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
15100 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  in the index..**
15110 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74   Since we do not
15120 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d   know, guess 1 m
15130 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73  illion.  aiRowEs
15140 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[1] is an estim
15150 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75  ate of the.** nu
15160 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
15170 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d  the table that m
15180 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
15190 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65  lar value of the
151a0 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  .** first column
151b0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
151c0 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61  aiRowEst[2] is a
151d0 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
151e0 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72  e number.** of r
151f0 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  ows that match a
15200 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f  ny particular co
15210 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74 68  mbiniation of th
15220 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e  e first 2 column
15230 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65  s.** of the inde
15240 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  x.  And so forth
15250 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79  .  It must alway
15260 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  s be the case th
15270 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  at.*.**         
15280 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61    aiRowEst[N]<=a
15290 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20  iRowEst[N-1].** 
152a0 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45            aiRowE
152b0 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41  st[N]>=1.**.** A
152c0 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20  part from that, 
152d0 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74  we have little t
152e0 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20  o go on besides 
152f0 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a  intuition as to.
15300 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b  ** how aiRowEst[
15310 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74  ] should be init
15320 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75  ialized.  The nu
15330 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20  mbers generated 
15340 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65  here.** are base
15350 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c  d on typical val
15360 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74  ues found in act
15370 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a  ual indices..*/.
15380 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61  void sqlite3Defa
15390 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20  ultRowEst(Index 
153a0 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e  *pIdx){.  unsign
153b0 65 64 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69  ed *a = pIdx->ai
153c0 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b  RowEst;.  int i;
153d0 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d 30 20  .  assert( a!=0 
153e0 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 31 30 30 30  );.  a[0] = 1000
153f0 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d 70 49 64  000;.  for(i=pId
15400 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d 35  x->nColumn; i>=5
15410 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 61 5b 69 5d  ; i--){.    a[i]
15420 20 3d 20 35 3b 0a 20 20 7d 0a 20 20 77 68 69 6c   = 5;.  }.  whil
15430 65 28 20 69 3e 3d 31 20 29 7b 0a 20 20 20 20 61  e( i>=1 ){.    a
15440 5b 69 5d 20 3d 20 31 31 20 2d 20 69 3b 0a 20 20  [i] = 11 - i;.  
15450 20 20 69 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28    i--;.  }.  if(
15460 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
15470 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61  OE_None ){.    a
15480 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20  [pIdx->nColumn] 
15490 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
154a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
154b0 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73  ill drop an exis
154c0 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78  ting named index
154d0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
154e0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** implements th
154f0 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61  e DROP INDEX sta
15500 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
15510 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78  sqlite3DropIndex
15520 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15530 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
15540 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20  int ifExists){. 
15550 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
15560 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
15570 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
15580 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
15590 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
155a0 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
155b0 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
155c0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
155d0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
155e0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
155f0 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66  >nSrc==1 );.  if
15600 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
15610 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
15620 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f  Parse) ){.    go
15630 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
15640 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  ex;.  }.  pIndex
15650 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
15660 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61  dex(db, pName->a
15670 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  [0].zName, pName
15680 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
15690 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d  );.  if( pIndex=
156a0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69  =0 ){.    if( !i
156b0 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20  fExists ){.     
156c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
156d0 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
156e0 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e  h index: %S", pN
156f0 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ame, 0);.    }. 
15700 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
15710 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
15720 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
15730 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
15740 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65  pIndex->autoInde
15750 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
15760 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15770 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74   "index associat
15780 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22  ed with UNIQUE "
15790 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41  .      "or PRIMA
157a0 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
157b0 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  t cannot be drop
157c0 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f  ped", 0);.    go
157d0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
157e0 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  ex;.  }.  iDb = 
157f0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
15800 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d  ndex(db, pIndex-
15810 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64  >pSchema);.#ifnd
15820 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
15830 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
15840 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20  .    int code = 
15850 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45  SQLITE_DROP_INDE
15860 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  X;.    Table *pT
15870 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
15880 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ble;.    const c
15890 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
158a0 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
158b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
158c0 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
158d0 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28  LE(iDb);.    if(
158e0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
158f0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
15900 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
15910 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
15920 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
15930 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
15940 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
15950 20 26 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d   && iDb ) code =
15960 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
15970 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
15980 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
15990 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
159a0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70  pIndex->zName, p
159b0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
159c0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
159d0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
159e0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
159f0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
15a00 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
15a10 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f  he index and fro
15a20 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
15a30 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  le */.  v = sqli
15a40 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
15a50 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
15a60 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
15a70 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
15a80 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
15a90 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61  M %Q.%s WHERE na
15aa0 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 64  me=%Q",.       d
15ab0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
15ac0 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
15ad0 69 44 62 29 2c 0a 20 20 20 20 20 20 20 70 49 6e  iDb),.       pIn
15ae0 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  dex->zName.    )
15af0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
15b00 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c  ngeCookie(db, v,
15b10 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72   iDb);.    destr
15b20 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
15b30 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  e, pIndex->tnum,
15b40 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
15b50 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
15b60 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20  DropIndex, iDb, 
15b70 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  0, pIndex->zName
15b80 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  , 0);.  }..exit_
15b90 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71  drop_index:.  sq
15ba0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
15bb0 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  te(pName);.}../*
15bc0 0a 2a 2a 20 70 70 41 72 72 61 79 20 70 6f 69 6e  .** ppArray poin
15bd0 74 73 20 69 6e 74 6f 20 61 20 73 74 72 75 63 74  ts into a struct
15be0 75 72 65 20 77 68 65 72 65 20 74 68 65 72 65 20  ure where there 
15bf0 69 73 20 61 6e 20 61 72 72 61 79 20 70 6f 69 6e  is an array poin
15c00 74 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20  ter.** followed 
15c10 62 79 20 74 77 6f 20 69 6e 74 65 67 65 72 73 2e  by two integers.
15c20 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67   The first integ
15c30 65 72 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d  er is the.** num
15c40 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
15c50 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  in the structure
15c60 20 61 72 72 61 79 2e 20 20 54 68 65 20 73 65 63   array.  The sec
15c70 6f 6e 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69  ond integer.** i
15c80 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
15c90 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20  allocated slots 
15ca0 69 6e 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a  in the array..**
15cb0 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
15cc0 64 73 2c 20 74 68 65 20 73 74 72 75 63 74 75 72  ds, the structur
15cd0 65 20 6c 6f 6f 6b 73 20 73 6f 6d 65 74 68 69 6e  e looks somethin
15ce0 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  g like this:.**.
15cf0 2a 2a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  **        struct
15d00 20 45 78 61 6d 70 6c 65 31 20 7b 0a 2a 2a 20 20   Example1 {.**  
15d10 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
15d20 75 62 45 6c 65 6d 20 2a 61 45 6e 74 72 79 3b 0a  ubElem *aEntry;.
15d30 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  **          int 
15d40 6e 45 6e 74 72 79 3b 0a 2a 2a 20 20 20 20 20 20  nEntry;.**      
15d50 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 0a      int nAlloc;.
15d60 2a 2a 20 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a  **        }.**.*
15d70 2a 20 54 68 65 20 70 6e 45 6e 74 72 79 20 70 61  * The pnEntry pa
15d80 72 61 6d 65 74 65 72 20 70 6f 69 6e 74 73 20 74  rameter points t
15d90 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  o the equivalent
15da0 20 6f 66 20 45 78 61 6d 70 6c 65 31 2e 6e 45 6e   of Example1.nEn
15db0 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
15dc0 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65  routine allocate
15dd0 73 20 61 20 6e 65 77 20 73 6c 6f 74 20 69 6e 20  s a new slot in 
15de0 74 68 65 20 61 72 72 61 79 2c 20 7a 65 72 6f 73  the array, zeros
15df0 20 69 74 20 6f 75 74 2c 0a 2a 2a 20 61 6e 64 20   it out,.** and 
15e00 72 65 74 75 72 6e 73 20 69 74 73 20 69 6e 64 65  returns its inde
15e10 78 2e 20 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61  x.  If malloc fa
15e20 69 6c 73 20 61 20 6e 65 67 61 74 69 76 65 20 6e  ils a negative n
15e30 75 6d 62 65 72 20 69 73 20 72 65 74 75 72 6e 65  umber is returne
15e40 64 2e 0a 2a 2a 0a 2a 2a 20 73 7a 45 6e 74 72 79  d..**.** szEntry
15e50 20 69 73 20 74 68 65 20 73 69 7a 65 6f 66 20 6f   is the sizeof o
15e60 66 20 61 20 73 69 6e 67 6c 65 20 61 72 72 61 79  f a single array
15e70 20 65 6e 74 72 79 2e 20 20 69 6e 69 74 53 69 7a   entry.  initSiz
15e80 65 20 69 73 20 74 68 65 20 0a 2a 2a 20 6e 75 6d  e is the .** num
15e90 62 65 72 20 6f 66 20 61 72 72 61 79 20 65 6e 74  ber of array ent
15ea0 72 69 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f  ries allocated o
15eb0 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 20 61 6c  n the initial al
15ec0 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  location..*/.int
15ed0 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
15ee0 6f 63 61 74 65 28 76 6f 69 64 20 2a 2a 70 70 41  ocate(void **ppA
15ef0 72 72 61 79 2c 20 69 6e 74 20 73 7a 45 6e 74 72  rray, int szEntr
15f00 79 2c 20 69 6e 74 20 69 6e 69 74 53 69 7a 65 29  y, int initSize)
15f10 7b 0a 20 20 63 68 61 72 20 2a 70 3b 0a 20 20 69  {.  char *p;.  i
15f20 6e 74 20 2a 61 6e 20 3d 20 28 69 6e 74 2a 29 26  nt *an = (int*)&
15f30 70 70 41 72 72 61 79 5b 31 5d 3b 0a 20 20 69 66  ppArray[1];.  if
15f40 28 20 61 6e 5b 30 5d 3e 3d 61 6e 5b 31 5d 20 29  ( an[0]>=an[1] )
15f50 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77  {.    void *pNew
15f60 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77 53 69 7a  ;.    int newSiz
15f70 65 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d  e;.    newSize =
15f80 20 61 6e 5b 31 5d 2a 32 20 2b 20 69 6e 69 74 53   an[1]*2 + initS
15f90 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  ize;.    pNew = 
15fa0 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 2a 70  sqliteRealloc(*p
15fb0 70 41 72 72 61 79 2c 20 6e 65 77 53 69 7a 65 2a  pArray, newSize*
15fc0 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66  szEntry);.    if
15fd0 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
15fe0 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
15ff0 20 20 7d 0a 20 20 20 20 61 6e 5b 31 5d 20 3d 20    }.    an[1] = 
16000 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2a 70 70  newSize;.    *pp
16010 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20  Array = pNew;.  
16020 7d 0a 20 20 70 20 3d 20 2a 70 70 41 72 72 61 79  }.  p = *ppArray
16030 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 5b 61 6e  ;.  memset(&p[an
16040 5b 30 5d 2a 73 7a 45 6e 74 72 79 5d 2c 20 30 2c  [0]*szEntry], 0,
16050 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 72 65 74   szEntry);.  ret
16060 75 72 6e 20 61 6e 5b 30 5d 2b 2b 3b 0a 7d 0a 0a  urn an[0]++;.}..
16070 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
16080 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
16090 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20  e given IdList. 
160a0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64   Create a new Id
160b0 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
160c0 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  be..**.** A new 
160d0 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  IdList is return
160e0 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
160f0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
16100 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  /.IdList *sqlite
16110 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64  3IdListAppend(Id
16120 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
16130 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69  en *pToken){.  i
16140 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
16150 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
16160 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
16170 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29  ( sizeof(IdList)
16180 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
16190 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
161a0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
161b0 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 20  oc = 0;.  }.  i 
161c0 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
161d0 6c 6f 63 61 74 65 28 28 76 6f 69 64 2a 2a 29 26  locate((void**)&
161e0 70 4c 69 73 74 2d 3e 61 2c 20 73 69 7a 65 6f 66  pList->a, sizeof
161f0 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 20 35  (pList->a[0]), 5
16200 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  );.  if( i<0 ){.
16210 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
16220 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
16230 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
16240 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  }.  pList->a[i].
16250 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
16260 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f  ameFromToken(pTo
16270 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ken);.  return p
16280 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  List;.}../*.** D
16290 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e  elete an IdList.
162a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
162b0 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64 4c  IdListDelete(IdL
162c0 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
162d0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
162e0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
162f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
16300 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
16310 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
16320 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
16330 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
16340 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  e(pList->a);.  s
16350 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 29  qliteFree(pList)
16360 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
16370 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70  n the index in p
16380 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e  List of the iden
16390 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64  tifier named zId
163a0 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20  .  Return -1.** 
163b0 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
163c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69  .int sqlite3IdLi
163d0 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a  stIndex(IdList *
163e0 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61  pList, const cha
163f0 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
16400 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
16410 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  =0 ) return -1;.
16420 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
16430 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
16440 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
16450 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
16460 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ].zName, zName)=
16470 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
16480 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
16490 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
164a0 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  a new table name
164b0 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72   to the given Sr
164c0 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  cList.  Create a
164d0 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a   new SrcList if.
164e0 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e  ** need be.  A n
164f0 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65 61  ew entry is crea
16500 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69  ted in the SrcLi
16510 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b 65  st even if pToke
16520 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n is NULL..**.**
16530 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   A new SrcList i
16540 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
16550 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  ULL if malloc() 
16560 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  fails..**.** If 
16570 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74  pDatabase is not
16580 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20   null, it means 
16590 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68  that the table h
165a0 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a  as an optional.*
165b0 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * database name 
165c0 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68  prefix.  Like th
165d0 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74  is:  "database.t
165e0 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74  able".  The pDat
165f0 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20  abase.** points 
16600 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  to the table nam
16610 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65  e and the pTable
16620 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64   points to the d
16630 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a  atabase name..**
16640 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d   The SrcList.a[]
16650 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20  .zName field is 
16660 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
16670 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68  table name which
16680 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66   might.** come f
16690 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70  rom pTable (if p
166a0 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c  Database is NULL
166b0 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62  ) or from pDatab
166c0 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73  ase.  .** SrcLis
166d0 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20  t.a[].zDatabase 
166e0 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
166f0 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
16700 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a   from pTable,.**
16710 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66   or with NULL if
16720 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20   no database is 
16730 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
16740 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
16750 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68   if call like th
16760 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
16770 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
16780 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a  Append(A,B,0);.*
16790 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61  *.** Then B is a
167a0 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
167b0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
167c0 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64  e is unspecified
167d0 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20  .  If called.** 
167e0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
167f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16800 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c  SrcListAppend(A,
16810 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,C);.**.** Then
16820 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20   C is the table 
16830 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68  name and B is th
16840 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
16850 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
16860 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
16870 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  d(SrcList *pList
16880 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c  , Token *pTable,
16890 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73   Token *pDatabas
168a0 65 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63  e){.  struct Src
168b0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
168c0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
168d0 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
168e0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
168f0 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b  zeof(SrcList) );
16900 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
16910 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
16920 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
16930 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 1;.  }.  if( p
16940 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73  List->nSrc>=pLis
16950 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  t->nAlloc ){.   
16960 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
16970 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
16980 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65 77  c *= 2;.    pNew
16990 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
169a0 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20 20 20  (pList,.        
169b0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
169c0 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74 2d 3e  List) + (pList->
169d0 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66  nAlloc-1)*sizeof
169e0 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b  (pList->a[0]) );
169f0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
16a00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16a10 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
16a20 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
16a30 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
16a40 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20   pList = pNew;. 
16a50 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c   }.  pItem = &pL
16a60 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
16a70 72 63 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  rc];.  memset(pI
16a80 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  tem, 0, sizeof(p
16a90 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
16aa0 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26  if( pDatabase &&
16ab0 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30   pDatabase->z==0
16ac0 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73   ){.    pDatabas
16ad0 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
16ae0 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 54   pDatabase && pT
16af0 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65  able ){.    Toke
16b00 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61  n *pTemp = pData
16b10 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62  base;.    pDatab
16b20 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ase = pTable;.  
16b30 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70    pTable = pTemp
16b40 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a  ;.  }.  pItem->z
16b50 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
16b60 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62  meFromToken(pTab
16b70 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44  le);.  pItem->zD
16b80 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
16b90 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
16ba0 44 61 74 61 62 61 73 65 29 3b 0a 20 20 70 49 74  Database);.  pIt
16bb0 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 2d 31  em->iCursor = -1
16bc0 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70  ;.  pItem->isPop
16bd0 75 6c 61 74 65 64 20 3d 20 30 3b 0a 20 20 70 4c  ulated = 0;.  pL
16be0 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72  ist->nSrc++;.  r
16bf0 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
16c00 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75 72  /*.** Assign cur
16c10 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c  sors to all tabl
16c20 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a  es in a SrcList.
16c30 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
16c40 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
16c50 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ors(Parse *pPars
16c60 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  e, SrcList *pLis
16c70 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
16c80 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
16c90 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73  em *pItem;.  ass
16ca0 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 73 71 6c  ert(pList || sql
16cb0 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64  ite3MallocFailed
16cc0 28 29 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  () );.  if( pLis
16cd0 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
16ce0 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
16cf0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
16d00 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
16d10 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
16d20 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72  >iCursor>=0 ) br
16d30 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  eak;.      pItem
16d40 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72  ->iCursor = pPar
16d50 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
16d60 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
16d70 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
16d80 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
16d90 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
16da0 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  se, pItem->pSele
16db0 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20  ct->pSrc);.     
16dc0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
16dd0 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69  /*.** Add an ali
16de0 61 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 69  as to the last i
16df0 64 65 6e 74 69 66 69 65 72 20 6f 6e 20 74 68 65  dentifier on the
16e00 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66 69 65   given identifie
16e10 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  r list..*/.void 
16e20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 64  sqlite3SrcListAd
16e30 64 41 6c 69 61 73 28 53 72 63 4c 69 73 74 20 2a  dAlias(SrcList *
16e40 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
16e50 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69  oken){.  if( pLi
16e60 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53 72  st && pList->nSr
16e70 63 3e 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  c>0 ){.    pList
16e80 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d  ->a[pList->nSrc-
16e90 31 5d 2e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  1].zAlias = sqli
16ea0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
16eb0 28 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 7d 0a  (pToken);.  }.}.
16ec0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
16ed0 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20   entire SrcList 
16ee0 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74  including all it
16ef0 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a  s substructure..
16f00 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
16f10 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53 72 63  rcListDelete(Src
16f20 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
16f30 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
16f40 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
16f50 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  tem;.  if( pList
16f60 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
16f70 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
16f80 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
16f90 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
16fa0 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  em++){.    sqlit
16fb0 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 44 61  eFree(pItem->zDa
16fc0 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
16fd0 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a  iteFree(pItem->z
16fe0 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
16ff0 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 41 6c  eFree(pItem->zAl
17000 69 61 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ias);.    sqlite
17010 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  3DeleteTable(0, 
17020 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  pItem->pTab);.  
17030 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
17040 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 53 65  elete(pItem->pSe
17050 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  lect);.    sqlit
17060 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 49 74  e3ExprDelete(pIt
17070 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71  em->pOn);.    sq
17080 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
17090 65 28 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29  e(pItem->pUsing)
170a0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
170b0 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  ee(pList);.}../*
170c0 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e  .** Begin a tran
170d0 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
170e0 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e  sqlite3BeginTran
170f0 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
17100 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29  Parse, int type)
17110 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
17120 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
17130 74 20 69 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  t i;..  if( pPar
17140 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
17150 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
17160 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
17170 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
17180 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
17190 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61   sqlite3MallocFa
171a0 69 6c 65 64 28 29 20 29 20 72 65 74 75 72 6e 3b  iled() ) return;
171b0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
171c0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
171d0 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
171e0 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  ON, "BEGIN", 0, 
171f0 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
17200 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
17210 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
17220 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !v ) return;. 
17230 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45   if( type!=TK_DE
17240 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f  FERRED ){.    fo
17250 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
17260 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
17270 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
17280 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  , OP_Transaction
17290 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45  , i, (type==TK_E
172a0 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20  XCLUSIVE)+1);.  
172b0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
172c0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
172d0 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20  _AutoCommit, 0, 
172e0 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  0);.}../*.** Com
172f0 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  mit a transactio
17300 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
17310 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69  3CommitTransacti
17320 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
17330 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
17340 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
17350 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
17360 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
17370 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
17380 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
17390 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
173a0 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
173b0 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
173c0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
173d0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
173e0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
173f0 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d  RANSACTION, "COM
17400 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 20 72 65  MIT", 0, 0) ) re
17410 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  turn;..  v = sql
17420 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
17430 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
17440 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17450 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43  ddOp(v, OP_AutoC
17460 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20  ommit, 1, 0);.  
17470 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  }.}../*.** Rollb
17480 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
17490 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
174a0 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63  3RollbackTransac
174b0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
174c0 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se){.  sqlite3 *
174d0 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  db;.  Vdbe *v;..
174e0 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
174f0 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
17500 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62  b)==0 || db->aDb
17510 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
17520 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
17530 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
17540 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
17550 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
17560 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
17570 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
17580 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52  _TRANSACTION, "R
17590 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20  OLLBACK", 0, 0) 
175a0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d  ) return;..  v =
175b0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
175c0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
175d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
175e0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
175f0 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29  utoCommit, 1, 1)
17600 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
17610 61 6b 65 20 73 75 72 65 20 74 68 65 20 54 45 4d  ake sure the TEM
17620 50 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  P database is op
17630 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65  en and available
17640 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72   for use.  Retur
17650 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  n.** the number 
17660 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76  of errors.  Leav
17670 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
17680 61 67 65 73 20 69 6e 20 74 68 65 20 70 50 61 72  ages in the pPar
17690 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
176a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e  .int sqlite3Open
176b0 54 65 6d 70 44 61 74 61 62 61 73 65 28 50 61 72  TempDatabase(Par
176c0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
176d0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
176e0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
176f0 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30  b->aDb[1].pBt==0
17700 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70   && !pParse->exp
17710 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  lain ){.    int 
17720 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
17730 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30 2c 20  eFactory(db, 0, 
17740 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 26 64  0, MAX_PAGES, &d
17750 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a  b->aDb[1].pBt);.
17760 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17770 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
17780 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
17790 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
177a0 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
177b0 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20  ry database ".  
177c0 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20        "file for 
177d0 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72  storing temporar
177e0 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20  y tables");.    
177f0 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72    pParse->rc = r
17800 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  c;.      return 
17810 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
17820 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 21 64 62   db->flags & !db
17830 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a  ->autoCommit ){.
17840 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
17850 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
17860 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  s(db->aDb[1].pBt
17870 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
17880 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17890 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
178a0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
178b0 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20   "unable to get 
178c0 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  a write lock on 
178d0 22 0a 20 20 20 20 20 20 20 20 20 20 22 74 68 65  ".          "the
178e0 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
178f0 61 73 65 20 66 69 6c 65 22 29 3b 0a 20 20 20 20  ase file");.    
17900 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
17910 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 65 74   rc;.        ret
17920 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
17930 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
17940 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
17950 65 6d 61 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ema );.  }.  ret
17960 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
17970 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
17980 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72  de that will ver
17990 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
179a0 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a  ookie and start.
179b0 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  ** a read-transa
179c0 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61  ction for all na
179d0 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
179e0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  es..**.** It is 
179f0 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
17a00 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  ll schema cookie
17a10 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e  s be verified an
17a20 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72  d all.** read tr
17a30 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74  ansactions be st
17a40 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79  arted before any
17a50 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65  thing else happe
17a60 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42  ns in.** the VDB
17a70 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20  E program.  But 
17a80 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
17a90 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
17aa0 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63   much other.** c
17ab0 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e  ode has been gen
17ac0 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65  erated.  So here
17ad0 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a   is what we do:.
17ae0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
17af0 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
17b00 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20  e is called, we 
17b10 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20  code an OP_Goto 
17b20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d  that.** will jum
17b30 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e  p to a subroutin
17b40 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
17b50 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68  the program.  Th
17b60 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20  en we.** record 
17b70 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74  every database t
17b80 68 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63  hat needs its sc
17b90 68 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e  hema verified in
17ba0 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e   the.** pParse->
17bb0 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64  cookieMask field
17bc0 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20  .  Later, after 
17bd0 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68  all other code h
17be0 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72  as been.** gener
17bf0 61 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75  ated, the subrou
17c00 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74  tine that does t
17c10 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
17c20 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73  cations and.** s
17c30 74 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61  tarts the transa
17c40 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63  ctions will be c
17c50 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f  oded and the OP_
17c60 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a  Goto P2 value.**
17c70 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
17c80 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73   point to that s
17c90 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
17ca0 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68  generation of th
17cb0 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69  e.** cookie veri
17cc0 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74  fication subrout
17cd0 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73  ine code happens
17ce0 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73   in sqlite3Finis
17cf0 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a  hCoding()..**.**
17d00 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63   If iDb<0 then c
17d10 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20  ode the OP_Goto 
17d20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74  only - don't set
17d30 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20   flag to verify 
17d40 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e  the.** schema on
17d50 20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20   any databases. 
17d60 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
17d70 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68  d to position th
17d80 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72  e OP_Goto.** ear
17d90 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20  ly in the code, 
17da0 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69  before we know i
17db0 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74  f any database t
17dc0 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73  ables will be us
17dd0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
17de0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
17df0 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
17e00 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73  e, int iDb){.  s
17e10 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
17e20 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73  be *v;.  int mas
17e30 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  k;..  v = sqlite
17e40 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
17e50 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
17e60 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20  eturn;  /* This 
17e70 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20  only happens if 
17e80 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f  there was a prio
17e90 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20  r error */.  db 
17ea0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
17eb0 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  if( pParse->cook
17ec0 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20  ieGoto==0 ){.   
17ed0 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
17ee0 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oto = sqlite3Vdb
17ef0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
17f00 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a  o, 0, 0)+1;.  }.
17f10 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a    if( iDb>=0 ){.
17f20 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c      assert( iDb<
17f30 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61  db->nDb );.    a
17f40 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69  ssert( db->aDb[i
17f50 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44  Db].pBt!=0 || iD
17f60 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  b==1 );.    asse
17f70 72 74 28 20 69 44 62 3c 4d 41 58 5f 41 54 54 41  rt( iDb<MAX_ATTA
17f80 43 48 45 44 2b 32 20 29 3b 0a 20 20 20 20 6d 61  CHED+2 );.    ma
17f90 73 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 20  sk = 1<<iDb;.   
17fa0 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 63 6f   if( (pParse->co
17fb0 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29  okieMask & mask)
17fc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
17fd0 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
17fe0 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  |= mask;.      p
17ff0 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c  Parse->cookieVal
18000 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44  ue[iDb] = db->aD
18010 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
18020 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20  schema_cookie;. 
18030 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
18040 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
18050 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18060 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
18070 73 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  se(pParse);.    
18080 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
18090 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
180a0 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70  VDBE code that p
180b0 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e  repares for doin
180c0 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74  g an operation t
180d0 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
180e0 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nge the database
180f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
18100 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65  tine starts a ne
18110 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  w transaction if
18120 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
18130 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20  ady within.** a 
18140 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
18150 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
18160 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
18170 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65  tion, then a che
18180 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65  ckpoint.** is se
18190 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74  t if the setStat
181a0 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ement parameter 
181b0 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63  is true.  A chec
181c0 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a  kpoint should.**
181d0 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72   be set for oper
181e0 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68  ations that migh
181f0 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61  t fail (due to a
18200 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72   constraint) par
18210 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20  t of.** the way 
18220 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63  through and whic
18230 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75  h will need to u
18240 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20  ndo some writes 
18250 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
18260 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68  o.** rollback th
18270 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74  e whole transact
18280 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74  ion.  For operat
18290 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63  ions where all c
182a0 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61  onstraints.** ca
182b0 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66  n be checked bef
182c0 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ore any changes 
182d0 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
182e0 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20  database, it is 
182f0 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61  never.** necessa
18300 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69  ry to undo a wri
18310 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  te and the check
18320 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74  point should not
18330 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f   be set..**.** O
18340 6e 6c 79 20 64 61 74 61 62 61 73 65 20 69 44 62  nly database iDb
18350 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61   and the temp da
18360 74 61 62 61 73 65 20 61 72 65 20 6d 61 64 65 20  tabase are made 
18370 77 72 69 74 61 62 6c 65 20 62 79 20 74 68 69 73  writable by this
18380 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62   call..** If iDb
18390 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 6d 61  ==0, then the ma
183a0 69 6e 20 61 6e 64 20 74 65 6d 70 20 64 61 74 61  in and temp data
183b0 62 61 73 65 73 20 61 72 65 20 6d 61 64 65 20 77  bases are made w
183c0 72 69 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a  ritable.   If.**
183d0 20 69 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c   iDb==1 then onl
183e0 79 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  y the temp datab
183f0 61 73 65 20 69 73 20 6d 61 64 65 20 77 72 69 74  ase is made writ
18400 61 62 6c 65 2e 20 20 49 66 20 69 44 62 3e 31 20  able.  If iDb>1 
18410 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63  then the.** spec
18420 69 66 69 65 64 20 61 75 78 69 6c 69 61 72 79 20  ified auxiliary 
18430 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65  database and the
18440 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 61   temp database a
18450 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  re made writable
18460 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18470 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
18480 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
18490 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65  se, int setState
184a0 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a  ment, int iDb){.
184b0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
184c0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
184d0 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
184e0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
184f0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
18500 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
18510 0a 20 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65  .  pParse->write
18520 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a  Mask |= 1<<iDb;.
18530 20 20 69 66 28 20 73 65 74 53 74 61 74 65 6d 65    if( setStateme
18540 6e 74 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65  nt && pParse->ne
18550 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73  sted==0 ){.    s
18560 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
18570 76 2c 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 2c  v, OP_Statement,
18580 20 69 44 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20   iDb, 0);.  }.  
18590 69 66 28 20 28 4f 4d 49 54 5f 54 45 4d 50 44 42  if( (OMIT_TEMPDB
185a0 20 7c 7c 20 69 44 62 21 3d 31 29 20 26 26 20 70   || iDb!=1) && p
185b0 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31  Parse->db->aDb[1
185c0 5d 2e 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20  ].pBt!=0 ){.    
185d0 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
185e0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
185f0 65 2c 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c  e, setStatement,
18600 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   1);.  }.}../*.*
18610 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
18620 66 20 70 49 6e 64 65 78 20 75 73 65 73 20 74 68  f pIndex uses th
18630 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
18640 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74  ence pColl.  Ret
18650 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69  urn.** true if i
18660 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65  t does and false
18670 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   if it does not.
18680 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
18690 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
186a0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61  static int colla
186b0 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20  tionMatch(const 
186c0 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64  char *zColl, Ind
186d0 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69  ex *pIndex){.  i
186e0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
186f0 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   i<pIndex->nColu
18700 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  mn; i++){.    co
18710 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49  nst char *z = pI
18720 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b  ndex->azColl[i];
18730 0a 20 20 20 20 69 66 28 20 7a 3d 3d 7a 43 6f 6c  .    if( z==zCol
18740 6c 20 7c 7c 20 28 7a 20 26 26 20 7a 43 6f 6c 6c  l || (z && zColl
18750 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
18760 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 29  rICmp(z, zColl))
18770 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
18780 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
18790 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
187a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70  if../*.** Recomp
187b0 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
187c0 6f 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65  of pTab that use
187d0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
187e0 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a  equence pColl..*
187f0 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68  * If pColl==0 th
18800 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c  en recompute all
18810 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62   indices of pTab
18820 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
18830 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
18840 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69  .static void rei
18850 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20  ndexTable(Parse 
18860 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
18870 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74  pTab, char const
18880 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65   *zColl){.  Inde
18890 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
188a0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
188b0 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
188c0 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66  ith pTab */..  f
188d0 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e  or(pIndex=pTab->
188e0 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
188f0 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70  pIndex=pIndex->p
18900 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a  Next){.    if( z
18910 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61  Coll==0 || colla
18920 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c  tionMatch(zColl,
18930 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20   pIndex) ){.    
18940 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
18950 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
18960 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
18970 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
18980 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
18990 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
189a0 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
189b0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
189c0 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
189d0 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20  pIndex, -1);.   
189e0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
189f0 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
18a00 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
18a10 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c  all tables in al
18a20 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72  l databases wher
18a30 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73  e the.** indices
18a40 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69   use the collati
18a50 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
18a60 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20  l.  If pColl==0 
18a70 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a  then recompute.*
18a80 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76  * all indices ev
18a90 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66  erywhere..*/.#if
18aa0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18ab0 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
18ac0 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61  void reindexData
18ad0 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61  bases(Parse *pPa
18ae0 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20  rse, char const 
18af0 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70  *zColl){.  Db *p
18b00 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
18b10 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
18b20 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
18b30 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
18b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18b50 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
18b60 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  ex number */.  s
18b70 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
18b80 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68  rse->db;   /* Th
18b90 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
18ba0 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45  ction */.  HashE
18bb0 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20  lem *k;         
18bc0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
18bd0 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65  oping over table
18be0 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61  s in pDb */.  Ta
18bf0 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
18c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
18c10 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
18c20 62 61 73 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  base */..  for(i
18c30 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44  Db=0, pDb=db->aD
18c40 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  b; iDb<db->nDb; 
18c50 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20  iDb++, pDb++){. 
18c60 20 20 20 61 73 73 65 72 74 28 20 70 44 62 21 3d     assert( pDb!=
18c70 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73  0 );.    for(k=s
18c80 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
18c90 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
18ca0 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71  lHash);  k; k=sq
18cb0 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29  liteHashNext(k))
18cc0 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28  {.      pTab = (
18cd0 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73  Table*)sqliteHas
18ce0 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20  hData(k);.      
18cf0 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61  reindexTable(pPa
18d00 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c  rse, pTab, zColl
18d10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
18d20 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
18d30 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
18d40 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61  he REINDEX comma
18d50 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  nd..**.**       
18d60 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20   REINDEX        
18d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d80 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20      -- 1.**     
18d90 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c     REINDEX  <col
18da0 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20  lation>         
18db0 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20        -- 2.**   
18dc0 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c       REINDEX  ?<
18dd0 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c  database>.?<tabl
18de0 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20  ename>  -- 3.** 
18df0 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
18e00 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e  ?<database>.?<in
18e10 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a  dexname>  -- 4.*
18e20 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73  *.** Form 1 caus
18e30 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69  es all indices i
18e40 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  n all attached d
18e50 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 72  atabases to be r
18e60 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20  ebuilt..** Form 
18e70 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69  2 rebuilds all i
18e80 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61  ndices in all da
18e90 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73 65  tabases that use
18ea0 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f   the named.** co
18eb0 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
18ec0 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34  .  Forms 3 and 4
18ed0 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d   rebuild the nam
18ee0 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a  ed index or all.
18ef0 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63  ** indices assoc
18f00 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  iated with the n
18f10 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23  amed table..*/.#
18f20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18f30 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20  IT_REINDEX.void 
18f40 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50  sqlite3Reindex(P
18f50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
18f60 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b  ken *pName1, Tok
18f70 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43  en *pName2){.  C
18f80 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
18f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
18fa0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
18fb0 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
18fc0 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
18fd0 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20  har *z;         
18fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
18ff0 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  me of a table or
19000 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73   index */.  cons
19010 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20  t char *zDb;    
19020 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
19030 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19040 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
19050 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19060 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
19070 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
19080 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
19090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
190a0 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
190b0 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
190c0 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
190d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
190e0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69  * The database i
190f0 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
19100 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
19110 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
19120 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
19130 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b  nection */.  Tok
19140 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20  en *pObjName;   
19150 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
19160 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
19170 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69   index to be rei
19180 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  ndexed */..  /* 
19190 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  Read the databas
191a0 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20  e schema. If an 
191b0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65  error occurs, le
191c0 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
191d0 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f  sage.  ** and co
191e0 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  de in pParse and
191f0 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f   return NULL. */
19200 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
19210 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
19220 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
19230 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
19240 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20    if( pName1==0 
19250 7c 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 20  || pName1->z==0 
19260 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61  ){.    reindexDa
19270 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20  tabases(pParse, 
19280 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  0);.    return;.
19290 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d    }else if( pNam
192a0 65 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 32 2d  e2==0 || pName2-
192b0 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  >z==0 ){.    ass
192c0 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29  ert( pName1->z )
192d0 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
192e0 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
192f0 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 28 63  (db, ENC(db), (c
19300 68 61 72 2a 29 70 4e 61 6d 65 31 2d 3e 7a 2c 20  har*)pName1->z, 
19310 70 4e 61 6d 65 31 2d 3e 6e 2c 20 30 29 3b 0a 20  pName1->n, 0);. 
19320 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
19330 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
19340 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  l = sqliteStrNDu
19350 70 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  p((const char *)
19360 70 4e 61 6d 65 31 2d 3e 7a 2c 20 70 4e 61 6d 65  pName1->z, pName
19370 31 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  1->n);.      if(
19380 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   zColl ){.      
19390 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73    reindexDatabas
193a0 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  es(pParse, zColl
193b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
193c0 65 46 72 65 65 28 7a 43 6f 6c 6c 29 3b 0a 20 20  eFree(zColl);.  
193d0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
193e0 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
193f0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
19400 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
19410 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
19420 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69   &pObjName);.  i
19430 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
19440 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  n;.  z = sqlite3
19450 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4f  NameFromToken(pO
19460 62 6a 4e 61 6d 65 29 3b 0a 20 20 7a 44 62 20 3d  bjName);.  zDb =
19470 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
19480 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ame;.  pTab = sq
19490 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
194a0 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66  b, z, zDb);.  if
194b0 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65  ( pTab ){.    re
194c0 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
194d0 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20  e, pTab, 0);.   
194e0 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a   sqliteFree(z);.
194f0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
19500 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
19510 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
19520 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74  z, zDb);.  sqlit
19530 65 46 72 65 65 28 7a 29 3b 0a 20 20 69 66 28 20  eFree(z);.  if( 
19540 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71  pIndex ){.    sq
19550 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
19560 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
19570 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   0, iDb);.    sq
19580 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
19590 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
195a0 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
195b0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
195c0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
195d0 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74  "unable to ident
195e0 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74  ify the object t
195f0 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 22 29  o be reindexed")
19600 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
19610 2a 20 52 65 74 75 72 6e 20 61 20 64 79 6e 61 6d  * Return a dynam
19620 69 63 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 4b  icly allocated K
19630 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
19640 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
19650 64 0a 2a 2a 20 77 69 74 68 20 4f 50 5f 4f 70 65  d.** with OP_Ope
19660 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e  nRead or OP_Open
19670 57 72 69 74 65 20 74 6f 20 61 63 63 65 73 73 20  Write to access 
19680 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 70  database index p
19690 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  Idx..**.** If su
196a0 63 63 65 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e  ccessful, a poin
196b0 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 73  ter to the new s
196c0 74 72 75 63 74 75 72 65 20 69 73 20 72 65 74 75  tructure is retu
196d0 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rned. In this ca
196e0 73 65 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  se.** the caller
196f0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
19700 66 6f 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  for calling sqli
19710 74 65 46 72 65 65 28 29 20 6f 6e 20 74 68 65 20  teFree() on the 
19720 72 65 74 75 72 6e 65 64 20 0a 2a 2a 20 70 6f 69  returned .** poi
19730 6e 74 65 72 2e 20 49 66 20 61 6e 20 65 72 72 6f  nter. If an erro
19740 72 20 6f 63 63 75 72 73 20 28 6f 75 74 20 6f 66  r occurs (out of
19750 20 6d 65 6d 6f 72 79 20 6f 72 20 6d 69 73 73 69   memory or missi
19760 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 2a 2a  ng collation .**
19770 20 73 65 71 75 65 6e 63 65 29 2c 20 4e 55 4c 4c   sequence), NULL
19780 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
19790 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 70 50   the state of pP
197a0 61 72 73 65 20 75 70 64 61 74 65 64 20 74 6f 20  arse updated to 
197b0 72 65 66 6c 65 63 74 0a 2a 2a 20 74 68 65 20 65  reflect.** the e
197c0 72 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f  rror..*/.KeyInfo
197d0 20 2a 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65   *sqlite3IndexKe
197e0 79 69 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  yinfo(Parse *pPa
197f0 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  rse, Index *pIdx
19800 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
19810 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e  t nCol = pIdx->n
19820 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 42  Column;.  int nB
19830 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 4b 65  ytes = sizeof(Ke
19840 79 49 6e 66 6f 29 20 2b 20 28 6e 43 6f 6c 2d 31  yInfo) + (nCol-1
19850 29 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  )*sizeof(CollSeq
19860 2a 29 20 2b 20 6e 43 6f 6c 3b 0a 20 20 4b 65 79  *) + nCol;.  Key
19870 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b 65  Info *pKey = (Ke
19880 79 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65 4d 61  yInfo *)sqliteMa
19890 6c 6c 6f 63 28 6e 42 79 74 65 73 29 3b 0a 0a 20  lloc(nBytes);.. 
198a0 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
198b0 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65   pKey->aSortOrde
198c0 72 20 3d 20 28 75 38 20 2a 29 26 28 70 4b 65 79  r = (u8 *)&(pKey
198d0 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a  ->aColl[nCol]);.
198e0 20 20 20 20 61 73 73 65 72 74 28 20 26 70 4b 65      assert( &pKe
198f0 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43  y->aSortOrder[nC
19900 6f 6c 5d 3d 3d 26 28 28 28 75 38 20 2a 29 70 4b  ol]==&(((u8 *)pK
19910 65 79 29 5b 6e 42 79 74 65 73 5d 29 20 29 3b 0a  ey)[nBytes]) );.
19920 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
19930 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
19940 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
19950 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  Idx->azColl[i];.
19960 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 43        assert( zC
19970 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 4b 65  oll );.      pKe
19980 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  y->aColl[i] = sq
19990 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
199a0 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  eq(pParse, zColl
199b0 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 70 4b 65  , -1);.      pKe
199c0 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  y->aSortOrder[i]
199d0 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72   = pIdx->aSortOr
199e0 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  der[i];.    }.  
199f0 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 3d    pKey->nField =
19a00 20 6e 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66   nCol;.  }..  if
19a10 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
19a20 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
19a30 28 70 4b 65 79 29 3b 0a 20 20 20 20 70 4b 65 79  (pKey);.    pKey
19a40 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
19a50 72 6e 20 70 4b 65 79 3b 0a 7d 0a                 rn pKey;.}.